在ISystem中使用RenderMeshArray字段触发运行时错误求助
问题分析与解决方案
报错原因
你遇到的问题核心是**RenderMeshArray属于引用类型(class)**,而在Entities 1.3.10版本中,实现ISystem的结构体不允许直接包含引用类型字段。ECS内部的系统构造逻辑在处理结构体系统时,仅支持 blittable 值类型字段,引用类型的存在会触发逻辑误判,抛出“未继承ComponentSystemBase”的错误。
修复方案
提供两种可行的修复方式,可根据项目需求选择:
方式1:改用系统句柄间接访问(推荐)
通过SystemHandle获取持有RenderMeshArray的目标系统,避免直接在结构体系统中存储引用类型:
[UpdateAfter(typeof(HexGridRenderSystem))] public partial struct HexGridRenderSetupSystem : ISystem { private EntityQuery hexCellQuery; private SystemHandle renderMeshSystemHandle; public void OnCreate(ref SystemState state) { // 替换为你项目中实际管理RenderMeshArray的系统类型 renderMeshSystemHandle = state.World.GetExistingSystem<RenderMeshSystem>().Handle; } public void OnUpdate(ref SystemState state) { var targetSystem = state.World.GetSystem<RenderMeshSystem>(renderMeshSystemHandle); RenderMeshArray renderMeshArray = targetSystem.RenderMeshArray; // 后续使用renderMeshArray的业务逻辑 } }
方式2:将系统改为类实现
如果必须直接持有RenderMeshArray字段,可将结构体改为继承SystemBase的类(SystemBase是ComponentSystemBase的子类,符合报错提示的构造要求):
[UpdateAfter(typeof(HexGridRenderSystem))] public partial class HexGridRenderSetupSystem : SystemBase { private EntityQuery hexCellQuery; private RenderMeshArray renderMeshArray; protected override void OnCreate() { // 初始化逻辑 } protected override void OnUpdate() { // 更新逻辑 } }
额外说明
Entities 1.3.x属于ECS早期版本,对结构体ISystem的字段类型限制严格。后续新版本(如Entities 1.5+)放宽了部分限制,但仍建议遵循ECS内存管理原则,尽量避免在系统中直接持有引用类型。
内容的提问来源于stack exchange,提问作者docchang
相关产品推荐
相关产品推荐

