1

我正在尝试使用 MLAPI 进入多人游戏,但遇到了一个我无法解决的问题。

void Update()
    {
        if (Input.GetKeyDown(KeyCode.S))
        {
            GameObject player = Instantiate(cube);
            player.GetComponent<NetworkObject>().Spawn();
            player.GetComponent<NetworkObject>().ChangeOwnership(2);
        }
    }

我把这个脚本放在一个空的游戏对象上,立方体只是一个立方体预制件,上面附加了一个网络对象组件。它应该产生对象,然后更改它的所有权。但是,当我将项目的一个实例作为服务器启动,另一个作为客户端启动,并在服务器上按 S 时,我在客户端上收到此错误:

KeyNotFoundException:给定的键不在字典中。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)

(实际上更长,但我认为其余的应该是不必要的,如果不是,请告诉我。)

将除 2 之外的任何其他值放在 ChangeOwnership 方法中并尝试相同的操作会在服务器上给出:

KeyNotFoundException:给定的键不在字典中。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)

如果有人能帮助我解决这个问题,我将不胜感激。

4

2 回答 2

1

为什么不使用SpawnWithOwnership?哦,我知道,这太简单了;)

于 2021-08-07T19:04:40.173 回答
0

没关系,我自己想通了。出于某种原因,您不能在生成 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);
}
于 2021-05-13T12:15:19.063 回答