NetworkObject生成报错NotListeningException,已启动主机仍无法生成求助
解决Netcode中NotListeningException生成预制体失败问题
问题详情
错误提示:
NotListeningException: NetworkManager is not listening, start a server or host before spawning objects
场景:自制的NetworkObject预制体挂载在玩家对象的Spawner脚本上,玩家预制体已关联至NetworkManager的Player字段,启动主机后玩家预制体生成正常,但无法生成目标预制体。
原Spawner脚本代码
public class Spawner : NetworkBehaviour { private string _playerID; public NetworkObject prefab; public override void OnNetworkSpawn() { _playerID = NetworkManager.LocalClientId.ToString(); } private void Update() { if (Input.anyKey) { Debug.Log(_playerID); prefab.GetComponent<NetworkObject>().Spawn(); } } }
问题原因
- 直接对原始预制体调用
Spawn()是错误操作,必须先实例化预制体,再对实例执行Spawn。 - 网络对象的生成权限仅在服务器/主机端,客户端不能直接执行Spawn操作,需要通过服务器Rpc委托执行。
修复后的代码
public class Spawner : NetworkBehaviour { private string _playerID; public NetworkObject prefab; public override void OnNetworkSpawn() { _playerID = NetworkManager.LocalClientId.ToString(); } private void Update() { if (Input.anyKey) { // 仅本地玩家触发请求,避免多客户端重复操作 if (!IsLocalPlayer) return; Debug.Log(_playerID); // 调用服务器Rpc执行生成逻辑 SpawnObjectServerRpc(); } } [ServerRpc(RequireOwnership = true)] private void SpawnObjectServerRpc() { // 实例化预制体 NetworkObject spawnedObj = Instantiate(prefab); // 生成网络对象并同步至所有客户端 spawnedObj.Spawn(); } }
额外注意事项
- 务必将目标预制体添加到NetworkManager的Network Prefabs列表中,否则服务器无法识别并同步该预制体。
[ServerRpc(RequireOwnership = true)]确保只有拥有该Spawner组件的玩家才能调用此Rpc,避免非法请求。- 永远不要直接操作原始预制体对象,必须通过
Instantiate创建实例后再进行网络生成操作。
内容的提问来源于stack exchange,提问作者B4iT
相关产品推荐
相关产品推荐

