实现多人场景活动网络通信详解
1. 准备通信连接对象和脚本
首先,要准备用于客户端(client)和服务器(server)通信的连接对象和脚本。可以将这些功能集成在同一个程序中,通过点击不同的按钮来决定该程序充当客户端还是服务器。
2. 服务器与客户端角色创建
服务器的主要功能是提供一个连接场所,无需控制人物。当客户端连入服务器后,需要为每个客户端创建一个新角色。
可以将玩家作为预制体(prefab),创建另一个对象 SpawnPlayer
,并附加脚本 Spawnscript.js
。该脚本用于监控客户端连接到服务器的事件 OnConnectedToServer
,此事件仅会在客户端触发。当该事件触发时,会在场景中使用角色的预制体创建一个新实例,并且让所有客户端的场景中都创建该实例。这需要使用 Network.Instantiate
方法,该方法会根据参数中给出的预制体在所有客户端场景的指定位置创建一个实例,其底层实际上封装了远程过程调用(RPC)。
3. 客户端镜头追踪
玩家本身会附带控制脚本,但客户端需要进行镜头追踪。由于玩家是动态生成的,在开始时,相机(Camera)上的追踪脚本的追踪目标并未绑定到玩家,因此需要进行这一步操作。同时,要确保绑定的对象是自己客户端所对应的人物,而非其他客户端的人物。
可以在调用 Network.Instantiate
时保存自己创建的人物,然后将相机脚本的 target
属性赋值为该人物。从一个对象获取其脚本的方法是使用 GameObject.GetComponent(Type type)
函数,参数需要传入脚本的类名。在 Unity 中,类名与脚本文件名的前缀相同,例如 SmoothFollow.js
对应的类名就是 SmoothFollow
。
4. 增加 NetworkView 组件
需要为人物的预制体添加 NetworkView
组件。因为既需要同步人物的变换(Transform)信息,也需要同步动画(Animation),所以要添加 2 个 NetworkView
组件。这里决定使用状态同步机制(也可以使用 RPC),因此需要设置相关的状态同步属性。
5. 人物角色控制的特殊处理
每个创建出来的角色都有相同的控制脚本,但一个客户端只能控制自己的人物。在进行控制响应之前,需要先确定该人物是否为自己的人物,只有确定是自己的人物才可以进行操作。
可以使用人物身上的 networkView
的类方法 isMine
来进行判断。只有创建该人物的客户端,其 isMine
属性才会为 true
。因此,在控制人物位移、跳跃、动画之前,若该属性不为 true
,则直接返回(return
)即可。