hand
_1_7_70
4
返回栏目
1k
0.2k
0.5k
0.1k
0k
0.2k
0k
0.7k
0k
0k
0.4k
0.1k
4k
0.2k
0.1k
2k
0.2k
0.2k
0k
0k
0.5k
0k
0.9k
0.1k
1k
0.9k
2k
1k
2k
0.9k
1k
0k
1k
0k
1k
1k
1k
1k
0k
1k
1k
1k
0k
3k
1k
0k
0.3k
1k
0.3k
0.9k
0k
8k
9k
6k
2k
1k
2k
1k
1k
2k
0.6k
1k
0.6k
1k
0.5k
0.2k
2k
2k
2k
1k
2k
0k
0.8k
0.8k
1k
0k
0k
0k
0k
0k
0k
0k
0k
0.3k
0.4k
0.8k
0.3k
5k
1k
3k
7k
6k
3k
3k
1k
0.2k
2k
3k
2k
0.4k
0.5k
3k
2k
7k
3k
4k
2k
1k
6k
6k
1k
1k
0.9k
0.2k
0.3k
0.9k
1k
0k
0.8k
2k
0k
0.4k
0.1k
1k
0.9k
0.2k
1k
1k
0.5k
0k
0k
0.4k
4k
0.4k
2k
3k
1k
1k
1k
3k
5k
0k
1k
2k
0.5k
0k
1k
0k
1k
0.5k
0.8k
返回Unity - 游戏引擎栏目
作者:
贺及楼
成为作者
更新日期:2024-06-06 19:36:53
作用:玩家的动态
本地: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 };
}
}
}
Unity - 游戏引擎
整章节共151节
快分享给你的小伙伴吧 ~