📜  PUN 2 网络转换视图抖动运动 - C# (1)

📅  最后修改于: 2023-12-03 15:18:43.548000             🧑  作者: Mango

PUN 2 网络转换视图抖动运动 - C#

PUN 2是Photon Unity Networking 2的缩写,是一种易于使用的多人游戏解决方案。它使用了Unity底层网络连接以及Photon提供的实时服务,可以快速的在游戏中添加多人联机功能。而在开发基于PUN 2的多人游戏时,网络转换视图抖动运动是一个常见问题。本文将通过C#代码解决此问题,并且在相应的代码片段中标明markdown。

PUN 2联网功能简介

在介绍如何解决网络转换视图抖动运动问题之前,我们先了解一下PUN 2的联网功能。以多人玩家移动为例,当一个玩家移动时,他的角色会在本地的客户端进行计算,然后通过网络发送给其他玩家的客户端。其他玩家的客户端将接收到这个角色移动的数据,并且进行同步。但是,正常情况下,网络的延迟或者数据包的丢失都会导致角色的移动出现抖动。这时就需要对联网功能进行优化,从而解决这个问题。

网络转换视图抖动运动问题

网络转换视图,通常被简称为“NTV”,是PUN 2提供的一个组件。它可以帮助我们快速的进行联网实现,如实时位置同步等。但是,当玩家角色进行移动时,网络转换视图容易出现抖动。这主要是因为NTV的默认设置会产生一些缓动效果,导致看起来不太自然。因此,我们需要对抖动问题进行优化。

解决方案

为了解决网络转换视图抖动运动问题,我们需要对NTV进行设置。具体来说,我们需要通过C#代码来实现抗锯齿和插值效果,从而使得角色移动更加流畅。以下是代码片段:

using Photon.Pun;
using UnityEngine;

public class SmoothNetworkTransform : MonoBehaviour, IPunObservable
{
    private Vector3 _networkPosition;
    private Vector3 _previousPosition;
    private Quaternion _networkRotation;
    private float _interpolationRate = 15;

    public void OnPhotonSerializeView(PhotonStream stream, PhotonMessageInfo info)
    {
        if (stream.IsWriting)
        {
            //This is your character
            stream.SendNext(transform.position);
            stream.SendNext(transform.rotation);
        }
        else
        {
            //This is someone else's character
            _networkPosition = (Vector3)stream.ReceiveNext();
            _networkRotation = (Quaternion)stream.ReceiveNext();
        }
    }

    private void FixedUpdate()
    {
        if (!photonView.IsMine)
        {
            transform.position = Vector3.Lerp(transform.position, _networkPosition, Time.deltaTime * _interpolationRate);
            transform.rotation = Quaternion.Lerp(transform.rotation, _networkRotation, Time.deltaTime * _interpolationRate);
        }
    }
}

接下来,我们一步步来分析这段代码的含义:

  1. using语句中,我们引入了Photon.Pun库和UnityEngine库。

  2. 定义了SmoothNetworkTransform类,并且该类实现了IPunObservable接口。

  3. 在类中定义了游戏物体的位置和旋转信息。其中,_networkPosition_networkRotation存储了其他玩家的位置和旋转信息。而_previousPosition则存储了玩家上一次的位置信息。

  4. 定义了插值速率。_interpolationRate表示的是插值速率,值越大,插值速率越快,反之则越慢。

  5. 实现了OnPhotonSerializeView方法。该方法用于向其他客户端传递本地玩家的位置和旋转信息,或者接收其他玩家传递过来的位置和旋转信息。

  6. FixedUpdate()方法中执行了插值操作。如果本地玩家不是角色拥有者,则通过Lerp()方法对物体的位置和旋转进行插值运算。具体来说,Lerp()方法会对位置进行插值操作,使得物体的位置更加平滑,从而减少抖动现象。

有了这段代码,我们就可以将其引入到我们的游戏中,从而解决网络转换视图抖动运动问题。

总结

PUN 2是一种易于使用的多人游戏解决方案,但是当玩家进行移动时,网络转换视图可能会出现抖动现象。为了解决这个问题,我们可以通过编写C#代码来实现插值运算操作,从而使得玩家角色的移动更加流畅。以上就是PUN 2网络转换视图抖动运动的解决方案。