通过RPC调用传递gameobject

问题描述

我正在尝试通过RPC调用传递游戏对象,以便为每个玩家更新该对象上的精灵渲染器以更改其颜色。但是,当我尝试执行此操作时,我得到一个错误提示Write Failed. Custom type not found: UnityEngine.GameObject。我可以传递游戏对象作为参数吗?还是有更好的方法让游戏对象与场景中的PhotonView关联?

NetworkPlayer.cs

void Start()
{
    rb = GetComponent<Rigidbody2D>();

    GameObject go = gameObject;

    string[] array = {pd.m_Player.ColorTheme,pd.m_Player.Color1,pd.m_Player.Color2};
    pv.RPC(nameof(UpdateColor),RpcTarget.OthersBuffered,array,go);
}

[PunRPC]
void UpdateColor(string[] theme,GameObject go)
{  
    Debug.Log("gameObject is " + go);
}

解决方法

如上所述,这是“不可能的”。您可以同步,但不能简单地同步引用。另一台设备具有完全不同的参考索引,那么如何知道哪个参考属于您发送的参考呢?

没有光子专家,所以我不确定光子如何解决这个问题。在NetworkIdendity组件用于“好的”旧UNet中。

但是,由于这里有PunCallback,因此在正确的UpdateColor上已经收到{strong> 的GameObject,因此您已经有了参考:

[PunRPC]
void UpdateColor(string[] theme)
{  
    Debug.Log("gameObject is " + gameObject);
}

顺便说一句,而不是发送一个数组,另一方面我更愿意再次拆分/解析该数组

pv.RPC(nameof(UpdateColor),RpcTarget.OthersBuffered,pd.m_Player.ColorTheme,pd.m_Player.Color1,pd.m_Player.Color2);

并接收

[PunRPC]
void UpdateColor(string theme,string color1,string color2)
{  
    pd.m_Player.ColorTheme = theme;
    pd.m_Player.Color1 = color1;
    pd.m_Player.Color2 = color2;

    Debug.Log($"Update received for {gameObject}");
}