Unity ECS子场景加载异常:挂载含Baker的Prefab导致无法加载
解决方案
以下是几种可行的解决思路,可根据项目需求选择:
代理对象中转Baker逻辑
不在被引用的Sphere预制体上挂载带Baker的Authoring脚本,而是在子场景内新建一个空对象作为代理,将SphereAuthoring和对应的Baker挂载到这个代理上。修改TestAuthoring脚本,让它引用子场景内的代理对象而非预制体。这样Baker的烘焙会在子场景加载时正常执行,不会因预制体的Baker触发加载阻塞。异步加载+手动触发烘焙
- 将子场景设置为异步加载模式;
- 在TestAuthoring脚本中添加逻辑,等子场景加载完成后手动调用预制体上Baker的烘焙方法。示例代码如下:
using UnityEngine; using UnityEngine.SceneManagement; using Unity.Entities; public class TestAuthoring : MonoBehaviour { public GameObject spherePrefab; private Scene _subScene; void Start() { _subScene = gameObject.scene; if (_subScene.isLoaded) { TriggerBake(); } else { SceneManager.sceneLoaded += OnSubSceneLoaded; } } void OnSubSceneLoaded(Scene scene, LoadSceneMode mode) { if (scene == _subScene) { TriggerBake(); SceneManager.sceneLoaded -= OnSubSceneLoaded; } } void TriggerBake() { var authoring = spherePrefab.GetComponent<SphereAuthoring>(); var baker = authoring.GetComponent<Baker<SphereAuthoring>>(); baker.Bake(authoring); } }
注意:自定义Baker时要确保烘焙逻辑支持手动调用,Unity内置Baker(如PhysicsShapeBaker)可能需要额外适配。
转为Entity预制体实例化
- 将Sphere预制体转为Entity预制体:在预制体Inspector中勾选「Convert To Entity」,设置转换模式为「Convert On Demand」;
- 修改TestAuthoring脚本,直接实例化Entity预制体,烘焙流程会在实例化时自动完成,不会干扰子场景加载。示例代码:
using UnityEngine; using Unity.Entities; public class TestAuthoring : MonoBehaviour { public GameObject entitySpherePrefab; void Awake() { var world = World.DefaultGameObjectInjectionWorld; var prefabEntity = GameObjectConversionUtility.ConvertGameObjectHierarchy(entitySpherePrefab, world); world.EntityManager.Instantiate(prefabEntity); } }
额外注意事项
- 子场景加载时的实体转换流程,会和未完成烘焙的预制体产生冲突,因此要避免在子场景的Authoring脚本中直接引用这类预制体;
- 对于Unity内置带Baker的组件(如Physics Shape),优先用上述方法绕开直接挂载在被引用预制体上的场景。
内容的提问来源于stack exchange,提问作者Javin Yang
相关产品推荐
相关产品推荐

