在带有光子的Unity游戏对象上设置标签



我正试图用"播放器1";以及";播放器2";通过RPC调用查看其PhotonView ViewID。我可以成功地用player1标签标记player1游戏对象,但是,无论我尝试什么,我都无法将player2标签设置为player2对象。该代码已联网并在两个Oculus Quest耳机上运行。我可以在一次任务中启动应用程序,它会正确分配Player1标签。然而,当我在第二个Quest上启动应用程序时,它会生成一个玩家游戏对象,但不会用Player2标签标记该对象,即使玩家2对象的PhotonView与";2001";价值下面是我用来在XROrigin中生成的代码,以及每个玩家的网络表示。

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);
}
}

我是光子网络的新手,所以如果能帮助解决这个问题,我将不胜感激。非常感谢。

代码需要在每个播放器上运行(包括副本(。当前代码只能更改您有引用的对象(spawnedPlayerPrefab(。最简单的方法是在播放器上添加RPC函数。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是缓冲的,所以在你之后进入的未来客户端也会将你的播放器副本设置为正确的标记(反之亦然(。

最新更新