Yuri-IL的解析
定义
Yuri引擎会在启动游戏的时候解析所有的Yuri-IL中间代码文件,恢复动作流程图,进行指令索引,并加载初始场景到调用堆栈。
IL对象的数据结构
动作包装SceneAction
| 字段名 | 类型 | 备注 | 
|---|---|---|
| NodeName | String | 节点名称(场景名_脚本中行号) | 
| Type | SActionType | 动作类型 | 
| ArgsDict | Dictionary | 参数字典(K:参数名;V:参数的逆波兰式) | 
| CondPolish | String | 条件子句的逆波兰式 | 
| Next | SceneAction | 下一指令指针 | 
| TrueRouting | List | 真值子路径 | 
| FalseRouting | List | 假值子路径 | 
| IsBelongFunc | Boolean | 是否是函数动作 | 
| ReliedFuncName | String | 包装该动作的函数名 | 
| Tag | String | 附加值 | 
函数包装SceneFunction
| 字段名 | 类型 | 备注 | 
|---|---|---|
| Sa | SceneAction | 函数动作序列入口 | 
| Callname | String | 函数名 | 
| Param | List | 形参名字列表 | 
| ParentSceneName | String | 函数所属场景的名字 | 
| Symbols | Dictionary | 函数的符号表,即运行时上下文容器 | 
| LabelDictionary | Dictionay | 标签字典 | 
场景包装Scene
| 字段名 | 类型 | 备注 | 
|---|---|---|
| Ctor | SceneAction | 场景动作序列入口 | 
| Scenario | String | 场景名 | 
| YuriDict | Dictionary | 动作索引 | 
| FuncContainer | List | 场景子函数向量 | 
| ParallellerContainer | List | 场景并行处理函数向量 | 
| LabelDictionary | Dictionay | 标签字典 | 
将IL恢复为内存对象
Yuri引擎负责解析Yuri-IL中间代码的模块是Yuri.PlatformCore.VM.ILConvertor,它按照如下逻辑进行解析工作:
- 检索脚本目录下所有的中间代码文件,以“.SIL”后缀名结束的文件,将读入的文件做行分割
 - 顺序遍历行分割的结果,将分割的行对象按场景按照行在文件里的顺序组织好
 - 对每个场景下的行,抽取其在全局脚本中的唯一编号来恢复代码逻辑关系。其过程是以这样的顺序做广度优先遍历:
- 恢复该中间代码行为一个动作序列
SceneAction对象 - 标记该行是脏的,即以后不再考虑这个行,也不从这个行继续搜索
 - 如果该对象是一个标签指令,那么记录它的位置
 - 处理该对象的Next指针,即下一指令指针
 - 处理该对象的真值路径TrueRouting,即该动作节点的子路径,在IF结构中,它是条件为真时的语句块;在FOR结构中,它是循环体语句块。
 - 处理该对象的假值路径FalseRouting,即该动作节点的条件子句不满足时的子路径。 在IF结构中,它是条件为假时的语句块。
 
 - 恢复该中间代码行为一个动作序列
 - 将处理完毕的动作序列包装成函数对象
SceneFunction和场景对象Scene 
注意资源必须被放置在正确的目录下才能被引擎正确地引用。
程序集信息
| Property | Value | 
|---|---|
| 层次结构 | Yuri.PlatformCore.VM.ILConvertor | 
| 最低版本 | 1.0 | 
| 并行安全 | 否 |