5.9 KiB
5.9 KiB
ScriptEngine
命名空间: XCEngine::Scripting
类型: class (singleton)
头文件: XCEngine/Scripting/ScriptEngine.h
描述: 当前脚本系统的总调度器,负责运行时启停、脚本实例追踪、生命周期调用、脚本类发现和字段模型拼装。
概览
ScriptEngine 是当前脚本模块里最重要的原生协调者。它自己不执行脚本字节码,也不保存场景数据,而是负责把下面几层真正串起来:
SceneRuntime提供“场景开始运行/停止运行/每帧更新”的入口。ScriptComponent提供脚本绑定与字段缓存。IScriptRuntime提供具体脚本后端能力。
当前它的核心职责包括:
- 在运行时开始时收集场景中的脚本组件并建立追踪表。
- 订阅
Scene::OnGameObjectCreated(),把运行中创建的新对象也纳入脚本追踪。 - 根据对象激活状态、组件启用状态和脚本类绑定状态决定脚本是否应当运行。
- 按顺序创建实例、调用
Awake / OnEnable / Start / Update...。 - 在运行时字段、本地字段缓存、类元数据和类默认值之间建立一致的读取模型。
- 为编辑器/Inspector 提供脚本类列表、字段模型、批量写入和清除覆盖能力。
生命周期
- Get 返回进程级单例。
- 默认运行时是内部持有的
NullScriptRuntime。 - SetRuntime 可替换具体后端;传
nullptr时回退到空运行时。 - OnRuntimeStart / OnRuntimeStop 管理整条脚本运行链路。
内部追踪模型
当前 ScriptEngine 通过 (gameObjectUUID, scriptComponentUUID) 唯一标识一个脚本实例状态,并保存:
contextinstanceCreatedawakeCalledenabledstartCalledstartPending
这说明当前生命周期状态是显式状态机,而不是每次调用都从托管世界反查。
脚本类与字段模型
除了生命周期调度,ScriptEngine 还负责把运行时暴露成编辑器可消费的数据接口:
TryGetAvailableScriptClasses()返回排序后的ScriptClassDescriptor列表,并可按程序集过滤。TryGetScriptFieldModel()会把类声明字段、运行时默认值、存储覆盖值和活体托管值融合成ScriptFieldModel。ApplyScriptFieldWrites()会逐项返回Applied / UnknownField / TypeMismatch / StoredOnlyField等状态。ClearScriptFieldOverrides()会把声明字段重置回类默认值,并删除本地存储中的覆盖项。
这也是当前 Inspector 和脚本字段编辑工具最该依赖的 API 面。
线程语义
- 当前实现没有锁。
- 应视为主线程运行时服务。
- 不应该在并发线程里同时改脚本组件集合和驱动脚本生命周期。
当前实现边界
- 只跟踪当前运行场景里的脚本组件。
Start生命周期会在第一次OnUpdate()前补发一次,而不是在OnRuntimeStart()里立即调用。TrySetScriptFieldValue()只有在后端能返回类字段元数据时,才会强校验字段名和类型;否则会退回到纯本地存储写入。TryGetScriptFieldModel()会优先使用运行时返回的类默认值,而不是简单地把每种类型置零。TryGetScriptFieldSnapshots()在模型成功但字段为空时会返回false,调用方不能把“返回false”简单等同于“接口失败”。
常用访问器
GetRuntime()IsRuntimeRunning()GetRuntimeScene()
这些是简单内联访问器,当前文档重点放在影响状态机和运行行为的核心方法上。
公开方法
| 方法 | 说明 |
|---|---|
| Get | 获取全局脚本引擎实例。 |
| SetRuntime | 设置具体脚本后端。 |
| OnRuntimeStart | 启动脚本运行时。 |
| OnRuntimeStop | 停止脚本运行时。 |
| OnFixedUpdate | 驱动固定步长脚本更新。 |
| OnUpdate | 驱动常规逐帧更新,并补发 Start。 |
| OnLateUpdate | 驱动后更新。 |
| OnScriptComponentEnabled | 处理脚本组件启用事件。 |
| OnScriptComponentDisabled | 处理脚本组件禁用事件。 |
| OnScriptComponentDestroyed | 处理脚本组件销毁事件。 |
| OnScriptComponentClassChanged | 处理脚本类绑定变化,销毁旧实例并按新类重建跟踪。 |
| HasTrackedScriptComponent | 查询某组件是否被跟踪。 |
| HasRuntimeInstance | 查询某组件是否已有运行时实例。 |
| GetTrackedScriptCount | 返回当前跟踪脚本数。 |
| TryGetAvailableScriptClasses | 返回可绑定脚本类列表。 |
| TrySetScriptFieldValue | 写脚本字段。 |
| TryGetScriptFieldValue | 读脚本字段。 |
| ApplyScriptFieldWrites | 批量写脚本字段并返回逐项状态。 |
| ClearScriptFieldOverrides | 批量清理字段覆盖并恢复默认值。 |
| TryGetScriptFieldModel | 构建完整字段模型。 |
| TryGetScriptFieldSnapshots | 直接返回字段快照数组。 |
真实行为依据
engine/src/Scripting/ScriptEngine.cpptests/scripting/test_script_engine.cpptests/Scene/test_scene_runtime.cpptests/scripting/test_mono_script_runtime.cpp