
作用:玩家的动态
本地:C#控制方向、区分自己、别人
联网:客户端—>服务器。双向。Operation。同步位置方法
联网:服务器—>客户端。双向。Operation。其他玩家
联网:—>客户端。单向。Event。新来的玩家
联网:—>客户端。单向。Event。新来的位置数据
using System.Collections;using System.Collections.Generic;using UnityEngine;using Common;using Common.Tools;public class Player : MonoBehaviour {public bool isLocalPlayer = true;//房主public string username;//判断属于哪个用户public GameObject playerPrefab;public GameObject player;private Rigidbody playerRb;private SyncPositionRequest syncPosRequest;private SyncPlayerRequest syncPlayerRequest;//玩家信息private Vector3 lastPosition = Vector3.zero;//前一帧的位置private float moveOffset = 0.01f;//频率public float JumpSpeed = 0.1f;//跳跃高度private Dictionary<string, GameObject> playerDict = new Dictionary<string, GameObject>();// Use this for initializationvoid Start () {player.GetComponent<Renderer>().material.color = Color.blue;//紫色是本地用户syncPosRequest = GetComponent<SyncPositionRequest>();syncPlayerRequest = GetComponent<SyncPlayerRequest>();//获取其他玩家信息playerRb = player.GetComponent<Rigidbody>();//获得Rigidbody属性syncPlayerRequest.DefaultRequest();//向服务器请求其他玩家InvokeRepeating("SyncPosition", 3, 0.02f);//重复调用某个方法,3秒后开始进行同步,同步速率:1秒同步10次写0.1f,一般10-20次}//客户端-->服务器。双向。Operation。同步位置方法void SyncPosition(){//判断有没有移动,没有的话就不管了,节约性能if (Vector3.Distance(player.transform.position, lastPosition) > moveOffset){lastPosition = player.transform.position;//更新这一帧的位置syncPosRequest.pos = player.transform.position;//新位置信息syncPosRequest.DefaultRequest();//请求同步位置}}// Update本地操作void Update () {if (Input.GetKeyDown(KeyCode.Space)) //按下空格就跳跃{playerRb.AddForce(JumpSpeed * Vector3.up);}//角色移动float h = Input.GetAxis("Horizontal");float v = Input.GetAxis("Vertical");float height = player.transform.position.y / 100;//获得高度player.transform.Translate(new Vector3(h, height, v) * Time.deltaTime * 4);}//服务器-->客户端。双向。Operation。其他玩家public void OnSyncPlayerResponse(List<string> usernameList){//创建其他客户端的Player角色foreach (string username in usernameList){OnNewPlayerEvent(username);}}//-->客户端。单向。Event。新来的玩家public void OnNewPlayerEvent(string username){GameObject go = GameObject.Instantiate(playerPrefab);playerDict.Add(username, go);}//-->客户端。单向。Event。新来的位置数据public void OnSyncPositionEvent(List<PlayerData> playerDataList){foreach (PlayerData pd in playerDataList){GameObject go= DictTool.GetValue<string, GameObject>(playerDict, pd.Username);if(go!=null)go.transform.position = new Vector3() {x=pd.Pos.x,y = pd.Pos.y,z=pd.Pos.z };}}}