unity3d Unity Netcode ServerRpc仅在客户端上执行

6ie5vjzr  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(296)

我正在学习Unity Netcode。
基本上,PlayerController将同时存在于主机和客户端上。PlayerController预制件具有网络对象组件,并已添加到网络管理器中。有一个spawnPrefab,当我在主机上按空格键时,它会示例化。spawnPrefab具有网络对象组件,并已添加到网络管理器中。
当我在主机上点击空格时,预制件在主机和客户端上都产生。
然而,当我在客户端按Y键时,我得到一个错误,说spawnedObjectTransform尚未示例化。当在主机端命中Y时,我没有得到这个错误,在主机和客户端上都销毁了对象。
这是玩家脚本。spawnPrefab GameObject上没有任何脚本,只有网络对象。

public class PlayerController : NetworkBehaviour
{

public GameObject spawnPrefab;

private Transform spawnedObjectTransform;

void Update()
{
 
    // For multiplayer, if not owner, ignore all commands
    if (!IsOwner)
        return;

    if (Input.GetKeyDown(KeyCode.Space))
    {
        spawnedObjectTransform = Instantiate(spawnPrefab).transform;
        spawnedObjectTransform.GetComponent<NetworkObject>().Spawn(true);
    }
    

    if (Input.GetKeyDown(KeyCode.Y))
    {
        TestServerRpc();
    }
   
}

[ServerRpc(RequireOwnership = false)]
private void TestServerRpc()
{
    Destroy(spawnedObjectTransform.gameObject);
}

}

我能看到的唯一解释是TestServerRpc在某种程度上只在客户端调用,而不在服务器上调用。有人见过这样的东西吗?

ttvkxqim

ttvkxqim1#

您不是从服务器上开始生成对象的。将示例化放在单独的ServerRpc方法中,并使用回调调用它:

if (Input.GetKeyDown(KeyCode.Space))
    {
        SpawnObjectServerRpc();
    }

[ServerRpc]
void SpawnObjectServerRpc()
{
     spawnedObjectTransform = Instantiate(spawnPrefab).transform;
     spawnedObjectTransform.GetComponent<NetworkObject>().Spawn(true);
}

相关问题