docs: update scripting API docs
This commit is contained in:
@@ -10,13 +10,14 @@
|
||||
|
||||
## 概览
|
||||
|
||||
`IScriptRuntime` 是 `ScriptEngine` 唯一应该依赖的脚本后端接口。它把脚本后端抽象成三类能力:
|
||||
`IScriptRuntime` 是 `ScriptEngine` 唯一应该直接依赖的脚本后端接口。当前这份契约覆盖四类能力:
|
||||
|
||||
- 运行时启停。
|
||||
- 托管类/字段元数据查询与字段读写。
|
||||
- 脚本实例创建销毁与生命周期方法调用。
|
||||
- 可用脚本类发现、字段元数据和默认值读取。
|
||||
- 托管字段读写与字段同步。
|
||||
- 脚本实例创建/销毁与生命周期方法调用。
|
||||
|
||||
这种设计让 `ScriptEngine` 能专注于“调度”,而把 Mono、GCHandle、程序集加载这些实现细节留给具体后端。
|
||||
这使得 `ScriptEngine` 只负责“什么时候该调什么”,而把 Mono 域、程序集加载、GCHandle 和 internal call 之类的细节留给具体实现。
|
||||
|
||||
## 公开概念
|
||||
|
||||
@@ -33,6 +34,18 @@
|
||||
- `OnDisable`
|
||||
- `OnDestroy`
|
||||
|
||||
### ScriptClassDescriptor
|
||||
|
||||
`ScriptClassDescriptor` 用来表示一个可绑定脚本类:
|
||||
|
||||
| 字段 | 说明 |
|
||||
|------|------|
|
||||
| `assemblyName` | 所属程序集,如默认的 `GameScripts`。 |
|
||||
| `namespaceName` | 托管命名空间,可为空。 |
|
||||
| `className` | 托管类名。 |
|
||||
|
||||
`GetFullName()` 会把命名空间和类名拼成 `Namespace.Class` 形式;`ScriptEngine::TryGetAvailableScriptClasses()` 会直接返回这一结构的排序结果。
|
||||
|
||||
### ScriptRuntimeContext
|
||||
|
||||
`ScriptRuntimeContext` 是后端执行脚本实例时的最小上下文:
|
||||
@@ -56,7 +69,9 @@
|
||||
|------|------|
|
||||
| [OnRuntimeStart](OnRuntimeStart.md) | 运行时开始时的后端入口。 |
|
||||
| [OnRuntimeStop](OnRuntimeStop.md) | 运行时停止时的后端入口。 |
|
||||
| [TryGetAvailableScriptClasses](TryGetAvailableScriptClasses.md) | 返回后端当前可绑定的脚本类列表。 |
|
||||
| [TryGetClassFieldMetadata](TryGetClassFieldMetadata.md) | 查询脚本类字段元数据。 |
|
||||
| [TryGetClassFieldDefaultValues](TryGetClassFieldDefaultValues.md) | 查询脚本类字段默认值。 |
|
||||
| [TrySetManagedFieldValue](TrySetManagedFieldValue.md) | 向托管实例写字段。 |
|
||||
| [TryGetManagedFieldValue](TryGetManagedFieldValue.md) | 从托管实例读字段。 |
|
||||
| [SyncManagedFieldsToStorage](SyncManagedFieldsToStorage.md) | 把托管字段同步回本地存储。 |
|
||||
@@ -64,6 +79,12 @@
|
||||
| [DestroyScriptInstance](DestroyScriptInstance.md) | 销毁脚本实例。 |
|
||||
| [InvokeMethod](InvokeMethod.md) | 调用生命周期方法。 |
|
||||
|
||||
## 当前契约边界
|
||||
|
||||
- 接口不承诺线程安全;当前调用点默认都在主线程。
|
||||
- 返回 `false` 可能代表类不存在、后端未初始化,或实现根本不支持该能力;调用方需要按方法语义区分。
|
||||
- `TryGetClassFieldDefaultValues()` 的默认值应反映托管类构造后的初始字段状态,而不只是原生类型零值。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [ScriptEngine](../ScriptEngine/ScriptEngine.md)
|
||||
|
||||
@@ -0,0 +1,30 @@
|
||||
# IScriptRuntime::TryGetAvailableScriptClasses
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/IScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
virtual bool TryGetAvailableScriptClasses(
|
||||
std::vector<ScriptClassDescriptor>& outClasses) const = 0;
|
||||
```
|
||||
|
||||
## 作用
|
||||
|
||||
返回当前后端已经发现、可以绑定给 `ScriptComponent` 的脚本类描述列表。
|
||||
|
||||
## 返回值语义
|
||||
|
||||
- 返回 `true`:后端支持类发现,且当前返回的数据可用。
|
||||
- 返回 `false`:后端未初始化、当前没有这项能力,或发现流程失败。
|
||||
|
||||
调用前实现应清空 `outClasses`;`ScriptEngine::TryGetAvailableScriptClasses()` 会在此基础上继续过滤空类名并排序。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [IScriptRuntime](IScriptRuntime.md)
|
||||
- [ScriptEngine::TryGetAvailableScriptClasses](../ScriptEngine/TryGetAvailableScriptClasses.md)
|
||||
@@ -0,0 +1,40 @@
|
||||
# IScriptRuntime::TryGetClassFieldDefaultValues
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/IScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
virtual bool TryGetClassFieldDefaultValues(
|
||||
const std::string& assemblyName,
|
||||
const std::string& namespaceName,
|
||||
const std::string& className,
|
||||
std::vector<ScriptFieldDefaultValue>& outFields) const = 0;
|
||||
```
|
||||
|
||||
## 作用
|
||||
|
||||
查询某个脚本类在初始状态下的字段默认值。
|
||||
|
||||
## 设计意义
|
||||
|
||||
这个接口不是简单返回“每种类型的零值”。当前 `ScriptEngine` 用它来:
|
||||
|
||||
- 构建 `ScriptFieldModel` 的 `defaultValue`
|
||||
- 在 `ClearScriptFieldOverrides()` 时把活体托管字段重置回类默认值
|
||||
|
||||
因此更合理的实现应该尽量反映托管类构造后的真实字段状态。
|
||||
|
||||
## 返回值语义
|
||||
|
||||
- 返回 `true`:后端确认类存在,并成功返回默认值列表。
|
||||
- 返回 `false`:类不存在、后端未初始化,或后端不支持默认值提取。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [TryGetClassFieldMetadata](TryGetClassFieldMetadata.md)
|
||||
- [ScriptEngine::TryGetScriptFieldModel](../ScriptEngine/TryGetScriptFieldModel.md)
|
||||
Reference in New Issue
Block a user