using System.Collections; using System.Collections.Generic; using UnityEngine; using System; using System.Linq; public class MyPlayer : MonoBehaviour { public static Dictionary players = new Dictionary(); public static MyPlayer Me; public ushort syncid; public bool isme; float posx, posy, posz, roty; //发送 byte[] data; //轴判断 byte zhouPanduandate; public bool ReadySend = false; private Animator animator; /// /// 格子编号 /// public byte[] cellNum = new byte[2]; public void Init(ushort id, bool isMe,byte[] myGrid) { this.syncid = id; this.isme = isMe; if (myGrid != null) { this.cellNum = myGrid; } data = new byte[23]; //type Array.Copy(BitConverter.GetBytes(1000), 0, data, 0, 4); //id Array.Copy(BitConverter.GetBytes(syncid), 0, data, 4, 2); players.Add(syncid, this); //初始化 posx = transform.position.x; posy = transform.position.y; posz = transform.position.z; roty = transform.eulerAngles.y; animator = GetComponent(); TextMesh textMesh = transform.Find("MyId").GetComponent(); textMesh.text = syncid.ToString(); if(isMe) textMesh.color = Color.green; } float time = 0; float gridTimer = 0; //根据格子更新周围玩家 void LateUpdate() { #region //if (isme) //{ // if (ReadySend) // { // CheckTransfrom(); // //发送格子数据 // gridTimer += Time.deltaTime; // if (gridTimer > 1) // { // gridTimer = 0; // if (IsArrayEqual(GameManager.Instance.JiugongGridSegmentation.CenterIndex, cellNum)) // { // CopyArray(GameManager.Instance.JiugongGridSegmentation.CenterIndex, cellNum); // SendCellChange(cellNum); // } // foreach (var item in players) // { // int xsub = Mathf.Abs(Me.cellNum[0] - item.Value.cellNum[0]); // int zsub = Mathf.Abs(Me.cellNum[1] - item.Value.cellNum[1]); // GameManager.Instance.DisplayPlayer(item.Value, xsub <= 1 && zsub <= 1); // } // } // //if (sendTimeTTTTT.Equals(0)) // //{ // // //如果未在提交数据 // // fixedUpdateTime += Time.deltaTime; // // if (fixedUpdateTime > 5) // // { // // fixedUpdateTime = 0; // // dataUpdated = true; // // //提交数据 // // } // //} // } //} //else //{ // SetMove(); //} ////记录一秒发送次数 //time += Time.deltaTime; //if (time >= 1) //{ // time = 0; // fixedUpdateTime = 0; // Debug.Log("1秒发送位置次数:" + sendTimeTTTTT); // sendTimeTTTTT = 0; //} #endregion } void FixedUpdate() { if (isme) { if (ReadySend&&!GameManager.GodMode) { CheckTransfrom(); //发送格子数据 gridTimer += Time.fixedDeltaTime; if (gridTimer > 1) { gridTimer = 0; //判断格子并发送格子数据 if (IsArrayEqual(GameManager.Instance.JiugongGridSegmentation.CurrentIndex, cellNum)) { CopyArray(GameManager.Instance.JiugongGridSegmentation.CurrentIndex, cellNum); SendCellChange(cellNum); } //根据九宫格显示隐藏其他玩家 foreach (var item in players) { int xsub = Mathf.Abs(Me.cellNum[0] - item.Value.cellNum[0]); int zsub = Mathf.Abs(Me.cellNum[1] - item.Value.cellNum[1]); GameManager.Instance.DisplayPlayer(item.Value, xsub <= 1 && zsub <= 1); } } } } else { SetMove(); } //记录一秒发送次数 time += Time.fixedDeltaTime; if (time >= 1) { time = 0; Debug.Log("1秒发送位置次数:" + sendTimeTTTTT); sendTimeTTTTT = 0; } } int sendTimeTTTTT = 0; private void SendSync() { //类型 data[6] = zhouPanduandate; int index = 7; // if (zhouPanduandate<<7 !=0) { //pos Array.Copy(BitConverter.GetBytes(lastPosx), 0, data, index, 4); index += 4; } var a=zhouPanduandate >> 1; if (a<<7 !=0) { Array.Copy(BitConverter.GetBytes(lastPosy), 0, data, index, 4); index += 4; } var b = zhouPanduandate >> 2; if (b<<7 != 0) { Array.Copy(BitConverter.GetBytes(lastPosz), 0, data, index, 4); index += 4; } var c = zhouPanduandate >> 3; if (c<<7 != 0) { //roation Array.Copy(BitConverter.GetBytes(lastRoty), 0, data, index, 4); index += 4; } WebSocketDemo.instance.SendByTrans(data); Debug.Log("发给trans"); sendTimeTTTTT++; } /// /// 发送全数据 /// public void SendSyncAnyWay() { zhouPanduandate = 15; SendSync(); Debug.Log("立即发送!!!!!!!"); } //记录上一次发送位置信息 float lastPosx; float lastPosy; float lastPosz; float lastRoty; float SyncRate = 0.2f; float timer = 0; /// /// me执行 /// private void CheckTransfrom() { timer += Time.fixedDeltaTime; if (timer > SyncRate) { timer = 0; Vector3 tmppos = transform.position; Vector3 tmprot = transform.localEulerAngles; if (Mathf.Abs(lastPosx - tmppos.x) > 0.05f) { //发送x lastPosx = tmppos.x; //0b00000001 zhouPanduandate |=1; } else { byte a= (byte)(~zhouPanduandate); a |= 1; zhouPanduandate = (byte)(~a); } if (Mathf.Abs(lastPosy - tmppos.y) > 0.05f) { //发送y lastPosy = tmppos.y; //0b00000010 zhouPanduandate |=2 ; } else { byte a = (byte)(~zhouPanduandate); a |= 2; zhouPanduandate = (byte)(~a); } if (Mathf.Abs(lastPosz - tmppos.z) > 0.05f) { //发送z lastPosz = tmppos.z; //0b00000100 zhouPanduandate |= 4; } else { byte a = (byte)(~zhouPanduandate); a |= 4; zhouPanduandate = (byte)(~a); } if (Mathf.Abs(lastRoty - tmprot.y) > 1) { //发送y lastRoty = tmprot.y; //0b00001000 zhouPanduandate |= 8; } else { byte a = (byte)(~zhouPanduandate); a |= 8; zhouPanduandate = (byte)(~a); } if (zhouPanduandate != 0) { this.SendSync(); } } } /// /// 他人执行 /// private void SetMove() { UpdateAni(); } public float dis; //int count = 0; //float localMoveSpeed; /// /// 步数系数 /// public static float MoveStepRatio = 0.25f; /// /// 动画系数 /// public static float AnimStepRatio = 1500; float once; Vector3 disPos = new Vector3(); Vector3 lastAnipos = new Vector3(); public void ChangeOnce() { disPos = new Vector3(posx, posy, posz); once = Vector3.Distance(disPos , transform.position)/ MoveStepRatio*Time.fixedDeltaTime; } public void UpdateAni() { //Vector3 targetPos = new Vector3(posx, posy, posz); Vector3 tmpangle = transform.localEulerAngles; tmpangle.y = roty; transform.localEulerAngles = tmpangle; transform.position = Vector3.MoveTowards(transform.position, disPos, once); #region // float distance = dis = Vector3.Distance(transform.position, targetPos); //float multi = 0.7f; //if (distance > 0.5f) //{ // multi = 1.5f; //} //if (count >= 5) //{ // transform.position = Vector3.Lerp(transform.position, targetPos, Time.deltaTime / distance * (GameManager.Instance.playerSyncSpeed + distance * 0.25f) * multi); //} //else //{ // transform.position = targetPos; //} //if (distance > 0) //{ // if (localMoveSpeed < 0.5f) // localMoveSpeed += Time.deltaTime * 0.5f; //} //else //{ // if (localMoveSpeed > 0) // localMoveSpeed -= Time.deltaTime * 0.5f; //} //float lms = localMoveSpeed + distance * 0.5f; //lms = Mathf.Clamp(lms, 0, 1); #endregion //float speed = Vector3.Distance(transform.position, lastAnipos) * AnimStepRatio * Time.deltaTime * GameManager.FrameRate / 90; float speed = Vector3.Distance(transform.position, lastAnipos) * AnimStepRatio * Time.fixedDeltaTime; //speed = Mathf.Clamp(speed, 0f, 0.5f); //限制只播放走的动画 lastAnipos = transform.position; animator.SetFloat("InputMagnitude", speed); } public void SetPx(float x) { posx = x; } public void SetPy(float y) { posy = y; } public void SetPz(float z) { posz = z; } public void SetRy(float ry) { roty = ry; } /// /// 发送格子更改 /// private void SendCellChange(byte[] cellNum) { //this.cellNum = cellNum; byte[] data = new byte[8]; Array.Copy(BitConverter.GetBytes(103), 0, data, 0, 4); Array.Copy(BitConverter.GetBytes(syncid), 0, data, 4, 2); data[6] = cellNum[0]; data[7] = cellNum[1]; WebSocketDemo.instance.SendByMain(data); Debug.Log("发送格子改变:" + cellNum[0] + "," + cellNum[1]); } /// /// 接收格子更改 /// /// public void OnCellChange(ushort id,byte[] cellNum) { if (players.ContainsKey(id)) { players[id].cellNum = cellNum; Debug.Log("别人格子改变:" + id + "----" + cellNum[0] + "," + cellNum[1]); } } /// /// 判断两个数组是否相等 /// /// /// /// private bool IsArrayEqual(byte[] a, byte[] b) { if (a.Length != b.Length) { return false; } for (int i = 0; i < a.Length; i++) { if (a[i] != b[i]) return true; } return false; } /// /// 复制数组 /// /// /// 被赋值的数组 private void CopyArray(byte[] source, byte[] target) { for (int i = 0; i < target.Length; i++) { target[i] = source[i]; } } /// /// 本地立即执行位置更新 /// public void SyncImmediately() { transform.position = new Vector3(posx, posy, posz); ChangeOnce(); } }