注:这里不会讲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

ILRuntime_NewbieGuide—入门的更多相关文章

  1. ILRuntime_NewbieGuide—导读

    Welcome to the ILRuntime_NewbieGuide wiki! 入门篇:做个简单的案例 https://www.cnblogs.com/kerven/p/10237280.htm ...

  2. Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求

    上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...

  3. ABP入门系列(1)——学习Abp框架之实操演练

    作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...

  4. Oracle分析函数入门

    一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...

  5. Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数

    上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...

  6. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  7. Angular2入门系列教程4-服务

    上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...

  8. wepack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  9. wepack+sass+vue 入门教程(二)

    六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...

随机推荐

  1. Python 里的「单分派泛函数」到底是什么?

    泛型,如果你学过Java ,应该对它不陌生吧.但你可能不知道在 Python 中(3.4+ ),也可以实现简单的泛型函数. 在Python中只能实现基于单个(第一个)参数的数据类型来选择具体的实现方式 ...

  2. AspNetCore+Swagger 生成Model 描述

    AspNetCore+Swagger 生成Model 描述 前言: 本篇文章实现是基于上一篇文章,进下补充:多余的就不多说了,只是为了实现Model的描述生成:有兴趣的可以结合上一篇的进行实现:如有更 ...

  3. AOP面向切面编程C#实例

    原创: eleven 原文:https://mp.weixin.qq.com/s/8klfhCkagOxlF1R0qfZsgg [前言] AOP(Aspect-Oriented Programming ...

  4. Python3 日期与时间戳相互转换

    开发中经常会对时间格式处理,对于时间数据,比如2019-02-28 10:23:29,有时需要日期与时间戳进行相互转换,在Python3中主要用到time模块,相关的函数如下: 其中unix_time ...

  5. linux的一些命令,面试经常碰到的

    1 查询所有java进程ps -A | grep java解释一下这个命令的意思,ps 是查看系统当前进程的命令,参数 -A(注意,是大写,linux中是区分大小写的)是显示所有程序,| 这个是管道符 ...

  6. PPT在HTML网页上播放方法

    项目中遇到一个需求:要求PPT在HTML网页上播放,而且要像电脑一样播放PPT,大家能想到的是什么方法? 印象中我好像有在网上见到过PPT模板网站上的PPT可以播放,赶紧百度搜了下发现都是用第三方软件 ...

  7. CSRF & CORS

    下面转的两篇文章分别说明了以下两个概念和一些解决方法: 1. CSRF - Cross-Site Request Forgery - 跨站请求伪造 2. CORS - Cross Origin Res ...

  8. vue-router 页面布局

    在单页面应用程序(SPA)中,有些页面的布局结构是上下两块是固定,中间内容是变化的.这时在入口处固定上下部分就可以很好的解决这一问题.有少部分页面没有上下部分或不需要(如:用户注册.登陆页面),针对这 ...

  9. CSS重要知识概述——Java Web从入门到精通第2章

    一.CSS简单规则 CSS样式表包含3部分内容:选择符.属性和属性值 其中选择符包括基本的3种选择器: 1.标记选择器,如<a></a>标签等: 2.类别选择器,用class属 ...

  10. Nginx设置Https反向代理,指向Docker Gitlab11.3.9 Https服务

    目录 目录 1.GitLab11.3.9的安装 2.域名在阿里云托管,申请免费的1年证书 3.Gitlab 的 https 配置 4.Nginx 配置 https,反向代理指向 Gitlab 配置 目 ...