安装.net core
安装unity勾选ill2cpp否则打包界面报错: currently selected scripting backend(il2cpp) is not installed 下载方法:https://unity.cn/releases 然后选择Release notes 然后选择Windows (IL2CPP) Target Support
先下载框架:https://github.com/egametang/ET Checkout时Choose items选择合适版本的
ET框架然后根据指南运行
包含了
ILRuntime框架
MVC的思想
1.Model/Init.cs是程序的入口,然后GotoHotfix()运行热更的Hotfix/Init.cs
2.init首先会将有特性的component添加到system去使用,然后add需要用到的管理component到Game.Scene
3.热更代码写在Hotfix,4.0版本后的ET会自动生成DLL
ReferenceCollector类
Component基类和几个派生类,管理类
为什么会需要两份一样的代码呢
Model
我该其中一份比如Hotfix,我另外的Model也需要跟着改?
不会改
两份是因为要减少ILRuntime的跨域继承
使用UI类
1.在场景Global/UI下创建Canvas,然后添加需要增加的界面(如UI***)并编辑
2.添加ReferenceCollector组件-用于Get<>UI组件使用,添加CanvasConfig-用于设置CanvasName让ui预设寻找到自己的canvas
3.在UIType中添加新建的UI枚举-用于创建关闭和设定属性
4.模仿UILoginFactory类新建一个UI**Factory类-用于Game.Scene.GetComponent
5.UIComponent用于管理所有UI,Creat方法里执行了刚才的设置.
6.模仿UILoginComponent类新建一个UI***Component类,类里写UI的逻辑,可在里面使用ReferenceCollector.Get<>方法获取组件
1.在菜单栏Tools→导出配置→导出客户端表;
2.ET使用路径Client/Excel下的XML导到客户端Assets/Res/Config下的txt(json)
3.参考Client/Excel可以编辑自己的表,详细规则见ExcelExporterEditor.cs的ExportSheet()
1.生成固定类型的bingding code
2.分析DLL内类型生成bingding code
1.资源预制体位于Bundles内,创建后添加ab名
2.Tools→打包工具 可选择打包平台 勾选打包exe:直接出包 点击打包
1.注释网络下载ab包代码; 将Init里面下载ab包流程DownloadBundle内的下载代码注释掉
2.加载ab包地址改变;把LoadOneBundle内的下载load地址改为本地PathHelper.AppHotfixResPath→AppResPath
3.生成CLR binding code;点击Tools→ILRuntime→Generate CLR binding code by Analysis
4.打包ab资源;在打包工具勾选是否将资源打入exe 打包在本地(streamingAssets)
1.代码生成DLL达到热更目的
热更 1.客户端逻辑全放在Hotfix热更 2.热更使用mono类型要先注册泛型
宏定义 IsAsync IsEditorMode IsDevelopmentBuild IsILRuntime
resourceCahce 是一个结构为
bundles 是一个用于ab技术的存储器
StringToAB() 每次调用都会加上".unity3d" 下次不用进行相加
BundleNameToLower()每次调用都会存起来 而不用每次都调用string的ToLower
1.init ----- Init.cs调用Game.Scene.AddComponent
2.获取 ---- Game.Scene.GetComponent
3.加载ab ----- ResourcesComponent.LoadBundle($"{type}.unity3d")
4.计数 ----- ABInfo ref+1
5.Cache ----- ResourcesComponent的Dictionarybundles给Cache
6.LoadAsset ---- 会加载所有Asset(如果一个包很多资源会不必要加载 要视乎项目打包策略)
6.GetAsset ----- 从resourceCache用abname获取dict 用prefabName获取资源
调用:ResourcesComponent.GetAsset($"{type}.unity3d",$"{type}")
7.Unload ----- ResourcesComponent.UnloadBundle 当引用为0释放
1.获取路径 AssetDatabase.GetAssetPathsFromAssetBundle
2.获取名字 Path.GetFileNameWithoutExtension(s);
3.加载 AssetDatabase.LoadAssetAtPath
4.Cache
①如果没cache就创建一个 结构为Dic
resourceCache[bundleName] = dict[assetName] = resource;;
②有就直接存dict[assetName] = resource;
使用PathHelper.AppHotfixResPath
Editor:Application.streamingAssetsPath(如果项目很大很多资源切到unity会卡一下 也不知道猫大和大佬们怎么解决)
isMobilePlatform:
①如果有Application.persistentDataPath}/{game}/
②否则使用Application.streamingAssetsPath + assetBundleName