Unity MLAPI 的 NetworkObject.ChangeOwner() 给出 KeyNotFoundException

问题描述 投票:0回答:2

我正在尝试使用 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)*

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

unity-game-engine network-programming
2个回答
1
投票

为什么不使用

SpawnWithOwnership
?哦,我知道,这太简单了;)


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);
}
© www.soinside.com 2019 - 2024. All rights reserved.