Photon与Unity核心技术之角色动作同步

简介: Photon与Unity核心技术之角色动作同步 本篇介绍关于使用Photon实现角色同步,客户端还是选择Unity开发,在实现动作之前,Unity为我们提供了我们俗称为老动画和新动画状态机,我们先介绍老动画的实现方式,它是通过Animation组件把角色的动作拖进去的。

Photon与Unity核心技术之角色动作同步

本篇介绍关于使用Photon实现角色同步,客户端还是选择Unity开发,在实现动作之前,Unity为我们提供了我们俗称为老动画和新动画状态机,我们先介绍老动画的实现方式,它是通过Animation组件把角色的动作拖进去的。

  • 老动画网络同步处理

老动画使用在Unity以前的版本中常用,效果如下所示:

在Photon中也有关于老动画同步的组件,如下图所示:

也需要将Third Person Network组件拖到Observed Components组件上,这样就完成了同步设置,Photon使用的同步方式是状态同步,它同步包括:状态,位置,方向。我们看一下负责发送和接收消息的Third Person Network脚本代码,如下所示:

[csharp] view plain copy

  1. void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
  2.    {
  3.        if (stream.isWriting)
  4.        {
  5.            //We own this player: send the others our data
  6.            stream.SendNext((int)controllerScript._characterState);
  7.            stream.SendNext(transform.position);
  8.            stream.SendNext(transform.rotation);
  9.        }
  10.        else
  11.        {
  12.            //Network player, receive data
  13.            controllerScript._characterState = (CharacterState)(int)stream.ReceiveNext();
  14.            correctPlayerPos = (Vector3)stream.ReceiveNext();
  15.            correctPlayerRot = (Quaternion)stream.ReceiveNext();
  16. nbsp;        // avoids lerping the character from "center" to the "current" position when this client joins
  17.     if (firstTake)
  18.     {
  19.         firstTake = false;
  20.         this.transform.position = correctPlayerPos;
  21.         transform.rotation = correctPlayerRot;
  22.     }
  23.        }
  24.    }

上述函数负责接收和发送消息,它使用的是Photon自带的回调函数

[csharp] view plain copy

  1. OnPhotonSerializeView

游戏中其他玩家是通过插值的方式处理的,插值函数如下所示:

[csharp] view plain copy

  1. if (!photonView.isMine)
  2. {
  3.     //Update remote player (smooth this, this looks good, at the cost of some accuracy)
  4.     transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 10);
  5.     transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 10);
  6. }

以为我们的插值是对于其他玩家使用的,所以做了一个if语句判断,这样就完成了同步处理,下面重点介绍新动画状态机的处理方式。

  • 新动画状态机同步

新动画状态机实现如下所示:

使用的是Animator组件,这些都是最基本的常识,如果读者有不清楚的地方可以自己看一下Unity官方文档或者在网上搜一下,相关资料很多的。基本的组件已经完成,接下来看一下如何使用同步组件?先看下图所示的效果图:

相比老动画状态机,组件明显不一样,新增加了两个组件,一个是Photon Animator View,该组件主要是针对新动画状态机的层设置,比如下图所示:

上图是我们设置的角色新动画状态机的Layer,另外我们还有一些Parameters参数设置,如下图所示:

对应的角色组件Photon Aniamtor View如下所示:

该组件在Photon NetWork都有,读者可以自行查看,这里只是告诉读者如何使用。

接下来再看同步的组件 Photon Transform View组件,它里面包括 同步位置,方向,缩放,这个与老动画状态机不同,效果如下所示:

在Synchronize Position中还有两个选项要注意,一个是Interpolate Option,这个表示的是同步NPC的插值方式,一般采用的就是Lerp线性插值,插值速度默认是1,这个可以根据自身情况调整数值。这样我们就完成了角色同步,然手使用接口:

[csharp] view plain copy

  1. PhotonNetwork.Instantiate

实例化角色,可以看到同步的情况了,效果如下所示:

因为使用的是默认的Photon国外服务器,有点延迟,如果服务器在国内或者自己搭建一个没有任何问题。

原文地址http://www.bieryun.com/2261.html

相关文章
|
4月前
|
编译器 图形学 开发者
Unity例子——第一人称视角的角色控制器
Unity例子——第一人称视角的角色控制器
|
10月前
|
机器人 图形学 Ruby
【unity learn】【Ruby 2D】角色发射飞弹
【unity learn】【Ruby 2D】角色发射飞弹
|
图形学
Unity角色控制器CharaterController脚本
角色控制器是unity内置的一个人物控制脚本。适用于第一、第三人称中控制人物的一个组件,刚体的计算量比较大, 所以出现了CharacterController来代替刚体,做具体的人物控制。常用属性介绍Slop Limit : 坡度的限制,限制角色可以爬坡的最大角度Step Offset : 高度限...
3082 0
|
4月前
|
C# 图形学
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
【Unity 3D】元宇宙案例之虚拟地球信息射线实战(附源码、演示视频和步骤 超详细)
48 0
|
4月前
|
人工智能 自然语言处理 区块链
【Unity 3D】元宇宙概念、应用前景、价值链等概述
【Unity 3D】元宇宙概念、应用前景、价值链等概述
45 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机拆装后零件说明功能案例实战(附源码和演示视频 超详细)
33 0
|
4月前
|
vr&ar C# 图形学
【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)
【Unity 3D】VR飞机动态拆装及引擎开关控制案例(附源码和演示视频 超详细)
36 0
|
4月前
|
vr&ar 图形学
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
【Unity 3D】VR飞机起飞喷火游戏案例实战(附源码和演示视频 超详细)
46 0
|
4月前
|
vr&ar 开发工具 图形学
【Unity 3D】使用EasyAR实现单图识别的AR增强现实功能(附实现步骤)
【Unity 3D】使用EasyAR实现单图识别的AR增强现实功能(附实现步骤)
79 0