注:这里不会讲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;//图片总数,默认为5private 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

转载于:https://www.cnblogs.com/kerven/p/10237280.html

ILRuntime_NewbieGuide—入门相关推荐

  1. 用Construct 2制作入门小游戏~

    今天在软导课上了解到了Construct 2这个神器,本零基础菜鸟决定尝试做一个简单的小游戏(实际上是入门的教程啊= = 首先呢,肯定是到官网下载软件啊,点击我下载~ 等安装完毕后我便按照新手教程开始 ...

  2. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  3. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

  4. Docker入门六部曲——服务

    原文链接:http://www.dubby.cn/detail.html?id=8735 准备 已经安装好Docker 1.13或者以上的版本. 安装好Docker Compose.如果你是用的是Do ...

  5. 【springboot】入门

    简介: springBoot是spring团队为了整合spring全家桶中的系列框架做研究出来的一个轻量级框架.随着spring4.0推出而推出,springBoot可以説是J2SEE的一站式解决方案 ...

  6. SpringBoot (一) :入门篇 Hello World

    什么是SpringBoot Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配置,从而使开发人员不 ...

  7. 入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集-深度学习问题

    入门指南目录页 -PaddlePaddle 飞桨 入门指南 FAQ合集 GT_Zhang关注 0.1012019.08.01 18:43:34字数 1,874阅读 795 Hi,欢迎各位来自Paddl ...

  8. 5 分钟入门 Google 最强NLP模型:BERT

    BERT (Bidirectional Encoder Representations from Transformers) 10月11日,Google AI Language 发布了论文 BERT: ...

  9. 命名实体识别入门教程(必看)

    关于开发自己的命名实体识别先期思路: 虽然网上有很多相关代码,但实际如何入门材料较少,故整理下: CRF:先期可以用人民日报语料库去做,步骤如下: https://blog.csdn.net/hude ...

最新文章

  1. Aop获取bean的过程---spring debug
  2. .mvn 需要放git上吗_下巴反复长痘,饮食上需要忌口吗?
  3. (Application下)组件(所在的)进程创建时,创建Application
  4. python程序移植到linux,如何使python或perl脚本可移植到Linux和Windows?
  5. Cloud一分钟 | Gartner发布2018年第二季度全球服务器市场报告;中信银行联合腾讯云推出手机银行智能语音产品...
  6. Linux Ubuntu 安装 Matlab
  7. groovy语言 累加_使用Groovy管理数据:查找和累加器
  8. 【操作系统/OS笔记03】启动、中断、异常和系统调用
  9. 关于vim复制剪贴粘贴命令的总结-转
  10. 奇妙生活-神奇的数字-1的故事
  11. Rhino使JavaScript应用程序更灵动
  12. 电信dns地址是多少?
  13. hook(useState、useEffect、useReducer)、context、React项目起始
  14. (构造+二进制)2020牛客寒假算法基础集训营3B.牛牛的DRB迷宫II
  15. 论文阅读利器——划词翻译插件(桌面与浏览器)
  16. 13行MATLAB代码实现网络爬虫 爬取NASA画廊星图
  17. LU_ASR01语音模块使用
  18. 基于经度坐标校正鱼眼图像
  19. vue组件通讯六种方法。
  20. 数学表达式转换成python_简单数学表达式_清华尹成python入门教程_少儿编程视频-51CTO学院...

热门文章

  1. JS面向对象--你真的理解闭包了吗?
  2. 请求数据分析 xpath语法 与lxml库
  3. 基于Dapper二次封装了一个易用的ORM工具类:SqlDapperUtil
  4. 《高级软件测试》实践作业4学习记录12月25日
  5. 【转】Spring Bean单例与线程安全
  6. 【BZOJ-2938】病毒 Trie图 + 拓扑排序
  7. 【Unity3D】Tags和Layers
  8. Solr Zookeeper ACL权限配置
  9. .NET(C#):浅谈程序集清单资源和RESX资源
  10. C# Linq获取两个List或数组的差集交集