SynMove.cs
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class SynMove : NetworkBehaviour { //当 SyncVar 发生改变时,UNet 会从 Server 端向所有有效的 Client 端发送这些改变。注意这里的方向,是从 Server 到 Client ,而不是从 Client 到 Server 的方向。 [SyncVar] private Vector3 synPos; [SerializeField]Transform myTransform; [SerializeField]float lerpRate = 15; // Update is called once per frame void FixedUpdate () { TransmitPosition (); LerpPosition (); } void LerpPosition(){ //不是本地玩家 if (!isLocalPlayer) { //非本地玩家的位置进行更新 myTransform.position = Vector3.Lerp (myTransform.position,synPos,Time.deltaTime*lerpRate); } } [Command] //命令, 在客户端调用,但是在服务端运行,这是方法必须以 Cmd 开头 void CmdProvidePositionToServer(Vector3 pos){ //在服务器上为synPos 同步变量赋值 synPos = pos; } [ClientCallback] //只在客户端调用 void TransmitPosition(){ //是本地玩家 if (isLocalPlayer) { //就把本地玩家的位置传给服务器 CmdProvidePositionToServer (myTransform.position); } } }
PlayerController.cs
using UnityEngine; using System.Collections; using UnityEngine.Networking; public class PlayerController : NetworkBehaviour { // Update is called once per frame void Update () { //判断是不是本地玩家(自己只能控制自己的玩家,不能控制别人的玩家) if (isLocalPlayer == false) { return; } //获取键盘横轴的值 float h = Input.GetAxis ("Horizontal"); //获取键盘纵轴的值 float v = Input.GetAxis ("Vertical"); //主角左右移动 transform.Translate (Vector3.right*h*3*Time.deltaTime); //主角前后移动 transform.Translate (Vector3.forward*v*3*Time.deltaTime); } }