通过运动和旋转同步的脚本,我们可以发现,每一个固定的时间段里,即使Player本身没有位移,也会运行一次CmdProvidePositionToServer函数,这样的代码效率不够高,于是我们将两个同步的脚本做了一些修改。
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_SyncPosition : NetworkBehaviour {
[SyncVar]private Vector3 syncPos;
[SerializeField]Transform myTransform;
[SerializeField]float lerpRate = 15;
private Vector3 lastPos;
private float threshold = 0.5f;
void FixedUpdate()
{
TransformPosition();
LerpPosition();
}
void LerpPosition()
{
if (!isLocalPlayer)
{
myTransform.position = Vector3.Lerp(myTransform.position, syncPos, Time.deltaTime * lerpRate);
}
}
[Command]
void CmdProvidePositionToServer(Vector3 pos)
{
syncPos = pos;
}
[ClientCallback]
void TransformPosition()
{
if (isLocalPlayer&&Vector3.Distance(myTransform.position,lastPos)>threshold)
{
CmdProvidePositionToServer(myTransform.position);
lastPos = myTransform.position;
}
}
}
using UnityEngine;
using System.Collections;
using UnityEngine.Networking;
public class Player_SyncRotation : NetworkBehaviour {
[SyncVar]private Quaternion syncPlayerRotation;
[SyncVar]private Quaternion syncCamRotation;
[SerializeField]private Transform playerTransform;
[SerializeField]private Transform camTransform;
[SerializeField]private float lerpRate=15;
private Quaternion lastPlayerRot;
private Quaternion lastCamRot;
private float threshold = 5;
// Use this for initialization
void Start () {
}
// Update is called once per frame
void FixedUpdate ()
{
TransmitRotations();
LerpRotations();
}
void LerpRotations()
{
if (!isLocalPlayer)
{
playerTransform.rotation = Quaternion.Lerp(playerTransform.rotation, syncPlayerRotation, Time.deltaTime * lerpRate);
camTransform.rotation = Quaternion.Lerp(camTransform.rotation, syncCamRotation, Time.deltaTime * lerpRate);
}
}
[Command]
void CmdProvideRotationToServer(Quaternion playerRot, Quaternion camRot)
{
syncPlayerRotation = playerRot;
syncCamRotation = camRot;
}
[Client]
void TransmitRotations()
{
if (isLocalPlayer)
{
if(Quaternion.Angle(playerTransform.rotation,lastPlayerRot)>threshold||Quaternion.Angle(camTransform.rotation,lastCamRot)>threshold)
{
CmdProvideRotationToServer(playerTransform.rotation, camTransform.rotation);
lastPlayerRot = playerTransform.rotation;
lastCamRot = camTransform.rotation;
}
}
}
}
计算当前的position和rotation与上一次的是否有发生一定的变换,若有则调用CmdProvidePositionToServer函数,若没有则不执行,使得代码的效率更高一些。