欢迎大家继续学习 Unity 游戏编程进阶
[空白_录音] 本节我们介绍玩家动画和枪械的同步
本节采用 PPT
讲解加项目演示的方式,介绍玩家动画和枪械的同步相关的知识要点 在项目演示环节,我们演示了玩家动画和枪械同步在《慕课英雄
2》项目中的具体应用 希望大家可以根据自己的专业基础和学习能力,从以下三种方法中选择一种来学习
第一种方法,先看 PPT 讲解,对相关知识有一个系统的了解 然后观看项目演示视频,学习知识点的运用
第二种方法,先看项目演示视频,了解知识要点的具体应用,再回到 PPT 讲解阶段 有针对性地学习相关知识要点。
第三种方法,跳过 PPT 讲解,直接进入项目演示
通过理解项目中知识要点的运用,完成相关知识要点的学习 不需回顾 PPT 讲解。
下面进入 PPT 讲解阶段 游戏过程中
通过更改玩家对象的动画控制器参数,实现动画状态转移 完成玩家动画的切换。
创建玩家对象的客户端需要将 玩家动画参数以一定频率发送给其他客户端,其他客户端接收到动画参数后
在各自的场景中更新该玩家对象的动画参数 [空白_录音]
玩家动画状态的同步可以使用 OnPhotonSerializeView
函数来实现 该函数通过网络以一定频率发送游戏对象的动画参数
其他客户端接收到数据后,更改相应游戏对象的动画参数 Pun
包含了一个 PhotonAnimatorView
组件 它可以帮助开发者同步决策对象的动画状态 PhotonAnimatorView
组件自动访问游戏对象的 Animator 组件,将 Animator 组件的动画层与动画参数
显示在 PhotonAnimatorView 组件中,方便开发者设置动画参数的传递方式
下面介绍 PhotonAnimatorView
组件的添加过程 首先选中需要添加组件的游戏对象,点击
Component 菜单栏 选中 Photon Networking 中的
Photon Animator View,即可完成 Photon Animator View 组件的添加 下面介绍
Photon Animator View
组件 它包含动画层权重的同步和动画参数的同步
它提供了三种同步方式,分别为 Disabled、 Discrete 和 Continuous
其中,Disabled 表示不同步数据 Discrete
表示离散,它采用直接替换数据的方式完成同步 适用于 bool 和 Trigger 类型动画参数的同步。
Continuous 表示连续 是用差值的方式,平滑改变参数,适用于动画层权重、 int
和 float 类型动画参数的同步 [空白_录音]
在《慕课英雄 2》的项目中,我们不需要同步动画层权重 因此我们将
Layer 0 的同步方式设置为 Disabled,玩家的动画参数均为
bool 类型 我们将动画参数的传递方式设置为 Discrete 最后我们把
Photon Animator View 组件拖到 Photon View 组件的 Observed Components
的属性中 完成玩家动画状态的同步 本页
PPT 给出 当本地客户端的玩家对象将枪口朝向天空时
其他客户端如果无法同步玩家对象的枪械参数 玩家持枪姿势存在很大差异。
下面我们讲解如何实现玩家手中枪械位置与朝向的同步 首先,我们对比本地客户端
的玩家对象与其他客户端的玩家对象在结构方面的差异 本地客户端的
Gun 对象位于 Main Camera 下 Gun 对象跟随它的父对象
Main Camera 进行移动和旋转,因此 Gun 的局部坐标保持不变
Photon Transform View 同步的是游戏对象的局部坐标
枪械的位置与朝向采用游戏场景的全局坐标来描述 因此不能使用
Photon Transform View 组件对它们进行同步 在《慕课英雄 2》项目中,我们使用
OnSerializeView 函数 自己编写差值算法,实现枪械位置与朝向的同步
我们在 GunController
脚本中实现枪械位置与朝向的同步 首先定义私有变量
m_position 和 m_rotation 勇于接受枪械的位置和朝向数据。
定义私有变量 lerpSpeed 表现插值速度
[空白_录音] 在
OnPhotonSerializeView 函数中 我们实现枪械位置与朝向数据的发送和接收。
玩家对象的 owner 通过网络发送枪械的位置与朝向数据
其他客户端接收该枪械的位置与朝向数据 保存在私有变量 m_position
和 m_rotation 变量中 位置与朝向数据均采用全局坐标来描述
我们在 Update 函数中实现枪械位置与朝向的平滑同步
使用 PhotonView.isMine 判断是否为本地玩家
如果是本地玩家,无需同步枪械的位置与朝向 如果是其他客户端,使用
Lerp 函数 实现枪械从当前状态向目标状态的平滑过渡
最后,我们给 EthanPlayer 与
RobotPlayer 预制件的 Gun 子对象添加 Gun Controller 脚本与 Photon View 组件
将 Gun Controller 脚本添加到 Photon View 组件的 Observed Component
属性中 完成枪械位置与朝向的同步 下一节我们讲解玩家的射击逻辑
最后进入演示环节 演示环节的内容包括给玩家对象添加
PhotonAnimatorView 组件 实现玩家动画状态的同步,给玩家枪械绑定
GunController 脚本 实现枪械位置和朝向的同步