欢迎大家继续学习《Unity 游戏编程进阶》 本节我们介绍
如何在网络游戏的多个客户端之间实现玩家位置和朝向的同步 本节将采用
PPT 讲解+项目演示的方式介绍玩家位置和朝向的同步 有关的知识要点。
在项目演示环节,我们演示了玩家位置和朝向的同步在《慕课英雄 2》项目中的具体应用
希望大家可以根据自己的专业基础和学习能力,从以下三种方法中选择一种来学习 第一种方法,先看
PPT 讲解,对相关知识有一个系统的了解,然后观看项目演示视频,学习知识点的运用
第二种方法,先看项目演示视频,了解知识要点的具体运用,再回到PPT讲解阶段
有针对性地学习相关知识要点。
第三种方法,跳过PPT讲解,直接进入项目演示
通过理解项目的知识要点的运用,完成相关知识要点的学习,不需回顾PPT讲解 下面进入PPT讲解阶段。
对于网络游戏 只有创建玩家对象的客户端,可以使用输入设备直接控制玩家对象的移动
其他客户端只能通过网络获得玩家对象的位置和朝向信息
创建玩家对象的客户端将该玩家对象的位置和朝向信息通过网络发送给其他客户端
其他客户端接收到信息后,在各自的游戏场景中更新玩家对象的位置和朝向信息
在多个客户端之间
同步玩家位置和朝向信息,有以下三种方法 第一种方法,将玩家对象的
Transform 组件 添加到 PhotonView 组件的 Observed Components 属性中 实现玩家位置和朝向的同步。
使用这种方法 将导致玩家对象在其他客户端的游戏场景中运动不连续 如本节PPT所示,某个客户端
红色的本地对象绘制频率高,运动平滑 蓝色的网络对象跟进频率低,未使用插值算法,运动不连续
[空白_音频] 第二种方法,使用
OnPhotonSerializeView 函数 它以一定频率传输玩家的位置和朝向信息。
接收到玩家的位置和朝向信息后 需要开发者实现插值算法来代替直接更新属性的方法
保证远端玩家对象的"平滑"移动 第三种方法,使用 PUN
提供的 PhotonTransformView 组件 实现玩家位置与朝向的同步。
PhotonTransformView 组件内 设置了几种插值算法,开发者不需要自己编写插值算法 即可实现玩家的平滑移动。
在《慕课英雄 2》的项目中,我们使用 PhotonTransformView
组件 实现网络游戏客户端之间玩家对象的位置与朝向的同步
下面我们介绍如何给玩家对象预置键添加 PhotonTransformView
组件 选中玩家对象预制件后,点击 Component 菜单,选择 Photon Networking
下面的 Photon Transform View 即可完成 Photon Transform View
组件的添加 下面我们介绍 Photon Transform View 组件的属性设置 在
Photon Transform View 组件中,我们可以控制 Transform 组件的 Position、 Rotation、 Scale
属性是否进行网络同步 勾选 Synchronize Position 属性,表示同步游戏对象的 Position
属性 它可以设置具体的同步方式,首先是 Teleport
选项 当网络较差时,接收远端玩家对象的位置信息会有很大的延迟
如果接收到的远端对象位置与本地客户端的对象位置超过一定距离时
使用直接更新对象的位置的方法,实现玩家位置的同步 就会导致游戏对象发生瞬移现象。
其次是 插值选择,包括内插和外插算法的选择。
下面我们详细介绍插值选项 [空白_音频] 使用 Photon Transform View
同步对象位置时,每 100毫秒发送一次对象的位置信息 在连续两个位置之间,使用内插或者外插实现玩家对象的平滑移动
内插表示根据本次接收的对象位置信息 与对象已有的位置信息,使用某种内插算法,实现玩家的平滑移动
外插表示,根据之前接收的对象位置信息,预测对象将来所处的位置
插值算法的选择通常由游戏的类型来决定 在 FPS
游戏中,玩家对象的运动方向经常变化 不适合使用预测的方式来计算玩家的位置,使用内插算法更为合理
在赛车游戏中,赛车对象的运动方向变化比较连续 可以使用外插算法预测赛车的位置。
在 Photon Transform View 组件中
包含几种内插与外插的算法,如本节PPT所示,Disabled 表示不使用插值算法
直接使用接收到的位置数据替换对象当前的位置数据 Fixed Speed,表示以固定的速度实现插值的计算。
Estimated Speed 根据最近几次接收到的位置信息,估算对象的移动速度 根据估算得到的对象移动速度,实现插值计算。
Synchronize Values 发送对象的实际速度与对象的实际速度实现插值计算 这种方法的网路开销比较大。
Lerp 表示使用先快后慢的速度完成插值计算 对象当前位置与目标位置较远时,使用较快的速度靠近目标位置
对象当前位置与目标位置较近时,使用较慢的速度靠近目标位置。
在《慕课英雄 2》中 我们使用内插算法的 Estimated Speed
实现多个客户端之间玩家位置的同步 接下来是 Rotation 与 Scale
的同步,Rotation 与 Scale 只包含内插选项 其中,Disabled
表示不使用内插算法 Rotate/Move Towards 表示以固定速率实现插值计算
Lerp 表示使用先快后慢的速度完成插值计算
在《慕课英雄 2》项目
中,我们使用内插算法的 Estimated Speed 实现客户端之间玩家对象位置的平滑同步
当玩家对象的当前位置与目标位置超过 30 使用瞬移的方式完成位置信息的同步。
我们使用 Rotate Toward 内插算法 完成对象朝向的同步。
在《慕课英雄 2》项目中 玩家对象 Scale 属性不改变,我们不勾选
Synchronize Scale 表示不同步玩家对象的 Scale 属性。
最后我们将设置完成的 Photon Transfrom View 组件 添加到 Photon Transform View
组件的 Observed Component 属性中,完成玩家位置与朝向的同步 [空白_音频]
下一节我们讲解玩家动画 和枪械的同步
最后是演示环节,演示环节的内容为 给玩家预置键添加
Photon Transform View 组件 实现玩家位置和朝向的同步