纳金网

标题: 【牛人文章】Photon与Unity核心技术之角色动作同步 [打印本页]

作者: kuaidaoshou    时间: 2018-3-16 10:46
标题: 【牛人文章】Photon与Unity核心技术之角色动作同步
文章标题:Photon与Unity核心技术之角色动作同步
文章作者:海洋_(CSDN )

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


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

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

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

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

也需要将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自带的回调函数


  • OnPhotonSerializeView  

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


  • 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语句判断,这样就完成了同步处理,下面重点介绍新动画状态机的处理方式。


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

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

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

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

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

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

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

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

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

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

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

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

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

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


  • PhotonNetwork.Instantiate  

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

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

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






欢迎光临 纳金网 (http://c-www.narkii.com/club/) Powered by Discuz! X2.5