下面是演示环节 本节我们实现《慕课英雄
2》 网络版中 玩家动画和枪械的同步。
这里 我们已经在 Unity 编辑器中打开了《慕课英雄 2》的 Game Scene
场景 我们使用 PON 提供的 Photon Animator View 组件 实现玩家动画的同步。
我们给 Robot Player 和 Ethan Player 预制件添加 Photon Animator View
组件 [空白_录音] 我们将
layer0 的同步方式设置为 disabled 表示不同步
layer0 的动画层权重 player
的动画参数均为布尔类型 我们将动画参数的同步方式设为 discrete 表示离散。
我们把设置完成的 Photon Animator View
组件 拖入到 Photon View 的 Observed Components 属性中
[空白_录音] [空白_录音]
我们需要对 Robot Player 和 Ethan Player
都进行这样的设置 接着我们构建当前项目
[声响]
[空白_录音]
构建完毕后,我们在 Unity 编辑器中打开 Game Lobby
场景,预览游戏 登录并且创建一个游戏房间
接着启动刚才构建好的客户端程序
[空白_录音] 登录并进入游戏房间
点击准备按钮,然后开始游戏
游戏开始后,我们控制其中一个客户端的玩家对象
并在另一个客户端中查看它的动画播放情况
[空白_录音] 我们发现玩家动画已经正确同步
但是当玩家的视角向上或者向下移动时 另一个客户端的玩家对象并没有做出相同的动作
这里的原因是玩家的枪械对象并没有 同步,而玩家对象的头部使用
IK 脚本控制 会根据枪械的位置与朝向发生变化
这里我们使用序列化的方法传输玩家枪械的位置和朝向数据
实现玩家枪械的同步。
下面我们停止游戏的运行和预览 我们在
Robot Player 预制件中 为其中的 Gun
机枪模型添加 gun controller 脚本和 photon
view 组件 [空白_录音]
接着我们把 Gun Controller
脚本添加到 枪械的 Photon View 的 Observed Components
属性中 接着我们为 Ethan Player 进行相同的设置
[空白_录音] [空白_录音]
[空白_录音]
然后我们构建当前项目
[声响] [声响]
[空白_录音] 构建完毕后,我们在
Unity 编辑器中预览游戏 登录并创建一个游戏房间
接着,我们启动一个客户端程序
[空白_录音]
登录并进入游戏房间
点击准备按钮然后开始游戏 [空白_录音]
这里我们控制其中一个客户端的玩家对象 在另一个客户端中观察这个玩家对象的运动情况
[空白_录音] 在这次测试中我们发现
远端玩家对象的枪械位置和朝向信息均得到了同步
与此同时,玩家对象的头部和双手的 IK
动画 也能正确的同步。
下面 我们结束游戏的运行和预览
双击打开 Gun Controller 脚本
我们讲解枪械同步的具体实现方法 在
Gun Controller 脚本中 我们定义了 m_position
和 m_rotation 字段 用于保存接收到的枪械位置和朝向数据
字段 lerpspeed 表示内插的速度
在 start 函数中我们初始化 m_position 和
m_rotation 为当前枪械的位置和朝向
在 OnPhotonSerializedView 函数中
我们实现数据的发送与接收 我们使用 stream.isWriting
来判断客户端是发送数据还是接收数据 如果客户端是枪械对象的
owner 那么 isWriting 属性为 True 我们使用
stream.SendNext 函数 依次发送当前枪械的位置和朝向
如果客户端不是枪械对象的 owner 那么 isWriting
属性为 False 我们使用 Stream.ReceiveNext
函数 依次接收远端发送来的枪械位置和朝向
这里需要注意 使用
OnPhotonSerializedView 函数发送和接收数据时
发送的顺序与接收的顺序应当保持一致 接收到的数据类型为
object 因此我们需要对数据类型进行一个转换
在 update 函数中
如果枪械对象不属于本地客户端 我们使用
lerp 函数实现枪械位置和朝向的平滑同步 最后返回 Unity
编辑器 我们保存游戏场景
以上就是本节演示的全部内容