问题描述
我正在尝试通过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}");
}