比尔云BierYun--阿里云最新优惠活动
阿里云优惠码丨阿里云代金券

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

Photon与Unity核心技术之角色动作同步http://www.bieryun.com/2261.html

本篇介绍关于使用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国外服务器,有点延迟,如果服务器在国内或者自己搭建一个没有任何问题。

相关推荐

  • 暂无文章

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

强烈推荐

高性能SSD云服务器ECS抗攻击,高可用云数据库RDS