Unity Serializable自定义类在Inspector面板显示异常咨询
问题根因
这个显示异常不属于Unity编辑器本身的bug,是未遵循Unity序列化规则、默认Inspector渲染逻辑未适配自定义类导致的:
- 你为
StoryTrigger定义了带参数的构造函数,但没有显式声明无参构造函数。Unity序列化系统实例化自定义可序列化类时,会通过无参构造反射生成对象,缺失无参构造时会走兼容逻辑,很容易触发Inspector渲染错位。 - 你在public字段上额外加了
[SerializeField]特性,该特性本身是用来让非public字段支持序列化的,public字段Unity默认就会序列化,重复声明特性偶尔会导致字段渲染顺序异常。 - 默认情况下,Unity对列表内的自定义可序列化类元素,会统一显示
Element 序号作为折叠栏标题,不会自动读取类内字段作为标识,这也是你觉得显示效果怪异的原因之一。
修复步骤
按以下调整代码即可解决显示问题,不需要编写复杂的自定义编辑器脚本:
- 为
StoryTrigger补充无参构造函数,移除public字段上多余的[SerializeField]特性,调整后的代码如下:
namespace VisualNovelScripting { [System.Serializable] public class StoryTrigger { public string triggerName; public bool value; // 供Unity序列化系统使用的无参构造,必须显式声明 public StoryTrigger() { } public StoryTrigger(string name, bool value = false) { triggerName = name; this.value = value; } // 重写ToString方法,让列表元素直接显示触发器名称,替代默认的"Element X"文本 public override string ToString() { return string.IsNullOrEmpty(triggerName) ? "未命名触发器" : triggerName; } } }
- 回到Unity编辑器等待脚本编译完成,选中对应ScriptableObject资源查看Inspector,列表元素会直接以你设置的
triggerName作为折叠标题,字段错位问题会直接消失,增删改操作可以正常使用。
如果需要更紧凑的排版(比如把触发器名称输入框和布尔勾选框放在同一行减少纵向空间占用),可以额外编写一个针对StoryTrigger的PropertyDrawer做自定义渲染,这属于可选优化,不影响核心功能使用。
内容的提问来源于stack exchange,提问作者Gustavo HK
相关产品推荐
相关产品推荐

