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

如何在运行时向Photon Fusion预制体表添加并生成新对象

解决Photon Fusion运行时添加并生成新预制体的问题

核心问题分析

你遇到的ArgumentException: Invalid prefab id错误,是因为直接用default作为Prefab ID调用runner.Prefabs.Load()——这个默认值对应无效的未注册预制体ID,Fusion无法识别。

正确实现步骤

要在运行时添加并生成预制体,必须先将预制体注册到Fusion Runner的预制体系统,再用有效ID执行生成:

  1. 加载预制体资源
    先通过资源加载方式(比如Resources.Load、Addressables)获取到目标预制体,注意预制体必须挂载NetworkObject组件:

    // 示例:用Resources加载预制体,替换为你的资源路径
    var dynamicPrefab = Resources.Load<GameObject>("Prefabs/YourDynamicPrefab");
    
  2. 注册预制体到Runner
    调用runner.Prefabs.Register()将预制体纳入Fusion的管理体系,获取有效的Prefab ID:

    var prefabId = runner.Prefabs.Register(dynamicPrefab);
    
  3. 执行生成操作
    用获取到的prefabId加载预制体并Spawn,或者直接用已加载的预制体对象Spawn:

    // 方式1:通过Prefab ID加载并生成
    var spawnedObject = runner.Spawn(runner.Prefabs.Load(prefabId, false));
    
    // 方式2:直接用已加载的预制体对象生成(更简洁)
    runner.Spawn(dynamicPrefab);
    

异步加载场景处理(比如Addressables)

如果用异步加载资源,要等待加载完成后再执行注册和生成:

var loadHandle = Addressables.LoadAssetAsync<GameObject>("YourPrefabAddress");
loadHandle.Completed += operation => {
    if (operation.Status == AsyncOperationStatus.Succeeded) {
        var loadedPrefab = operation.Result;
        var prefabId = runner.Prefabs.Register(loadedPrefab);
        runner.Spawn(runner.Prefabs.Load(prefabId, false));
    }
};

关键注意事项

  • 仅在服务器/Host端执行预制体注册和生成逻辑,避免客户端重复注册导致网络同步问题。
  • 确保预制体的NetworkObject组件配置正确(比如Networked属性、场景对象标记等)。

内容的提问来源于stack exchange,提问作者Paul Brecelj

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 19:58:25