public void ClientTransformPredict(MsgSyncTransform msg) { float halfRTT = NetworkClientMgr.Timer.GetHalfRTT(); msg.pos += (msg.velocity * halfRTT); float predictInterval = halfRTT + 0.5f; targetPos = msg.pos + (msg.velocity * predictInterval); clientPos = transform.position; serverPos = msg.pos; Vector3 csDelta = serverPos - clientPos; Vector3 csDeltaVelocity = Vector3.zero; if(Mathf.Abs(csDelta.x) > EPS_CS_DELTA_POS.x || Mathf.Abs(csDelta.y) > EPS_CS_DELTA_POS.y || Mathf.Abs(csDelta.z) > EPS_CS_DELTA_POS.z) { //transform.position = serverPos; //Debug.Log("Reset " + clientPos + " to " + serverPos); } csDeltaVelocity = csDelta / predictInterval; clientPos = transform.position; transform.rotation = msg.rot; mVelocity = (targetPos - clientPos) / predictInterval;// + csDeltaVelocity; }
public void GetTransformMsg(MsgSyncTransform msg) { msg.pos = transform.position; msg.rot = transform.rotation; msg.velocity = mVelocity; msg.timeStamp = NetworkServerMgr.Timer.GetServerTime(); }
public void ServerTransformPredict(MsgSyncTransform msg) { float halfRTT = NetworkServerMgr.Timer.GetHalfRTT(); if(halfRTT <= 0.01f) { halfRTT = 0.0f; transform.position = msg.pos; mVelocity = Vector3.zero; } else { transform.position = msg.pos; charCtrl.Move(msg.velocity * halfRTT); mVelocity = (transform.position - msg.pos) / halfRTT; msg.pos = transform.position; } transform.rotation = msg.rot; }
private void AddMsgSyncTransToCache(MsgSyncTransform msg) { bool isExist = false; for(int i = 0; i < mMsgSyncTransCache.Count; ++i) { MsgSyncTransform pMsg = mMsgSyncTransCache[i]; if(pMsg.netId == msg.netId) { isExist = true; mMsgSyncTransCache[i] = msg; return; } } if(!isExist) { mMsgSyncTransCache.Add(msg); } }
void SendTransform() { if(NetworkClientMgr.Client == null) { //TODO RECONNECT return; } if(mvCtrl == null) { mvCtrl = gameObject.AddComponent<MoveController>(); } MsgSyncTransform msg = new MsgSyncTransform(); msg.netId = netId; mvCtrl.GetTransform(out msg.pos, out msg.velocity, out msg.rot, out msg.timeStamp); NetworkClientMgr.Client.SendByChannel(MsgConsts.MSG_TRANSFORM_SYNC, msg, NetworkMgr.CHANNEL_UNRELIABLE); }