62 lines
2.6 KiB
Markdown
62 lines
2.6 KiB
Markdown
# NullScriptRuntime
|
|
|
|
**命名空间**: `XCEngine::Scripting`
|
|
|
|
**类型**: `class`
|
|
|
|
**头文件**: `XCEngine/Scripting/NullScriptRuntime.h`
|
|
|
|
**描述**: `IScriptRuntime` 的空实现,用作无托管环境时的默认兜底后端。
|
|
|
|
## 概览
|
|
|
|
`NullScriptRuntime` 的职责不是执行脚本,而是在“没有真实托管环境”时维持脚本系统接口闭合:
|
|
|
|
- `ScriptEngine` 默认就持有它,因此不会出现运行时指针为空的问题。
|
|
- `ScriptComponent`、`ScriptFieldStorage`、场景序列化和字段编辑流程都仍然可以工作。
|
|
- 编辑器或测试可以先走完整的脚本数据链路,再按需接入真实 Mono 后端。
|
|
|
|
这是标准的 Null Object 模式,但它的“成功”语义必须按真实实现理解。
|
|
|
|
## 当前实现行为
|
|
|
|
- 运行时启停是 no-op。
|
|
- 可用脚本类查询总是失败,并清空输出数组。
|
|
- 元数据查询总是失败,并清空输出数组。
|
|
- 默认值查询总是失败,并清空输出数组。
|
|
- 托管写字段总是返回 `true`,相当于“我接受这个请求,但没有实际后端可写”。
|
|
- 托管读字段总是返回 `false`。
|
|
- 同步字段是 no-op。
|
|
- 创建实例时,只要 `context.component` 非空就返回 `true`。
|
|
- 销毁实例和生命周期调用都是 no-op。
|
|
|
|
## 设计代价
|
|
|
|
这种兜底方案能让主流程更简单,但也意味着:
|
|
|
|
- “返回成功”不一定真的代表有托管实例存在。
|
|
- 如果用户误以为自己接了真实脚本后端,问题会更偏逻辑层而不是崩溃层暴露出来。
|
|
|
|
因此文档必须清楚说明它是占位运行时,而不是简化版脚本解释器。
|
|
|
|
## 公开方法
|
|
|
|
| 方法 | 说明 |
|
|
|------|------|
|
|
| [OnRuntimeStart](OnRuntimeStart.md) | 空实现。 |
|
|
| [OnRuntimeStop](OnRuntimeStop.md) | 空实现。 |
|
|
| [TryGetAvailableScriptClasses](TryGetAvailableScriptClasses.md) | 始终失败并清空输出。 |
|
|
| [TryGetClassFieldMetadata](TryGetClassFieldMetadata.md) | 始终失败并清空输出。 |
|
|
| [TryGetClassFieldDefaultValues](TryGetClassFieldDefaultValues.md) | 始终失败并清空输出。 |
|
|
| [TrySetManagedFieldValue](TrySetManagedFieldValue.md) | 始终返回 `true`。 |
|
|
| [TryGetManagedFieldValue](TryGetManagedFieldValue.md) | 始终返回 `false`。 |
|
|
| [SyncManagedFieldsToStorage](SyncManagedFieldsToStorage.md) | 空实现。 |
|
|
| [CreateScriptInstance](CreateScriptInstance.md) | 仅检查组件指针是否存在。 |
|
|
| [DestroyScriptInstance](DestroyScriptInstance.md) | 空实现。 |
|
|
| [InvokeMethod](InvokeMethod.md) | 空实现。 |
|
|
|
|
## 相关文档
|
|
|
|
- [IScriptRuntime](../IScriptRuntime/IScriptRuntime.md)
|
|
- [ScriptEngine](../ScriptEngine/ScriptEngine.md)
|