我正在尝试使用 MLAPI 进入多人游戏,但遇到了一个我无法解决的问题。
void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
GameObject player = Instantiate(cube);
player.GetComponent<NetworkObject>().Spawn();
player.GetComponent<NetworkObject>().ChangeOwnership(2);
}
}
我已将此脚本放在一个空游戏对象上,立方体只是一个附有网络对象组件的立方体预制件。它应该生成对象,然后更改它的所有权。但是,当我启动项目的一个实例作为服务器,另一个作为客户端,并在服务器上按 S 时,我在客户端上收到此错误:
KeyNotFoundException: The given key was not present in the dictionary.
System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) (at <9577ac7a62ef43179789031239ba8798>:0)
MLAPI.Messaging.InternalMessageHandler.HandleChangeOwner (System.UInt64 clientId, System.IO.Stream stream) (at F:/1Unity/Networking Project/Library/PackageCache/com.unity.multiplayer.mlapi@3e3aef6aa0/Runtime/Messaging/InternalMessageHandler.cs:351)*
(其实有点长,但我想剩下的应该是没有必要的,如果没有请告诉我。)
在 ChangeOwnership 方法中放入 2 以外的任何其他值并尝试相同的操作会在服务器上给出此结果:
KeyNotFoundException: The given key was not present in the dictionary.
System.Collections.Generic.Dictionary`2[TKey,TValue].get_Item (TKey key) (at <9577ac7a62ef43179789031239ba8798>:0)
MLAPI.Spawning.NetworkSpawnManager.ChangeOwnership (MLAPI.NetworkObject networkObject, System.UInt64 clientId) (at Library/PackageCache/com.unity.multiplayer.mlapi@3e3aef6aa0/Runtime/Spawning/NetworkSpawnManager.cs:231)*
如果有人能帮助我解决这个问题,我将不胜感激。
为什么不使用
SpawnWithOwnership
?哦,我知道,这太简单了;)
没关系,我自己想出来了。由于某种原因,您无法在 NetworkObject 生成后立即更改其所有权。如果您生成该对象,然后调用一个方法来转移所有权,那么它就可以正常工作:
void Update()
{
if (Input.GetKeyDown(KeyCode.S))
{
player = Instantiate(cube);
player.GetComponent<NetworkObject>().Spawn();
Invoke("TransferOwnership",10f);
}
}
void TransferOwnership()
{
player.GetComponent<NetworkObject>().ChangeOwnership(2);
}