You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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();
        }
    }
}

问题原因

  1. 直接对原始预制体调用Spawn()是错误操作,必须先实例化预制体,再对实例执行Spawn。
  2. 网络对象的生成权限仅在服务器/主机端,客户端不能直接执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 06:03:23