作用:玩家的动态
本地: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 initialization
void 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 };
}
}
}