【UNET自学日志】Part3 变得更有效率一点

通过运动和旋转同步的脚本,我们可以发现,每一个固定的时间段里,即使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函数,若没有则不执行,使得代码的效率更高一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值