예제 #1
0
        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;
        }
예제 #2
0
 public void GetTransformMsg(MsgSyncTransform msg)
 {
     msg.pos = transform.position;
     msg.rot = transform.rotation;
     msg.velocity = mVelocity;
     msg.timeStamp = NetworkServerMgr.Timer.GetServerTime();
 }
예제 #3
0
        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;
        }
예제 #4
0
        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);
            }
        }
예제 #5
0
        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);
        }