本文先从最基础的安装和初始化开始,目标是让一个空 Unity 工程能够正确接入 MyFramework,并生成默认启动环境。
项目地址:
https://github.com/ZHOURUIH/MyFramework
MyFramework 是以 Unity Package 形式接入的。安装完成以后,菜单栏会出现框架相关菜单,其中初始化入口在:
MyFramework/初始化/初始化框架MyFramework/初始化/初始化框架+HybridCLR+Obfuz
初始化逻辑会复制包内 ProjectTemplate~ 目录下的模板文件,创建运行时设置文件,修正输入系统配置,并把启动场景加入 Build Settings。普通初始化和热更初始化的入口都在 MenuInit 中,分别对应 初始化框架 和 初始化框架+HybridCLR+Obfuz 两个菜单。
一、安装 MyFramework
推荐通过 Unity Package Manager 安装。
打开 Unity 菜单:
Window/Package Manager点击左上角 +,选择:
Add package from git URL...填入:
https://gitee.com/inothingtodo/MyFramework.git?path=/Packages/com.zhourui.myframework安装完成以后,工程的 Packages 中会出现:
com.zhourui.myframework二、普通初始化
如果只是想先运行框架模板,不接入 HybridCLR 和 Obfuz,直接执行:
MyFramework/初始化/初始化框架这个菜单会完成几件事:
1. 修正 Active Input Handling2. 复制 ProjectTemplate~ 模板文件到工程目录3. 保存 FrameEditorSettings4. 创建 RuntimeSettings5. 刷新 AssetDatabase6. 自动挂接 GameEntry7. 添加启动场景到 Build Settings
初始化完成后,工程中会生成默认启动场景:
Assets/Resources/Scene/start.unity框架会在这个场景中查找根节点:
GameEntry然后把用户工程中的 GameEntry 脚本挂到这个节点上。
三、为什么会自动设置 Active Input Handling
MyFramework 默认启动场景仍然会使用旧输入接口:
UnityEngine.InputStandaloneInputModule
所以如果工程启用了 Unity 新输入系统,必须允许旧输入系统同时工作。
初始化时会自动尝试把:
Project Settings/Player/Active Input Handling设置为:
Both如果当前 Unity 版本没有找到对应设置,则需要手动修改。
四、初始化时复制了什么
初始化时,框架会从包内目录复制模板文件:
Packages/com.zhourui.myframework/ProjectTemplate~/复制目标是 Unity 工程根目录,并保持原有相对路径。
比如模板中如果有:
Assets/Scripts/Game/GameEntry.csAssets/Resources/Scene/start.unityAssets/Scripts/HotFix/HotFixEntry.cs
初始化后就会复制到工程对应目录。
如果目标文件已经存在,初始化会跳过,不会覆盖已有文件。
这个设计是为了避免重复初始化时把用户已经修改过的模板代码覆盖掉。
五、为什么有时初始化后要等 Unity 编译
如果复制的模板文件中包含这些类型:
.cs.asmdef.asmref.rsp
Unity 会触发脚本重新编译。
这时初始化流程不会立刻挂接 GameEntry,而是先记录一个等待标记,等 Unity 编译和 Domain Reload 完成后,再自动继续挂接。
所以执行初始化后,如果控制台出现类似提示:
MyFramework模板脚本已复制,等待Unity编译完成后自动挂接GameEntry这是正常情况。
等 Unity 编译完成后,框架会自动打开启动场景,找到 GameEntry 节点,并挂接 GameEntry 脚本。
六、启动场景会自动加入 Build Settings
初始化成功后,框架会把启动场景加入 Build Settings 第一位:
Assets/Resources/Scene/start.unity如果它已经存在于 Build Settings 中,则只会确保它处于启用状态。
如果不存在,则会插入到场景列表第一位。
这样做的目的是保证后续直接运行或打包时,入口场景是框架默认启动场景。
七、接入 HybridCLR + Obfuz 初始化
如果项目一开始就准备使用热更新和混淆,可以直接执行:
MyFramework/初始化/初始化框架+HybridCLR+Obfuz这个入口会在普通初始化基础上继续处理:
1. 安装 HybridCLR2. 安装 Obfuz3. 添加 USE_HYBRID_CLR 宏4. 添加 USE_OBFUZ 宏5. 等待 Unity 重新编译6. 写入 HybridCLR 设置7. 写入 Obfuz 设置
HybridCLR 和 Obfuz 的安装地址分别是:
https://gitee.com/focus-creative-games/hybridclr_unity.githttps://gitee.com/focus-creative-games/obfuz.git
初始化过程中如果 Unity 正在编译或刷新资源,流程会自动等待,不需要手动重复点击菜单。
八、HybridCLR 初始化会设置什么
启用 HybridCLR 后,框架会设置 AOT 引用生成路径:
Assets/Scripts/AutoGenerated/HybridCLRGenerate/AOTGenericReferences.cs同时会把热更新程序集加入 HybridCLR 设置:
Frame_HotFixHotFix
也就是说,框架默认把这两个程序集作为热更新程序集。
九、Obfuz 初始化会设置什么
启用 Obfuz 后,框架会设置生成文件路径:
Assets/Scripts/AutoGenerated/Obfuz/GeneratedEncryptionVirtualMachine.cs同时会把需要混淆的程序集设置为:
Frame_HotFixHotFix
并且会关闭对 Obfuz Runtime 自身的混淆,避免运行时被错误处理。
十、初始化失败时先检查这些点
如果初始化失败,通常先检查下面几项:
1. Packages/com.zhourui.myframework/ProjectTemplate~/ 是否存在2. Assets/Resources/Scene/start.unity 是否生成3. start.unity 根节点下是否有 GameEntry 节点4. 工程中是否存在 GameEntry 脚本5. Unity 是否还在编译或刷新资源6. 是否取消了保存当前场景
如果控制台提示:
未找到GameEntry类型通常是 Unity 还没完成编译,等待编译结束即可。
如果提示:
启动场景中未找到根节点: GameEntry需要检查 start.unity 中是否存在名为 GameEntry 的根节点。
十一、初始化完成后的结果
初始化完成后,一个最小可运行工程应该具备这些内容:
Assets/Resources/Scene/start.unityGameEntry 节点GameEntry 脚本RuntimeSettingsBuild Settings 中的启动场景可选的 HybridCLR / Obfuz 配置
此时就可以按快捷键F9打开:
Assets/Resources/Scene/start.unity然后点击 Unity 的 Play 按钮运行框架入口,或者直接在任意场景按F5立即运行游戏。
夜雨聆风