在 Unity 3D 中使用 PUN2 进行 VR 多人体验时出现问题

Problem using PUN2 for a VR multiplayer experience in Unity 3D

我正在尝试创建一个简单的 VR 演示,其中两个用户可以连接到一个房间并在 table 上操作对象。我目前正在关注 this tutorial.

我一步一步跟着做了:

问题是我卡在了“实例化头像”部分,特别是在部分:

The following code can be placed for example in your already existing Network Manager or any other script that already deals with network logic, it doesn't belong to the PhotonAvatarView script we created earlier. Here we are using the OnJoinedRoom callback.

我的假设是这是一个从头开始的教程(考虑到它是从一个空白的 Unity 项目开始的),但是我没有任何网络管理器脚本,所以我有点困惑。将该代码放入新脚本并将其附加到对象似乎不起作用。

我是否遗漏了某些部分?

我们收到了您的反馈,我们将根据此对教程进行审核和更新。

帮助您解决问题并回答您的问题:

在本例中您需要的 NetworkManager 以及整个教程中的内容需要实现两个 PUN2 回调:IMatchmakingCallbacks.OnJoinedRoomIOnEventCallback.OnEvent。虽然本教程可能建议可以有两个单独的 classes 一个实现每个回调(NetworkManagerMyClass),但没有什么反对将它们组合在一个地方。 在教程的 "Instantiating Avatars" 部分的第一个代码块中,我们看到 OnJoinedRoom 方法被覆盖了。这可能意味着原作者假设 NetworkManager 必须扩展 MonoBehaviourPunCallbacks class。 继承自 MonoBehaviourPunCallbacks class 是实现 PUN2 回调最简单和最快的方法:它是一个 MonoBehaviour 允许您有选择地覆盖您需要的回调,并且只覆盖您需要的回调,它已经处理了回调代表您注册和注销(分别在 OnEnableOnDisable 中)它不需要记住所有回调的接口,它还扩展了 MonoBehaviourPun 公开了 PhotonView如果 属性 附加到同一个游戏对象,则很容易。但是,您应该小心,因为它并没有实现所有回调接口,而是实现了大部分。它实现了 IConnectionCallbacksIMatchmakingCallbacksIInRoomCallbacksILobbyCallbacksIWebRpcCallback。它没有实现 IOnEventCallbackIPunInstantiateMagicCallbackIPunObservableIPunOwnershipCallbacks。 PUN2 的实用程序接口也没有实现,例如IPunTurnManagerCallbacks.

话不多说,给我看代码:

public class NetworkManager : MonoBehaviour, IMatchmakingCallbacks, IOnEventCallback
{
    public const byte InstantiateVrAvatarEventCode = 1;

    public void OnJoinedRoom() // w/o override
    {
        // code from the tutorial here
    }

    public void OnEvent(EventData photonEvent)
    {
        // code from the tutorial here
    }

    private void OnEnable()
    {
        PhotonNetwork.AddCallbackTarget(this);
    }

    private void OnDisable()
    {
        PhotonNetwork.RemoveCallbackTarget(this);
    }

    #region Unused IMatchmakingCallbacks

    public void OnFriendListUpdate(List<FriendInfo> friendList)
    {
    }

    public void OnCreatedRoom()
    {
    }

    public void OnCreateRoomFailed(short returnCode, string message)
    {
    }

    public void OnJoinRoomFailed(short returnCode, string message)
    {
    }

    public void OnJoinRandomFailed(short returnCode, string message)
    {
    }

    public void OnLeftRoom()
    {
    }

    #endregion
}