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
ILRuntime_NewbieGuide—入门的更多相关文章
- ILRuntime_NewbieGuide—导读
Welcome to the ILRuntime_NewbieGuide wiki! 入门篇:做个简单的案例 https://www.cnblogs.com/kerven/p/10237280.htm ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- Oracle分析函数入门
一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计 ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- wepack+sass+vue 入门教程(三)
十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...
- wepack+sass+vue 入门教程(二)
六.新建webpack配置文件 webpack.config.js 文件整体框架内容如下,后续会详细说明每个配置项的配置 webpack.config.js直接放在项目demo目录下 module.e ...
随机推荐
- VIM新手福利,配置向
今天搜索VIM配置的时候,搜到一个神器 https://github.com/amix/vimrc The Ultimate vimrc Over the last 10 years, I have ...
- 【译】.NET 跨平台界面框架和为什么你首先要考虑再三
现在用 C# 来开发跨平台应用已经有很成熟的方案,即共用非界面代码,而每个操作系统搭配特定的用户界面代码.这个方案的好处是可以直接使用操作系统原生的控件和第三方控件,还能够和操作系统深度集成. 这里的 ...
- XSS攻击之窃取Cookie
10 年前的博客似乎有点老了,但是XSS 攻击的威胁依然还在,我们不得不防. 窃取Cookie是非常简单的,因此不要轻易相信客户端所声明的身份.即便这个Cookie是在数秒之前验证过,那也未必是真的, ...
- h5与c3权威指南笔记--css3新属性选择器
[att*=val] 选择所有att属性值中包含val的.只要包含val值,不论val值在属性值的前面还是中间还是后面~ <style> div[class*=div]{ color: r ...
- Android 设计模式之MVC模式
说到Android设计模式的MVC模式,估计很多人都是比较熟悉了,这里深入了解一下MVC到底是怎么回事,以ListView为例子讲解. 一.深入理解MVC概念 MVC即Model-View-Contr ...
- POST一下就知道:人生苦短,我用Python!
Python编程笔记---- 背景: “闸机端”简版程序要求: 读取扫描仪得到的userID; 向服务器发送请求进行验证: 根据返回值(True/False)决定闸机的信号. 1. 文件的读取 网上买 ...
- docker 集群 zookeeper 碰到 java.net.NoRouteToHostException: Host is unreachable (Host unreachable)
最近在学 zookeeper ,按照 docker 官网的方式集群 zookeeper , 然后发现有路由找不到.最后问题解决了,随手记录下来. 原因是 firewalld 的没有信任 docker ...
- 轻松学习UML之用例图,时序图
本文主要讲解UML图中的用例图(Use Case Diagram)和时序图(Sequence Diagram)相关内容,如有不足之处,还请指正. 概述 统一建模语言(UML,UnifiedModeli ...
- Docker-单宿主机下的网络模式
docker利用namespaces和cgroups实现了应用隔离和资源控制,那么网络层优势如何实现的呢?是直接使用宿主机的网卡设备,还是独立创造出自己的网络设备?以及容器如何与外界通信,下面我们通过 ...
- MySQL8.0 on Windows下重置root密码的BUG
很多人都知道MySQL忘记root密码之后可以通过skip-grant-tables来暂时免密登录MySQL,从而修改root密码,但是这种方式一方面有安全隐患,另一方面也并不怎么适用于Windows ...