ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

【Unity Bug挑战】第8期 record 里加了个 List,IL2CPP 构建直接炸了

【Unity Bug挑战】第8期 record 里加了个 List,IL2CPP 构建直接炸了

record 里加了个 List,IL2CPP 构建直接炸了

栏目:Unity Bug挑战 | 期号:NO.008 | 日期:2026-10-29 | 4星 · 中高级 | Bug挑战 | Unity 2022.3 LTS · Android

类型:构建 / IL2CPP

环境:Unity 2022.3 LTS · Android

🐛 Bug 现场

项目里有一套配置系统,用 ScriptableObject 存各个系统的配置数据。最近做代码重构,为了让配置数据不可变、支持 with 表达式快速拷贝,把几个数据类改成了 C# 9 的 record 类型。

改完之后,Editor 里跑一切正常,Mono 构建也没问题。直到上周打 Android IL2CPP 包的时候,构建直接崩了。

简化后的代码如下(已脱敏):

public record SkillConfig { public string SkillId { get; init; } public int Damage { get; init; } public float Cooldown { get; init; } public List<EffectConfig> Effects { get; init; } } public record EffectConfig { public string EffectType { get; init; } public float Value { get; init; } public List<ParamConfig> Params { get; init; } } public record ParamConfig { public string Key { get; init; } public string Value { get; init; } }

三层 record 嵌套,每层都有 List。看着人畜无害对吧?

💥 诡异现象

预期:record 就是个语法糖,本质还是 class,IL2CPP 应该正常处理才对。Editor 和 Mono 都没问题,IL2CPP 怎么会挂?

实际:Android IL2CPP 构建在编译 C++ 阶段直接报错,错误信息如下:

fatal error: bracket nesting level exceeded maximum of 256 note: use -fbracket-depth=N to increase maximum nesting level 1 error generated.

报错位置在 IL2CPP 生成的 Assembly-CSharp__12.cpp 第 21955 行第 4042 列——一行代码有四千多列,C++ 编译器直接说「括号嵌套太深了,我不干了」。

更诡异的是:把 Effects 那行 List 去掉,构建就过了。或者把 record 改成普通 class,也过了。

就是 record + List + 多层嵌套这个组合,精准触发了 IL2CPP 的某个雷区。

🤔 你的任务

请分析以下三个问题:

  1. 为什么 record + 泛型集合嵌套会导致 IL2CPP 生成的 C++ 代码括号嵌套超过 256 层?record 类型到底让 IL2CPP 多生成了什么?

  2. 为什么 Editor/Mono 没问题,只有 IL2CPP 会炸?这是 IL2CPP 的 bug 还是预期行为?

  3. 除了「改回 class」之外,你能想到几种修复方案?各自的 trade-off 是什么?

💡 想到答案了吗?

评论区留下你的思路,答案稍后揭晓

#Unity #Bug挑战 #IL2CPP #C# #Android构建


标签:Unity、Bug挑战、IL2CPP、C#、Android构建

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进