ILRuntime_NewbieGuide—入门
注:这里不会讲ILRuntime的热更新原理,如果还不是很清楚原理,请先移步到官方文档:https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html
我主要是讲如何把ILRuntime_HotGame这样一个简易的框架像做lua热更新一样使用。 基于ILRuntime的热更新实现的可以直接使用的框架。
下面一小段引用前辈的话:
ILRuntime部分已经在Unity工程中整合,除非有未实现的ILRuntime适配器需要添加,或者ILRuntime有重大更新,否则不建议修改这部分。在C#热更项目中写好功能后编译,框架已经写好编译后事件,VS会直接将生成到Unity项目的dll的扩展名修改成bytes,以避免Unity将热更dll直接编译入最终的Assemble中。 Unity项目中的Enter类为起始类,可以修改Config路径为自己的远程路径。 Unity项目中的UBuildTools类为编辑器辅助类,在Unity编辑器中运行,可以打最终包,也可以打AssetBundle包。
在C#热更项目部分新加的类建议都从AHotBase继承,这样可以直接使用很多基类方法。 AHotBase类不是从MonoBehaviour继承的,ILRuntime的原作者建议热更项目中尽量不要继承自MonoBehaviour。
框架将只会在Unity主工程中添加资源和预设,一般不会修改UHotGames的代码,所有的代码都将在AHotGames热更项目中添加和实现。
以下为主要内容:
1.目录介绍:
上图是目录结构: AHotGames是C#热更项目。 UHotGames是Unity项目。 Config.txt是AB加载配置。
2.工程准备:
下载我的github工程:切到feature_first分支 https://github.com/getker/ILRuntime_NewbieGuide/tree/feature_first 下载最原始的工程,一步一步跟着下面学习。
unity打开UHotGames,大概是下面这个样子:
打开Main场景,跑一下,用vs打开Enter.cs脚本看一下,Start方法里是下载并调用ILRuntime来加载AHotGames写的热更代码的部分,框架中,AHotGames生成的代码再Assets\RemoteResources\Dll下。(到这里都是前辈框架里面的基本东西)
3.新手上路:
打开AHotGames项目的AHotGames.sln,此时应该默认用vs打开了。 如果发现你的AHotGames项目中的引用有很多个叹号,那就一个一个引用去找到它。举个例子:
这里面UnityEngine.dll有警告,那就切到UHotGames的vs工程,找到UnityEngine.dll的路径,回到AHotGames添加UnityEngine.dll的引用。剩下几个叹号同样解决。(全部搞定后还是不行就关闭AHotGames再重新打开。)
AHotGames工程讲解:
在这个框架中,作者把AEmptyUI.cs做成所有UI预设的类,所以当我们添加了一个面板的时候,应该复制粘贴一个这样的基类,并且为了方便管理,也应该把脚本名称和类名改成和面板的预设名称一致。
4.实战
新建一个Train场景,给Train场景的MainCamera挂一个Enter.cs脚本(你新建一个空物体作为Manager挂更好),并创建面板如下:
相应看到上面这两张图你应该可以制作出这个名叫UITrain的面板,把它作为预设拖到RemoteResources文件夹下,在Hierarchy删除它,最后保存一下Train场景。
5.重头戏
回到AHotGames项目(即我们的热更新项目),如下图:在uis目录下新建UITrain.cs脚本;在最外层新建一个tools目录,下面新建脚本LoadByResources.cs。
UITrain.cs脚本是和我们unity工程UITrain预设对应的,LoadByResources.cs是我写的一个用Resources加载图片的脚本(很简单,且技术含量不高,若是大佬看见了,勿喷,只是简单的例子,应付一下)。
具体代码如下(github的wiki上面粘贴代码不好弄,下面的代码大家将就一下):
UITrain.cs
using System; using System.Collections.Generic; using System.Linq; using System.Text; using UnityEngine.UI; using UnityEngine; using System.Collections; public class UITrain : AHotBase { private Image image; private Button leftBtn; private Button rightBtn; private int currentImg = 0;//当前图片序号 private int totalImg = 5;//图片总数,默认为5 private string assetPath;//路径 private string directoryPath = "/Resources/Pictures/1/"; protected override void InitComponents() { image = FindWidget<Image>("Image_Bg"); leftBtn = FindWidget<Button>("LeftBtn"); rightBtn = FindWidget<Button>("RightBtn"); leftBtn.onClick.AddListener(LeftBtnClick); rightBtn.onClick.AddListener(RightBtnClick); } void LeftBtnClick() { Debug.Log("LeftBtnClick"); leftBtn.interactable = false; currentImg--; if (currentImg < 0) { currentImg = (totalImg - 1); } LoadImage(); } void RightBtnClick() { Debug.Log("RightBtnClick"); rightBtn.interactable = false; currentImg++; if (currentImg > (totalImg - 1)) { currentImg = 0; } LoadImage(); } void LoadImage() { if (!leftBtn.interactable) { leftBtn.interactable = true; } if (!rightBtn.interactable) { rightBtn.interactable = true; } assetPath = @"file:///" + Application.dataPath + directoryPath + currentImg.ToString() + ".jpg";//给路径赋值 LoadByResources.ResourcesLoadSync(image, assetPath); } }
LoadByResources.cs
using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UnityEngine; using UnityEngine.UI; public class LoadByResources { /// <summary> /// Resources同步加载 /// </summary> /// <param name="image"></param> /// <param name="currentImg"></param> public static void ResourcesLoadSync(Image image, string assetPath) { Debug.Log("ResourceLoadSync"); string[] path = assetPath.Split('/'); string resourcePath = path[path.Length - 1].Substring(0, path[path.Length - 1].LastIndexOf('.')); Debug.Log(resourcePath); image.sprite = Resources.Load<Sprite>("Pictures/1/" + resourcePath); } }
6.尾声:
写好了之后,打开AEntrance.cs脚本,把里面的//LoadAnotherUI();注释起来,改为LoadAnotherClass("UITrain","UITrain.prefab"); 这就是让它加载我们自己的UITrain面板。 然后重新生成一下项目:
由于框架已经加入了生成事件,VS会将生成到Unity项目的RemoteResources/Dll目录下的dll的扩展名修改为bytes,所以Unity只会将它作为文本文件load一下,并不会进行编译(这句话是拿前辈的)。
回到unity,先打包一下,运行MyTools/打包工具 中 “Build AssetBundles”命令,将RemoteResources目录下的所有资源打包成ab(弄好预设的那个时候应该打包一下才好);然后运行unity,效果如下:
如果上面你没成功,那就看看报错,找找是哪里出错了,上面的整一个过程都贼简单的。 至此,你已经能做了一个小小的demo(观众:就是一个按按钮切换图片的东西,你真无聊),但,你会发现,其实我们最终点的热更新资源还没有出来,对的,因为这篇wiki实在是太啰嗦了,我放到下一个wiki讲。
https://github.com/getker/ILRuntime_NewbieGuide/wiki/%E8%BF%9B%E9%98%B6