unity——角色控制以及网络组件

来源:互联网 发布:记账app 知乎 编辑:程序博客网 时间:2024/05/23 21:38

角色通过WSAD来控制移动,主要是通过获取X,Z轴上的输入值之后,进行旋转和移动的运算

using UnityEngine;using System.Collections;using UnityEngine.Networking;public class playercontrol : NetworkBehaviour {    public float moveSpeed;//移动速度    public float rotateSpeed;//旋转速度    void Update () {        if(!isLocalPlayer)        return;        Vector3 forward= new Vector3(Input.GetAxis("Horizontal"),0,Input.GetAxis("Vertical"));//设定获得水平和垂直方向上的值        Vector3 forwardPoint = transform.position + forward;        float inputMotionValues = Mathf.Max (Mathf.Abs (forward.x), Mathf.Abs (forward.z));//取得X与Y之间最大的一个值        if (inputMotionValues > 0) {//如果有移动输入            Quaternion lookRot = Quaternion.LookRotation (forward);//看向的方向            transform.rotation = Quaternion.Slerp (transform.rotation, lookRot, rotateSpeed * inputMotionValues * Time.deltaTime);//物体旋转到目标方向上,第三个参数是速度            transform.Translate(Vector3.forward * inputMotionValues * moveSpeed * Time.deltaTime);//设定物体移动的距离        }    }}

网络组件要多导入一个Networking包,并改变继承关系,NetworkBehaviour会多些方法或变量。原理是因为Unity自带的组件用于网络帧数会变得很慢,所以用插值运算来模拟物体运动的动画,这样肉眼基本是看不出来的可以达到目的,通过调用服务器函数来向服务器端发送自己的位置,而且获得服务器端的非本机玩家位置并在本地更新。这样就实现了服务器端与客户端操作的同步。

using UnityEngine;using System.Collections;using UnityEngine.Networking;public class NetworkSync : NetworkBehaviour {    public float lerpSpeed;//更新速度    [SyncVar] Vector3 serverSidePosition=Vector3.zero;//服务器上的位置    [SyncVar] Quaternion serverSideRotation;//服务器上的旋转量    void FixedUpdate () {        if (isLocalPlayer) {//判断是本机上的玩家            CmdsendToServer (transform.position,transform.rotation);//向服务器发送自己的位置        } else {            lerpPositon ();//插值运算,更新非本机玩家的位置        }    }    [Command] void CmdsendToServer(Vector3 position,Quaternion rotation)//服务器专用函数,以Cmd开头    {        serverSidePosition = position;        serverSideRotation = rotation;//向服务器端发送自己的位置和旋转量    }    void lerpPositon(){        transform.position = Vector3.Lerp (transform.position, serverSidePosition,lerpSpeed*Time.fixedDeltaTime);        transform.rotation = Quaternion.Slerp(transform.rotation, serverSideRotation,lerpSpeed*Time.fixedDeltaTime);        //非本机玩家更新在本机上的位置和旋转量    }}
0 0