如何在运行时向Photon Fusion预制体表添加并生成新对象
解决Photon Fusion运行时添加并生成新预制体的问题
核心问题分析
你遇到的ArgumentException: Invalid prefab id错误,是因为直接用default作为Prefab ID调用runner.Prefabs.Load()——这个默认值对应无效的未注册预制体ID,Fusion无法识别。
正确实现步骤
要在运行时添加并生成预制体,必须先将预制体注册到Fusion Runner的预制体系统,再用有效ID执行生成:
加载预制体资源
先通过资源加载方式(比如Resources.Load、Addressables)获取到目标预制体,注意预制体必须挂载NetworkObject组件:// 示例:用Resources加载预制体,替换为你的资源路径 var dynamicPrefab = Resources.Load<GameObject>("Prefabs/YourDynamicPrefab");注册预制体到Runner
调用runner.Prefabs.Register()将预制体纳入Fusion的管理体系,获取有效的Prefab ID:var prefabId = runner.Prefabs.Register(dynamicPrefab);执行生成操作
用获取到的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
相关产品推荐
相关产品推荐

