繁体   English   中英

使用 Photon 在 Unity GameObject 上设置标签

[英]Setting tags on a Unity GameObject with Photon

我试图通过 RPC 调用查看它们的 PhotonView ViewID,用“Player1”和“Player2”标签标记两个 PUN 实例化游戏对象。 我能够成功地用玩家 1 标签标记玩家 1 游戏 object,但是,无论我尝试什么,我都无法将玩家 2 标签设置为玩家 2 object。代码是联网的并在两个 Oculus Quest 耳机上运行. 我可以在一个 Quest 上启动应用程序,它会正确分配 Player1 标签。 但是,当我在第二个 Quest 上启动应用程序时,它会生成一个玩家游戏对象,但不会使用 Player2 标记标记 object,即使玩家 2 对象的 PhotonView 与“2001”值匹配。 下面是我用来在每个玩家的 XROrigin 和 a.networked 表示中生成的代码。

using System;
using UnityEngine;
using Photon.Pun;
using Photon.Realtime;
using UnityEngine.XR.Interaction.Toolkit;


public class NetworkPlayerSpawner : MonoBehaviourPunCallbacks
{
    public GameObject XROriginPrefab;
    
    [HideInInspector]
    public GameObject spawnedPlayerPrefab;

    private PhotonView pv;
   
    private void Start()
    {
        pv = GetComponent<PhotonView>();
    }

    private void Update()
    {
       // Debug.Log(PhotonNetwork.CurrentRoom.PlayerCount);
    }

    public override void OnJoinedRoom()
    {
        base.OnJoinedRoom();
        var playerCount = PhotonNetwork.CurrentRoom.PlayerCount;
        Debug.Log("The player count is: " + playerCount);
        var teleportAreas = GameObject.FindGameObjectsWithTag("Floor");


        //playerCount = 2;
        if (playerCount == 1)
        {
            XROriginPrefab = Instantiate(XROriginPrefab, new Vector3(0, 2.36199999f, 3.78999996f),
                new Quaternion(0, 0, 0, 1));
            
            spawnedPlayerPrefab = PhotonNetwork.Instantiate("Network Player", transform.position, transform.rotation);
            //spawnedPlayerPrefab.tag = "Player1";
            foreach (GameObject go in teleportAreas)
            {
                go.AddComponent<TeleportationArea>();
            }
        }

        else
        {
           XROriginPrefab = Instantiate(XROriginPrefab, new Vector3(-10.3859997f,1.60699999f,10.6400003f),
                new Quaternion(0,0,0,1));
           
            spawnedPlayerPrefab = PhotonNetwork.Instantiate("Network Player", transform.position, transform.rotation);
            //spawnedPlayerPrefab.tag = "Player2";
            
            
            //If teleport breaks again, I uncommented this line, so it should be commented out again. Should allow for teleport in User 2's room.
            foreach (GameObject go in teleportAreas)
            {
                go.AddComponent<TeleportationArea>();
            }
        }
        rpcCallTagAssign();
    }

    public override void OnPlayerEnteredRoom(Player newPlayer)
    {
       base.OnPlayerEnteredRoom(newPlayer); 
       Debug.Log("Remote Player Joined!");
       rpcCallTagAssign();
    }


    public override void OnLeftRoom()
    {
        base.OnLeftRoom();
        PhotonNetwork.Destroy(spawnedPlayerPrefab);
    }

    [PunRPC]
    private void tagAssign()
    {
        if (spawnedPlayerPrefab.GetComponent<PhotonView>().ViewID==1001)
        {
            spawnedPlayerPrefab.tag = "Player1";
        }
        if (spawnedPlayerPrefab.GetComponent<PhotonView>().ViewID==2001)
        {
            spawnedPlayerPrefab.tag = "Player2";
        }
    }

    private void rpcCallTagAssign()
    {
        pv.RPC("tagAssign", RpcTarget.AllViaServer);
    }
}

我是 Photon 的新手,所以如果能帮助解决这个问题,我将不胜感激。 谢谢!

代码需要在每个播放器(包括副本)上运行。 当前代码只能更改您对 (spawnedPlayerPrefab) 有参考的 object。 最简单的方法是在播放器上添加一个 RPC function。 该 RPC 将在连接的客户端上为该播放器的每个实例调用。

播放器上的脚本。

[PunRPC]
private void AssignTag()
{
    if (photonView.ViewID == 1001)
    {
        gameObject.tag = "Player1";
    }
    else if (photonView.ViewID == 2001)
    {
        gameObject.tag = "Player2";
    }
}

在 NetworkPlayerSpawner

spawnedPlayerPrefab = PhotonNetwork.Instantiate(...);
spawnedPlayerPrefab.GetComponent<PhotonView>().RPC("AssignTag", RpcTarget.AllBufferedViaServer);

RPC 被缓冲,因此在您将您的播放器副本也设置为正确标签后进入的未来客户(反之亦然)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM