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

在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 19:52:07