docs(scripting): add baseline api reference and guide
This commit is contained in:
@@ -0,0 +1,22 @@
|
||||
# MonoScriptRuntime::Constructor
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `constructor`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
explicit MonoScriptRuntime(Settings settings = {});
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 保存传入的 `Settings`。
|
||||
- 立即调用内部 `ResolveSettings()`,补全程序集目录和默认路径。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Initialize](Initialize.md)
|
||||
@@ -0,0 +1,31 @@
|
||||
# MonoScriptRuntime::CreateManagedComponentWrapper
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
MonoObject* CreateManagedComponentWrapper(
|
||||
MonoClass* componentClass,
|
||||
uint64_t gameObjectUUID);
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 只有在运行时已初始化、`componentClass` 非空且 `gameObjectUUID` 非零时才继续。
|
||||
- 查找目标托管包装类型的单参构造函数。
|
||||
- 创建托管对象。
|
||||
- 以 `gameObjectUUID` 作为构造参数调用该对象构造函数。
|
||||
- 如果托管构造抛异常,会记录异常并返回 `nullptr`。
|
||||
|
||||
## 用途
|
||||
|
||||
当前主要服务于 internal call,例如从托管脚本中获取 `Transform`、`Camera`、`Light` 等原生组件包装对象。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [TryGetFieldValue](TryGetFieldValue.md)
|
||||
@@ -0,0 +1,34 @@
|
||||
# MonoScriptRuntime::CreateScriptInstance
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool CreateScriptInstance(
|
||||
const ScriptRuntimeContext& context) override;
|
||||
```
|
||||
|
||||
## 当前实现流程
|
||||
|
||||
1. 若 `context.component` 为空,失败并记录错误。
|
||||
2. 若该实例已存在,直接返回 `true`。
|
||||
3. 若运行时尚未初始化,先调用 [Initialize](Initialize.md)。
|
||||
4. 根据组件的程序集名、命名空间和类名查找类元数据;程序集名为空时回退到 `Settings::appAssemblyName`。
|
||||
5. 在 app domain 中创建托管对象并执行默认构造。
|
||||
6. 写入上下文字段:`gameObjectUUID` 与 `scriptComponentUUID`。
|
||||
7. 把 `ScriptFieldStorage` 中能匹配上的字段写入托管对象。
|
||||
8. 创建 `gcHandle` 并写入实例缓存。
|
||||
|
||||
## 失败路径
|
||||
|
||||
类不存在、分配失败、上下文字段写入失败、存储字段应用失败时都会返回 `false` 并更新 `m_lastError`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [DestroyScriptInstance](DestroyScriptInstance.md)
|
||||
- [SyncManagedFieldsToStorage](SyncManagedFieldsToStorage.md)
|
||||
@@ -0,0 +1,24 @@
|
||||
# MonoScriptRuntime::DestroyScriptInstance
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
void DestroyScriptInstance(
|
||||
const ScriptRuntimeContext& context) override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 通过 `(gameObjectUUID, scriptComponentUUID)` 找到实例缓存。
|
||||
- 若有 `gcHandle`,先释放它。
|
||||
- 再从实例缓存表删除该项。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [CreateScriptInstance](CreateScriptInstance.md)
|
||||
@@ -0,0 +1,21 @@
|
||||
# MonoScriptRuntime::~MonoScriptRuntime
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `destructor`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
~MonoScriptRuntime() override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
析构时直接调用 [Shutdown](Shutdown.md)。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Shutdown](Shutdown.md)
|
||||
@@ -0,0 +1,22 @@
|
||||
# MonoScriptRuntime::GetLastError
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
const std::string& GetLastError() const;
|
||||
```
|
||||
|
||||
## 当前语义
|
||||
|
||||
返回最近一次初始化、类发现、实例创建或托管调用失败时记录的错误信息。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Initialize](Initialize.md)
|
||||
- [CreateScriptInstance](CreateScriptInstance.md)
|
||||
@@ -0,0 +1,21 @@
|
||||
# MonoScriptRuntime::GetManagedInstanceCount
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
size_t GetManagedInstanceCount() const;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
直接返回实例缓存表大小。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [HasManagedInstance](HasManagedInstance.md)
|
||||
@@ -0,0 +1,26 @@
|
||||
# MonoScriptRuntime::GetManagedInstanceObject
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
MonoObject* GetManagedInstanceObject(
|
||||
const ScriptComponent* component) const;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
通过实例缓存查找并用 `mono_gchandle_get_target()` 取回托管对象指针。
|
||||
|
||||
## 注意事项
|
||||
|
||||
这是诊断和桥接接口,不是高层推荐业务 API。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [HasManagedInstance](HasManagedInstance.md)
|
||||
@@ -0,0 +1,25 @@
|
||||
# MonoScriptRuntime::GetScriptClassNames
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
std::vector<std::string> GetScriptClassNames(
|
||||
const std::string& assemblyName = std::string()) const;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 遍历内部类缓存。
|
||||
- 若传了 `assemblyName`,只返回该程序集中的类。
|
||||
- 返回值会在最后排序。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [IsClassAvailable](IsClassAvailable.md)
|
||||
- [TryGetClassFieldMetadata](TryGetClassFieldMetadata.md)
|
||||
@@ -0,0 +1,21 @@
|
||||
# MonoScriptRuntime::HasManagedInstance
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool HasManagedInstance(const ScriptComponent* component) const;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
查询实例缓存并检查对应 `gcHandle` 能否取回托管对象。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [GetManagedInstanceObject](GetManagedInstanceObject.md)
|
||||
@@ -0,0 +1,34 @@
|
||||
# MonoScriptRuntime::Initialize
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool Initialize();
|
||||
```
|
||||
|
||||
## 当前实现流程
|
||||
|
||||
1. 重新 `ResolveSettings()`。
|
||||
2. 清空 `m_lastError`。
|
||||
3. 若已初始化,直接返回 `true`。
|
||||
4. 初始化 Mono root domain。
|
||||
5. 创建 app domain。
|
||||
6. 加载核心程序集和游戏程序集。
|
||||
7. 发现脚本类并建立缓存。
|
||||
8. 成功后置 `m_initialized = true`。
|
||||
|
||||
## 失败处理
|
||||
|
||||
- 若加载程序集或类发现失败,会销毁 app domain。
|
||||
- 失败原因会写入 `m_lastError`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Shutdown](Shutdown.md)
|
||||
- [GetLastError](GetLastError.md)
|
||||
@@ -0,0 +1,34 @@
|
||||
# MonoScriptRuntime::InvokeMethod
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
void InvokeMethod(
|
||||
const ScriptRuntimeContext& context,
|
||||
ScriptLifecycleMethod method,
|
||||
float deltaTime) override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 先找实例缓存和类元数据。
|
||||
- 再从类元数据里取出对应生命周期方法指针。
|
||||
- 若方法不存在,直接返回,不视为错误。
|
||||
- 调用前暂存当前 internal call 的 `deltaTime`。
|
||||
- 把本次 `deltaTime` 写入 internal call 全局状态。
|
||||
- 调用托管方法。
|
||||
- 调用后恢复旧的 `deltaTime`。
|
||||
|
||||
## 设计意义
|
||||
|
||||
这说明当前托管 `Time.deltaTime` 一类能力,并不是通过每次参数注入,而是通过 internal call 共享状态提供。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [IScriptRuntime::InvokeMethod](../../IScriptRuntime/InvokeMethod.md)
|
||||
@@ -0,0 +1,24 @@
|
||||
# MonoScriptRuntime::IsClassAvailable
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool IsClassAvailable(
|
||||
const std::string& assemblyName,
|
||||
const std::string& namespaceName,
|
||||
const std::string& className) const;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
通过内部类缓存查找 `assembly|fullName` 组合键,存在则返回 `true`。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [GetScriptClassNames](GetScriptClassNames.md)
|
||||
@@ -0,0 +1,86 @@
|
||||
# MonoScriptRuntime
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `class`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
**描述**: 基于 Mono 的脚本运行时实现,负责程序集加载、类发现、实例创建、internal call 桥接和生命周期调用。
|
||||
|
||||
## 概览
|
||||
|
||||
`MonoScriptRuntime` 是当前唯一的真实托管脚本后端。它把 `ScriptEngine` 提供的抽象调用翻译成 Mono 世界里的具体动作:
|
||||
|
||||
- 初始化 root domain 和 app domain。
|
||||
- 加载脚本核心程序集与游戏程序集。
|
||||
- 发现继承 `MonoBehaviour` 的可用脚本类。
|
||||
- 构建类元数据缓存。
|
||||
- 创建和销毁脚本实例。
|
||||
- 通过 internal call 让托管脚本访问原生 `GameObject`、`Transform`、`Camera` 等能力。
|
||||
|
||||
## 生命周期
|
||||
|
||||
- 构造时接收一份 `Settings`,并做路径补全。
|
||||
- [Initialize](Initialize.md) 会完成完整 Mono 初始化流程。
|
||||
- [Shutdown](Shutdown.md) 会销毁 app domain、清空类缓存与实例缓存。
|
||||
- 析构会自动调用 `Shutdown()`。
|
||||
|
||||
## 常用访问器
|
||||
|
||||
- `IsInitialized()`
|
||||
- `GetSettings()`
|
||||
- `GetLastError()`
|
||||
|
||||
这些访问器主要用于测试、诊断和工具层。当前文档对 `GetLastError()` 单独补页,因为它直接关系到失败排查。
|
||||
|
||||
## 设计要点
|
||||
|
||||
- `ScriptEngine` 不直接碰 Mono API;所有后端细节收敛在这个类里。
|
||||
- 类缓存和实例缓存都基于稳定键,便于场景重建和脚本回绑。
|
||||
- internal call 注册集中在本实现里,说明当前托管 API 面是围绕 Mono 后端组织的,而不是独立脚本 ABI。
|
||||
|
||||
## 当前实现边界
|
||||
|
||||
- 当前只发现应用程序集中的非抽象 `MonoBehaviour` 子类。
|
||||
- 支持的公共字段类型只覆盖 `float / double / bool / int32 / uint64 / string / Vector2 / Vector3 / Vector4 / GameObject`。
|
||||
- `SyncManagedFieldsToStorage()` 只会回写已经存在于 `ScriptFieldStorage` 中的字段;运行时临时字段不会自动持久化。
|
||||
- `OnRuntimeStop()` 只清理当前活动场景与实例,不会做完整 `Shutdown()`。
|
||||
|
||||
## 公开方法
|
||||
|
||||
| 方法 | 说明 |
|
||||
|------|------|
|
||||
| [Constructor](Constructor.md) | 创建 Mono 运行时对象并解析设置。 |
|
||||
| [Destructor](Destructor.md) | 析构时执行 `Shutdown()`。 |
|
||||
| [Initialize](Initialize.md) | 初始化 Mono 域并发现脚本类。 |
|
||||
| [Shutdown](Shutdown.md) | 关闭当前 Mono 运行时。 |
|
||||
| [GetLastError](GetLastError.md) | 读取最近一次错误描述。 |
|
||||
| [IsClassAvailable](IsClassAvailable.md) | 查询脚本类是否已发现。 |
|
||||
| [GetScriptClassNames](GetScriptClassNames.md) | 返回已发现脚本类名列表。 |
|
||||
| [TryGetClassFieldMetadata](TryGetClassFieldMetadata.md) | 读取脚本类字段元数据。 |
|
||||
| [HasManagedInstance](HasManagedInstance.md) | 判断某脚本组件是否已有托管实例。 |
|
||||
| [GetManagedInstanceCount](GetManagedInstanceCount.md) | 返回当前托管实例数。 |
|
||||
| [GetManagedInstanceObject](GetManagedInstanceObject.md) | 读取托管对象裸指针。 |
|
||||
| [CreateManagedComponentWrapper](CreateManagedComponentWrapper.md) | 为原生组件创建托管包装对象。 |
|
||||
| [TryGetFieldValue](TryGetFieldValue.md) | 直接读取托管实例字段。 |
|
||||
| [OnRuntimeStart](OnRuntimeStart.md) | 启动脚本运行时上下文。 |
|
||||
| [OnRuntimeStop](OnRuntimeStop.md) | 停止当前运行场景的托管上下文。 |
|
||||
| [TrySetManagedFieldValue](TrySetManagedFieldValue.md) | 写托管字段。 |
|
||||
| [TryGetManagedFieldValue](TryGetManagedFieldValue.md) | 读托管字段。 |
|
||||
| [SyncManagedFieldsToStorage](SyncManagedFieldsToStorage.md) | 回写本地字段缓存。 |
|
||||
| [CreateScriptInstance](CreateScriptInstance.md) | 创建脚本实例。 |
|
||||
| [DestroyScriptInstance](DestroyScriptInstance.md) | 销毁脚本实例。 |
|
||||
| [InvokeMethod](InvokeMethod.md) | 调用生命周期方法。 |
|
||||
|
||||
## 真实行为依据
|
||||
|
||||
- `engine/src/Scripting/Mono/MonoScriptRuntime.cpp`
|
||||
- `tests/scripting/test_mono_script_runtime.cpp`
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Mono](../Mono.md)
|
||||
- [IScriptRuntime](../../IScriptRuntime/IScriptRuntime.md)
|
||||
- [ScriptEngine](../../ScriptEngine/ScriptEngine.md)
|
||||
- [Scripting Runtime And Field Model](../../../../_guides/Scripting/Scripting-Runtime-And-Field-Model.md)
|
||||
@@ -0,0 +1,27 @@
|
||||
# MonoScriptRuntime::OnRuntimeStart
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
void OnRuntimeStart(Components::Scene* scene) override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 先把 `m_activeScene` 清空,并把 internal call 的 `deltaTime` 重置为 `0`。
|
||||
- 调用 [Initialize](Initialize.md)。
|
||||
- 初始化成功后,把 `m_activeScene` 和 internal call 场景都指向当前 `scene`。
|
||||
|
||||
## 设计意义
|
||||
|
||||
这一步的重点不是创建所有脚本实例,而是让 Mono 后端进入“可服务当前场景”的状态。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [OnRuntimeStop](OnRuntimeStop.md)
|
||||
@@ -0,0 +1,28 @@
|
||||
# MonoScriptRuntime::OnRuntimeStop
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
void OnRuntimeStop(Components::Scene* scene) override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 忽略传入场景参数。
|
||||
- 清空托管实例缓存。
|
||||
- 清空活动场景和 internal call 场景。
|
||||
- 把 internal call 的 `deltaTime` 重置为 `0`。
|
||||
|
||||
## 注意事项
|
||||
|
||||
它不会执行完整 [Shutdown](Shutdown.md),因此类缓存和 Mono 域仍然保留。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [Shutdown](Shutdown.md)
|
||||
@@ -0,0 +1,30 @@
|
||||
# MonoScriptRuntime::Shutdown
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
void Shutdown();
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 清空托管实例缓存。
|
||||
- 清空类缓存。
|
||||
- 清空所有 Mono 相关指针成员。
|
||||
- 销毁 app domain。
|
||||
- 重置活动场景和 internal call 上下文。
|
||||
- 把 `m_initialized` 置回 `false`。
|
||||
|
||||
## 注意事项
|
||||
|
||||
`OnRuntimeStop()` 不等价于 `Shutdown()`;前者更像运行场景停止,后者则是整个 Mono 运行时关闭。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [OnRuntimeStop](OnRuntimeStop.md)
|
||||
@@ -0,0 +1,32 @@
|
||||
# MonoScriptRuntime::SyncManagedFieldsToStorage
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
void SyncManagedFieldsToStorage(
|
||||
const ScriptRuntimeContext& context) override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 要求 `context.component`、实例缓存和类元数据都存在。
|
||||
- 只遍历当前 `ScriptFieldStorage` 里已经存在的字段名。
|
||||
- 只有字段名存在于类元数据中且类型匹配,才会从托管对象读回并写回本地缓存。
|
||||
|
||||
## 重要边界
|
||||
|
||||
这意味着:
|
||||
|
||||
- 托管运行时中新出现但本地没存过的字段,不会自动持久化。
|
||||
- 本地字段类型如果和类定义不匹配,也不会被强行覆盖。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [CreateScriptInstance](CreateScriptInstance.md)
|
||||
- [ScriptFieldStorage](../../ScriptFieldStorage/ScriptFieldStorage.md)
|
||||
@@ -0,0 +1,36 @@
|
||||
# MonoScriptRuntime::TryGetClassFieldMetadata
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool TryGetClassFieldMetadata(
|
||||
const std::string& assemblyName,
|
||||
const std::string& namespaceName,
|
||||
const std::string& className,
|
||||
std::vector<ScriptFieldMetadata>& outFields) const override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 先查找类缓存。
|
||||
- 找不到返回 `false` 并清空输出。
|
||||
- 找到后把缓存中的字段元数据复制到 `outFields`。
|
||||
- 最终按字段名排序。
|
||||
|
||||
## 字段来源边界
|
||||
|
||||
当前只会收录:
|
||||
|
||||
- 公共实例字段
|
||||
- 非静态字段
|
||||
- 可映射到当前支持脚本字段类型的字段
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [IScriptRuntime::TryGetClassFieldMetadata](../../IScriptRuntime/TryGetClassFieldMetadata.md)
|
||||
@@ -0,0 +1,30 @@
|
||||
# MonoScriptRuntime::TryGetFieldValue
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool TryGetFieldValue(
|
||||
const ScriptComponent* component,
|
||||
const std::string& fieldName,
|
||||
ScriptFieldValue& outValue) const;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 先通过组件找到实例缓存。
|
||||
- 再检查类元数据中是否存在该字段。
|
||||
- 成功时直接从托管对象读出字段值。
|
||||
|
||||
## 与 `TryGetManagedFieldValue` 的区别
|
||||
|
||||
这个接口用 `ScriptComponent*` 作为入口,更适合测试和诊断;`TryGetManagedFieldValue()` 则是实现 `IScriptRuntime` 接口的标准路径。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [TryGetManagedFieldValue](TryGetManagedFieldValue.md)
|
||||
@@ -0,0 +1,28 @@
|
||||
# MonoScriptRuntime::TryGetManagedFieldValue
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool TryGetManagedFieldValue(
|
||||
const ScriptRuntimeContext& context,
|
||||
const std::string& fieldName,
|
||||
ScriptFieldValue& outValue) const override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
和写路径类似:
|
||||
|
||||
- 先找实例缓存。
|
||||
- 再找字段元数据。
|
||||
- 成功后直接从托管对象字段读出当前值。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [TrySetManagedFieldValue](TrySetManagedFieldValue.md)
|
||||
@@ -0,0 +1,27 @@
|
||||
# MonoScriptRuntime::TrySetManagedFieldValue
|
||||
|
||||
**命名空间**: `XCEngine::Scripting`
|
||||
|
||||
**类型**: `method`
|
||||
|
||||
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
||||
|
||||
## 签名
|
||||
|
||||
```cpp
|
||||
bool TrySetManagedFieldValue(
|
||||
const ScriptRuntimeContext& context,
|
||||
const std::string& fieldName,
|
||||
const ScriptFieldValue& value) override;
|
||||
```
|
||||
|
||||
## 当前实现行为
|
||||
|
||||
- 先用 `context` 找到实例缓存。
|
||||
- 再在类元数据里查字段。
|
||||
- 字段不存在或类型不兼容则失败。
|
||||
- 成功时把原生值写进托管对象字段。
|
||||
|
||||
## 相关文档
|
||||
|
||||
- [TryGetManagedFieldValue](TryGetManagedFieldValue.md)
|
||||
Reference in New Issue
Block a user