文章标题:Photon与Unity核心技术之角色动作同步
文章作者:海洋_(CSDN )
本篇介绍关于使用Photon实现角色同步,客户端还是选择Unity开发,在实现动作之前,Unity为我们提供了我们俗称为老动画和新动画状态机,我们提供了我们俗称为老动画和新动画状态机,我们先介绍老动画的实现方式,它是通过Animation组件把角色的动作拖进去的。
老动画使用在Unity以前的版本中常用,效果如下所示:
在Photon中也有关于老动画同步的组件,如下图所示:
也需要将Third Person Network组件拖到Observed Components组件上,这样就完成了同步设置,Photon使用的同步方式是状态同步,它同步包括:状态,位置,方向。我们看一下负责发送和接收消息的Third Person Network脚本代码,如下所示: - void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
- {
- if (stream.isWriting)
- {
- //We own this player: send the others our data
- stream.SendNext((int)controllerScript._characterState);
- stream.SendNext(transform.position);
- stream.SendNext(transform.rotation);
- }
- else
- {
- //Network player, receive data
- controllerScript._characterState = (CharacterState)(int)stream.ReceiveNext();
- correctPlayerPos = (Vector3)stream.ReceiveNext();
- correctPlayerRot = (Quaternion)stream.ReceiveNext();
-
- nbsp; // avoids lerping the character from "center" to the "current" position when this client joins
- if (firstTake)
- {
- firstTake = false;
- this.transform.position = correctPlayerPos;
- transform.rotation = correctPlayerRot;
- }
-
- }
- }
上述函数负责接收和发送消息,它使用的是Photon自带的回调函数
游戏中其他玩家是通过插值的方式处理的,插值函数如下所示:
- if (!photonView.isMine)
- {
- //Update remote player (smooth this, this looks good, at the cost of some accuracy)
- transform.position = Vector3.Lerp(transform.position, correctPlayerPos, Time.deltaTime * 10);
- transform.rotation = Quaternion.Lerp(transform.rotation, correctPlayerRot, Time.deltaTime * 10);
- }
以为我们的插值是对于其他玩家使用的,所以做了一个if语句判断,这样就完成了同步处理,下面重点介绍新动画状态机的处理方式。
新动画状态机实现如下所示:
使用的是Animator组件,这些都是最基本的常识,如果读者有不清楚的地方可以自己看一下Unity官方文档或者在网上搜一下,相关资料很多的。基本的组件已经完成,接下来看一下如何使用同步组件?先看下图所示的效果图:
相比老动画状态机,组件明显不一样,新增加了两个组件,一个是Photon Animator View,该组件主要是针对新动画状态机的层设置,比如下图所示:
上图是我们设置的角色新动画状态机的Layer,另外我们还有一些Parameters参数设置,如下图所示:
对应的角色组件Photon Aniamtor View如下所示:
该组件在Photon NetWork都有,读者可以自行查看,这里只是告诉读者如何使用。 接下来再看同步的组件 Photon Transform View组件,它里面包括 同步位置,方向,缩放,这个与老动画状态机不同,效果如下所示:
在Synchronize Position中还有两个选项要注意,一个是Interpolate Option,这个表示的是同步NPC的插值方式,一般采用的就是Lerp线性插值,插值速度默认是1,这个可以根据自身情况调整数值。这样我们就完成了角色同步,然手使用接口:
- PhotonNetwork.Instantiate
实例化角色,可以看到同步的情况了,效果如下所示:
因为使用的是默认的Photon国外服务器,有点延迟,如果服务器在国内或者自己搭建一个没有任何问题。 |