我正在学习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在某种程度上只在客户端调用,而不在服务器上调用。有人见过这样的东西吗?
1条答案
按热度按时间ttvkxqim1#
您不是从服务器上开始生成对象的。将示例化放在单独的ServerRpc方法中,并使用回调调用它: