C#Like是Unity的热更方案,使用纯C#语言写出可以热更新的代码,就像可以在所有平台使用DLL(动态链接库)文件一样.遵从KISS设计原则,让用户轻松构建或升级成Unity的热更新项目.
简介
本篇主要介绍如何一步一步地详细地把Unity官方免费例子Platformer Microgame转成可热更新项目.
搭建的详细步骤
我们有了上一个代码很少的项目经验后,我们再选取一个代码比较多一些的Unity出品的免费的例子"Platformer Microgame"作为示范,即官方Demo里的"PlatformerMicrogameFree"项目是如何制作的,下面是详细步骤:
-
创建一个空白的2D/3D项目为PlatformerMicrogameFree
-
到Unity资源商店购买相关的免费资源: 如果已购买的则跳过
- 免费购买Platformer Microgame
- 免费购买C#Like免费版
-
导入相关的免费资源:
- 先打开Package Manager界面 : 菜单'Window'->'Package Manager'
- 导入'Platformer Microgame' : 'Packages: My Assets'->'Platformer Microgame'->'Import'
- 导入'C#Like免费版' : 'Packages: My Assets'->'C#LikeFree Hot Update Framework'->'Import'
-
移除默认导出C#Like内置资源的AssetBundle: 你也可以直接删掉它
- Project面板选中"Assets\C#Like\Scenes\BuildInDemoScene"文件后, 在Inspector面板里的Asset Labels的AssetBundle设置为none
- Project面板选中"Assets\C#Like\Sample"目录后, 在Inspector面板里的Asset Labels的AssetBundle设置为none
-
修改产品名称:
- 菜单'Edit'->'Project Settings'->'Player'->'Product Name' 设置为 'MicrogameFree'
-
修改脚本:
- 为'Assets\Mod Assets\Mod Resources\Scripts\Platformer\EmitParticlesOnLand.cs'这个文件加个命名空间,例如'Platformer.Mechanics'. 因为热更脚本里的类不能使用和没有命名空间的类名取相同的名字,例如非热更脚本里有个不带命名空间的类叫'ClassName', 热更新脚本里不能存在命名空间不同但类名相同的类'NamespaceName.ClassName',所以建议所有的类都加上命名空间吧.
- 复制目录'Assets\Scripts' 到 'Assets\Scripts_HotUpdate'. 即我们将要把原来目录'Assets\Scripts'里的非热更脚本改成目录'Assets\Scripts_HotUpdate'里的热更新脚本
- 菜单'Window'->'C#Like'->'C#Like Setting'->'Hot Update Script Folder' 设置为 'Assets\Scripts_HotUpdate'
- 然后我们逐一地把修改目录'Assets\Scripts_HotUpdate'里的所有cs脚本文件: 最终改好后的脚本文件详见GitHub里的PlatformerMicrogameFree项目,篇幅问题,不一一列出完整代码了,下面简述一些注意的事项
- 把原命名空间(例如'Platformer.Gameplay'之类的)都改为'Microgame'.这个纯粹看你个人爱好,没限定改成什么.
- 把基类'MonoBehaviour'的都改为'LikeBehaviour'
- 按需确定要采用不同的HotUpdateBehaviourXXXXX.
- 根据绑定不同需求,在Awake或Start里绑定预制体里的数据 (int/bool/double/float/string/Color/Vector3/GameObject/TextAsset/Material/Texture/AudioClip/Sprite)
- 注意生命周期顺序 : Awake -> OnEnable -> Start. 如果绑定其他LikeBehaviour对象的数据,尽量放在Start函数而非Awake,因为在Awake的时候,其他对象可能尚未执行初始化
- C#Like免费版不支持协程,需要用Update来代替
- 部分文件实在无法转化成热更新脚本的,我把他们放入目录'Assets\Scripts_NoneHotUpdate'内了. 例如基类为StateMachineBehaviour或Editor的
- 因为不支持带模板的类,例如'public class EnemyDeath : Simulation.Event<EnemyDeath>'的, 直接就改成'public class EnemyDeath'就可以实现同样效果. 我们已经优化过了Simulation类的,让它可以支持热更新代码.
- 原Demo看起来很卡顿,经过菜单"Window"->"Analysis"->"Profiler"查看是动画占了过多资源导致的, 我就加了一个距离Player过远的就隐藏组件功能,然后就不卡了
-
修改预制体: "Assets\Prefabs"里面的预制体看起来是直接由场景引用的,我们直接去修改场景吧
-
修改场景: 最终我们将会导出场景为AssetBundle文件
- 打开场景'\Assets\Scenes\SampleScene.unity'
- 菜单'File'->'Save As...'->我们保存为'\Assets\Scenes\SampleScene_HotUpdate.unity'
- 修改当前场景里的所有绑定原'\Assets\Scripts'目录内的非热更新代码的, 在原位置添加对应的HotUpdateBehaviourXXXXX组件,然后按需设置绑定参数
- 最后移除所有的旧的'\Assets\Scripts'代码的绑定
- 设置AssetBundle : Project面板选中'\Assets\Scenes\SampleScene_HotUpdate.unity'后, 在Inspector面板里的Asset Labels的AssetBundle设置为none设置为'microgamefree',后缀为'ab'
- 这个时候直接点编辑器里点运行'▶',应该可以正常调试运行的
-
修改C#Like配置: 菜单'Window'->'C#Like'->打开'C#Like Setting'面板
- 'Hot Update Script Folder'设置为'Assets/_Completed-Assets/HotUpdateScripts' (可以拖放目录)
- 'Product Name'设置为'MicrogameFree'
- 'Display Name'设置为'Platformer Microgame'
- 'Default Scene'设置为'\Assets\Scenes\SampleScene_HotUpdate.unity' (可以拖放文件)
- 'Download Path'设置为'https://www.csharplike.com/CSharpLikeFreeDemo/AssetBundles'
-
编辑器测试调试
- 如需Visual Studio断点调试代码, 菜单"Window"->"C#Like"->"C#Like Setting"->勾上"is debug mode" 来开启调试模式.
- C#Like完整版因为比免费支持更多C#特性,更加接近调试模式. 即免费版会出现更多调试模式下没问题但非调试模式下有问题的情况.
- 在编辑器里点'▶'按钮就可以正常运行调试可热更新的场景了.
- 为了方便测试,我们在'Esc'按钮弹出的界面里多加了一个"Exit"按钮,用于退出当前游戏返回最初始的场景.
-
导出最终产品AssetBundle
- 菜单"Window"->"C#Like"->"C#Like Setting"->点击按钮"Rebuild Scripts"
- 最终生成目录"PlatformerMicrogameFree\AssetBundles\MicrogameFree",同时也会复制到目录"StreamingAssets"
- "PlatformerMicrogameFree\AssetBundles\MicrogameFree\WebGL\code.ab" : 是包含二进制代码文件的AssetBundle
- "PlatformerMicrogameFree\AssetBundles\MicrogameFree\WebGL\microgamefree.ab" : 是包含资源(场景)的AssetBundle
- "PlatformerMicrogameFree\AssetBundles\MicrogameFree\WebGL\config.json" : 是ResourceManager用到的配置JSON文件,作用类似manifest文件
本系列文章导读:
- Unity热更新方案C#Like(一)-序言
- Unity热更新方案C#Like(二)-导出官方示范的例子,确认方案可行性
- Unity热更新方案C#Like(三)-详解支持的C#特性:类
- Unity热更新方案C#Like(四)-详解支持的C#特性:委托和Lambda
- Unity热更新方案C#Like(五)-详解支持的C#特性:运算表达式
- Unity热更新方案C#Like(六)-详解支持的C#特性:循环语法
- Unity热更新方案C#Like(七)-详解支持的C#特性:get/set访问器
- Unity热更新方案C#Like(八)-详解支持的C#特性:多线程
- Unity热更新方案C#Like(九)-详解支持的C#特性:Using和命名空间
- Unity热更新方案C#Like(十)-详解支持的C#特性:宏和区域
- Unity热更新方案C#Like(十一)-详解支持的C#特性:枚举
- Unity热更新方案C#Like(十二-详解支持的C#特性:参数修饰符
- Unity热更新方案C#Like(十三)-详解支持的C#特性:函数重载和默认参数
- Unity热更新方案C#Like(十四)-详解支持的C#特性:异常处理
- Unity热更新方案C#Like(十五)-详解支持的C#特性:关键字:unsafe typeof nameof $ @ #pragma #warning #error
- Unity热更新方案C#Like(十六)-详解支持的C#特性:其他杂项:初始值设定项,表达式主体,内联变量声明
- Unity热更新方案C#Like(十七)-详解支持的长链接Socket和WebSocket
- Unity热更新方案C#Like(十八)-详解如何和Unity交互
- Unity热更新方案C#Like(十九)-详解KissJSON:唯一可以在本热更新框架使用的JSON库
- Unity热更新方案C#Like(二十)-详解KissCSV:一个简易实用的CSV表格读取方式
- Unity热更新方案C#Like(廿一)-详解KissFrameworkServer:对应的示范例子和官网所用的服务器框架
- Unity热更新方案C#Like(廿二)-详解内置的例子C#Like Demo:飞机大战,简易聊天室,简易账号/物品/邮件系统
- Unity热更新方案C#Like(廿三)-实战:示范如何把Unity官方免费例子Tanks! Tutorial转成可热更新项目
- Unity热更新方案C#Like(廿四)-实战:示范如何把Unity官方免费例子Platformer Microgame转成可热更新项目
- Unity热更新方案C#Like(廿五)-实战:示范如何建立初始包CSharpLikeFreeDemo项目
- Unity热更新方案C#Like(廿六)-(可选)详解免费版的演示如何升级到完整版的演示