1.Show Request.cs作用是发送给客户端自己的id

2.PlayerMagener.cs来管理所有的Player
其中Add方法,可以将玩家添加到玩家字典里面,以及有显示自己的请求。
这边的显示自己的功能由PlayerController.cs里面刚开始就直接加进去。


3.服务端处理Show的请求,ShowHandler.cs:拿到id,并且Event推送给其他的所有客户端。

4.客户端处理Show的Event,PhontonEngine.cs中:拿到新加入的玩家的id,并且调用ShowOther方法。

其中ShowOther方法在PlayerManager中,通过instantiate实例化的方式生成,并且将新显示出来的玩家加入到玩家字典中。

到此为止,就完成了能看到其他玩家的功能了
———————————————————————————————————————————
接着是移动:
1.MoveRequest是发送给客户端自己实时的坐标,通过PlayerManeger的GetMe方法去拿。

2.在FixUpdate里面,不断调用MoveRequest,不断的发送自己的坐标。
而下面的Update里面是一个控制自己移动的方法

3.服务端MoveHandler.cs:拿到准备移动的物体的位置和他的id。然后Event事件发送给其他的所有客户端,发送将要移动的物体的位置和id。

4.服务端处理Move的Event:拿到xyz和id,放在intValue里面,调用PlayerManeger的MoveOther方法,去更新刚才Move的物体的坐标。(因为Move的Request是每隔0.02s发一次的,因为放在FixUpdate里面了嘛,所以对坐标更新的情况也是0.02s更新一次,如果再短一点,我觉得这个就是帧同步了吧(大概或许hhhh)

PlayerManeger里面的MoveOther方法:通过id拿到字典里面的玩家,然后直接更新其坐标。

PlayerManager的好处:将player都管理起来了,有一个字典来存储所有的Player。一个Add方法来添加Player,并且如果me为null就显示自己。一个GetMe方法来获取自己。一个ShoweOtherPlayer来显示其他玩家。一个MoveOtherPlayer方法来显示其他玩家的移动。
_____________________________________________________________________________
最后附上这几个类的完整代码:
(如果配置文件你们也要的话,从我前面的文章里面找就行了。)
客户端
ShowRequest.cs:
using System.Collections;
using System.Collections.Generic;
using Common;
using ExitGames.Client.Photon;
using UnityEngine;
public class ShowRequest : Request
{
public override void DefaultRequest()
{
//构造参数
var data = new Dictionary<byte, object>();
//构造参数
data.Add((byte)ParaCode.Show, PlayerManager.Instance.GetMe().id);
//发送
PhotonEngine.peer.OpCustom((byte)OpCode, data, true);
}
public override void OnOprationRespionse(OperationResponse operationResponse)
{
if (operationResponse.ReturnCode == (byte)ReturnCode.Success)
{
Debug.Log("Show成功");
}
else
{
Debug.Log("Show失败");
}
}
}
MoveRequest.cs
using System.Collections;
using System.Collections.Generic;
using Common;
using ExitGames.Client.Photon;
usin

本文介绍了一种多人在线游戏中的玩家同步方案,包括玩家显示与移动的处理流程。客户端通过发送请求来展示自身并实时更新位置,服务器接收这些请求并广播给其他客户端。
最低0.47元/天 解锁文章
5189

被折叠的 条评论
为什么被折叠?



