@ao_serialize
@ao_serialize 注解控制哪些字段会被持久化,并可在检查器中编辑。
@ao_serialize 是你添加在 struct/class 字段上的注解,用于将它们纳入引擎的序列化系统。没有它,字段就只在运行时存在——不会被保存,不会显示在检查器中,也不会在场景写入磁盘时被包含进去。
Enemy :: class : Component {
// 已保存,在检查器中显示,包含在场景数据中
max_health: int @ao_serialize;
patrol_radius: float @ao_serialize;
// 仅运行时——不保存,不在检查器中
current_target: v2;
aggro_timer: float;
}
当你将一个字段标记为 @ao_serialize时,引擎将会:
在检查器中显示它 这样你就可以在编辑器中编辑实体上的该值。
将其包含在 JSON 序列化中 (Save.set_json / Save.try_get_json).
没有 @ao_serialize 的字段只在运行时占用内存。每次组件创建或场景加载时,它们都会以默认(零)值开始。
@ao_serialize 可用于所有常见的 CSL 类型:
最常见的用法是在组件字段上。这样这些字段就会在编辑器的检查器中可编辑,并作为场景的一部分被保存。
你可以在编辑器中为每个实体设置 容量, loot_table和 is_locked 。当场景加载时,这些值会自动恢复。
@ao_serialize 还控制你在使用 JSON 保存 API 时哪些字段会被包含。只有标记过的字段才会写入 JSON。
有关保存系统的完整细节,请参阅 保存系统 和 JSON 序列化.
你可以将任何带注解的类型序列化到/从 JSON 字符串,而不依赖保存系统:
在反序列化时,数据中缺失的字段(例如你在玩家已有存档后新增了一个字段)会被 零填充:
如果零不是合理的默认值,请在加载后检查并自行补上默认值:
并非每个字段都应该被序列化。不要在以下字段上使用 @ao_serialize :
一个好的经验法则是:如果某个值只设置一次(在编辑器中或加载时)且很少变化,就序列化它;如果它每帧都会重新计算,就不要序列化。
有些字段引用引擎资源(纹理、预制体、音效)。这些会被序列化为资源标识符,并在加载时自动解析。请参阅内置组件(例如 Sprite_Renderer)获取示例。