2026-04-02 22:23:29 +08:00
|
|
|
# MonoScriptRuntime::TryGetAvailableScriptClasses
|
|
|
|
|
|
|
|
|
|
**命名空间**: `XCEngine::Scripting`
|
|
|
|
|
|
|
|
|
|
**类型**: `method`
|
|
|
|
|
|
|
|
|
|
**头文件**: `XCEngine/Scripting/Mono/MonoScriptRuntime.h`
|
|
|
|
|
|
|
|
|
|
## 签名
|
|
|
|
|
|
|
|
|
|
```cpp
|
|
|
|
|
bool TryGetAvailableScriptClasses(
|
|
|
|
|
std::vector<ScriptClassDescriptor>& outClasses) const override;
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
## 当前实现流程
|
|
|
|
|
|
|
|
|
|
1. 清空 `outClasses`。
|
|
|
|
|
2. 若运行时尚未初始化,直接返回 `false`。
|
|
|
|
|
3. 遍历 `m_classes` 缓存,把每个条目转换成 `ScriptClassDescriptor`。
|
|
|
|
|
4. 按 `assemblyName -> namespaceName -> className` 排序后返回。
|
|
|
|
|
|
|
|
|
|
## 返回内容边界
|
|
|
|
|
|
|
|
|
|
- 只来自当前已发现的应用程序集脚本类缓存。
|
|
|
|
|
- 不包含抽象类。
|
|
|
|
|
- 不包含非 `MonoBehaviour` 子类。
|
2026-04-03 15:48:09 +08:00
|
|
|
- 不会在这里重新加载程序集或重新做类型扫描;发现动作发生在 `Initialize()` 期间。
|
|
|
|
|
- 当前写入到 `descriptor.assemblyName` 的值来自 `m_settings.appAssemblyName`。
|
|
|
|
|
|
|
|
|
|
## 为什么这个列表可以直接给 UI 用
|
|
|
|
|
|
|
|
|
|
当前实现已经在运行时层做了稳定排序,因此:
|
|
|
|
|
|
|
|
|
|
- `GetScriptClassNames()` 可以直接在此基础上再做一层字符串提取。
|
|
|
|
|
- `ScriptEngine::TryGetAvailableScriptClasses()` 也只需要再补一层程序集过滤和空类名剔除。
|
|
|
|
|
- Inspector 下拉框或脚本选择器不需要自己再去理解 Mono 反射细节。
|
|
|
|
|
|
|
|
|
|
## 真实行为依据
|
|
|
|
|
|
|
|
|
|
- `engine/src/Scripting/Mono/MonoScriptRuntime.cpp`
|
|
|
|
|
- `tests/scripting/test_mono_script_runtime.cpp`
|
|
|
|
|
- `tests/scripting/test_project_script_assembly.cpp`
|
2026-04-02 22:23:29 +08:00
|
|
|
|
|
|
|
|
## 相关文档
|
|
|
|
|
|
|
|
|
|
- [MonoScriptRuntime](MonoScriptRuntime.md)
|
|
|
|
|
- [ScriptEngine::TryGetAvailableScriptClasses](../../ScriptEngine/TryGetAvailableScriptClasses.md)
|