海洋个人博客

喜欢自由的飞翔!

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

上篇介绍了角色更换武器同步处理,本篇介绍关于使用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();

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

  • 新动画状态机同步

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


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

阅读更多

扫码向博主提问

去开通我的Chat快问

jxw167

博客专家

非学,无以致疑;非问,无以广识
  • 擅长领域:
  • 3D引擎架构
  • 服务器架构
  • GPU渲染
  • 客户端架构
  • 引擎优化
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jxw167/article/details/79544878
个人分类: 算法与游戏
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭