1

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

我一步一步地跟着它:

  • 复制LocalAvatarRemoteAvatar预制并将它们移动到资源

    创建脚本PhotonAvatarView脚本

    附加并配置PhotonAvarViewPhotonView两个预制件

问题是我被困在“实例化头像”部分,特别是在以下部分:

例如,可以将以下代码放置在您现有的网络管理器或任何其他已经处理网络逻辑的脚本中,它不属于我们之前创建的 PhotonAvatarView 脚本。这里我们使用 OnJoinedRoom 回调。

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

我错过了一些部分吗?

4

1 回答 1

2

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

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

在这种情况下您需要的 NetworkManager 并按照整个教程需要实现两个 PUN2 回调:IMatchmakingCallbacks.OnJoinedRoomIOnEventCallback.OnEvent. 虽然本教程可能建议可能有两个单独的类,一个实现每个回调 (NetworkManagerMyClass),但没有什么反对将它们分组在一个地方。在教程的“实例化 Avatars”部分的第一个代码块中,我们看到该OnJoinedRoom方法已被覆盖。这可能意味着原始作者假设 NetworkManager 必须是扩展MonoBehaviourPunCallbacks类。从MonoBehaviourPunCallbacks类继承是实现 PUN2 回调的最简单和最快的方法:它是MonoBehaviour这允许您有选择地覆盖您需要的回调,并且只覆盖您需要的回调,它已经代表您处理回调注册和注销(分别在OnEnable和中OnDisable)它不需要记住所有回调的接口,它还扩展MonoBehaviourPun了暴露的PhotonView如果后者附加到同一个游戏对象,则很容易在属性中。但是,您应该小心,因为它并没有实现所有回调接口,而是大多数。它实现IConnectionCallbacks, IMatchmakingCallbacks,IInRoomCallbacks和. 它不实现、和。PUN2 的实用程序接口也未实现,例如.ILobbyCallbacksIWebRpcCallbackIOnEventCallbackIPunInstantiateMagicCallbackIPunObservableIPunOwnershipCallbacksIPunTurnManagerCallbacks

说话很便宜,给我看代码:

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
}
于 2019-09-10T09:46:03.457 回答