系列文章目录

Unity 3D模型展示框架篇之项目整理
Unity 3D模型展示框架篇之框架运用
Unity 3D模型展示框架篇之自由观察(Cinemachine)
Unity 3D模型展示框架篇之资源打包、加载、热更(Addressable Asset System | 简称AA)
Unity 3D模型展示框架篇之资源打包、加载、热更(二)


文章目录

  • 系列文章目录
  • 前言
  • 一、ILRuntime是什么?
  • 二、使用步骤
    • 1.添加ILRuntime引用包
    • 2.ILRuntime案例演示
  • 总结

前言

本项目将整合之前Unity程序基础小框架专栏在Unity
3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程。增加了Asset Bundle+ILRuntime热更新技术流程。


本文章主要介绍如何与ILRuntime项目快速入门与使用实例。

一、ILRuntime是什么?

ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新。

详见官方文档

二、使用步骤

1.添加ILRuntime引用包

操作如图所示,在Package Manager中搜索ILRuntime,导入项目中。

导入完成后,会出现操作菜单。Samples有ILRuntime的案例及热更工程。

导入完成后,进行Project Seting如下设置

2.ILRuntime案例演示

在导入工程中可以看到许多案例,在Unity工程中使用热更功能需要在运行之前先生成热更工程的DLL文件。工程目录Assets\Samples\ILRuntime\2.0.2\Demo下的HotFix_Project~

打开解决方案

浏览工程目录,可以看到工程输出的DLL的路径以及一些案例的demo

热更工程生成DLL,在StreamingAssets文件夹下。

打开第一个01_HelloWorld场景。

HelloWorld .cs代码如下(示例):

using UnityEngine;
using System.Collections;
using System.IO;
using ILRuntime.Runtime.Enviorment;
//下面这行为了取消使用WWW的警告,Unity2018以后推荐使用UnityWebRequest,处于兼容性考虑Demo依然使用WWW
#pragma warning disable CS0618
public class HelloWorld : MonoBehaviour
{//AppDomain是ILRuntime的入口,最好是在一个单例类中保存,整个游戏全局就一个,这里为了示例方便,每个例子里面都单独做了一个//大家在正式项目中请全局只创建一个AppDomainAppDomain appdomain;System.IO.MemoryStream fs;System.IO.MemoryStream p;void Start(){StartCoroutine(LoadHotFixAssembly());}IEnumerator LoadHotFixAssembly(){//首先实例化ILRuntime的AppDomain,AppDomain是一个应用程序域,每个AppDomain都是一个独立的沙盒appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();//正常项目中应该是自行从其他地方下载dll,或者打包在AssetBundle中读取,平时开发以及为了演示方便直接从StreammingAssets中读取,//正式发布的时候需要大家自行从其他地方读取dll//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!//这个DLL文件是直接编译HotFix_Project.sln生成的,已经在项目中设置好输出目录为StreamingAssets,在VS里直接编译即可生成到对应目录,无需手动拷贝//工程目录在Assets\Samples\ILRuntime\1.6\Demo\HotFix_Project~//以下加载写法只为演示,并没有处理在编辑器切换到Android平台的读取,需要自行修改
#if UNITY_ANDROIDWWW www = new WWW(Application.streamingAssetsPath + "/HotFix_Project.dll");
#elseWWW www = new WWW("file:///" + Application.streamingAssetsPath + "/HotFix_Project.dll");
#endifwhile (!www.isDone)yield return null;if (!string.IsNullOrEmpty(www.error))UnityEngine.Debug.LogError(www.error);byte[] dll = www.bytes;www.Dispose();//PDB文件是调试数据库,如需要在日志中显示报错的行号,则必须提供PDB文件,不过由于会额外耗用内存,正式发布时请将PDB去掉,下面LoadAssembly的时候pdb传null即可
#if UNITY_ANDROIDwww = new WWW(Application.streamingAssetsPath + "/HotFix_Project.pdb");
#elsewww = new WWW("file:///" + Application.streamingAssetsPath + "/HotFix_Project.pdb");
#endifwhile (!www.isDone)yield return null;if (!string.IsNullOrEmpty(www.error))UnityEngine.Debug.LogError(www.error);byte[] pdb = www.bytes;fs = new MemoryStream(dll);p = new MemoryStream(pdb);try{appdomain.LoadAssembly(fs, p, new ILRuntime.Mono.Cecil.Pdb.PdbReaderProvider());}catch{Debug.LogError("加载热更DLL失败,请确保已经通过VS打开Assets/Samples/ILRuntime/1.6/Demo/HotFix_Project/HotFix_Project.sln编译过热更DLL");}InitializeILRuntime();OnHotFixLoaded();}void InitializeILRuntime(){#if DEBUG && (UNITY_EDITOR || UNITY_ANDROID || UNITY_IPHONE)//由于Unity的Profiler接口只允许在主线程使用,为了避免出异常,需要告诉ILRuntime主线程的线程ID才能正确将函数运行耗时报告给Profilerappdomain.UnityMainThreadID = System.Threading.Thread.CurrentThread.ManagedThreadId;
#endif//这里做一些ILRuntime的注册,HelloWorld示例暂时没有需要注册的}void OnHotFixLoaded(){//HelloWorld,第一次方法调用appdomain.Invoke("HotFix_Project.InstanceClass", "StaticFunTest", null, null);}private void OnDestroy(){if (fs != null)fs.Close();if (p != null)p.Close();fs = null;p = null;}void Update(){}
}

以上代码简单来说就是加载热更工程的DLL文件,通过AppDomain入口进行HotFix_Project.InstanceClass中StaticFunTest方法的调用。
热更工程中的InstanceClass代码如下,Unity项目中运行成功,会在Console窗口中输出!!! InstanceClass.StaticFunTest()的字符串。

using System;
using System.Collections.Generic;namespace HotFix_Project
{public class InstanceClass{private int id;public InstanceClass(){UnityEngine.Debug.Log("!!! InstanceClass::InstanceClass()");this.id = 0;}public InstanceClass(int id){UnityEngine.Debug.Log("!!! InstanceClass::InstanceClass() id = " + id);this.id = id;}public int ID{get { return id; }}// static methodpublic static void StaticFunTest(){UnityEngine.Debug.Log("!!! InstanceClass.StaticFunTest()");}public static void StaticFunTest2(int a){UnityEngine.Debug.Log("!!! InstanceClass.StaticFunTest2(), a=" + a);}public static void GenericMethod<T>(T a){UnityEngine.Debug.Log("!!! InstanceClass.GenericMethod(), a=" + a);}public void RefOutMethod(int addition, out List<int> lst, ref int val){val = val + addition + id;lst = new List<int>();lst.Add(id);}}}

运行结果


总结

以上就是今天要讲的内容,本文仅仅简单介绍了ILRuntime的使用,而ILRuntime提供了大量能使我们快速便捷地掌握热更的案例大家可以自行阅读了解,下篇介绍在项目如何进行整合与应用。

Unity 3D模型展示框架篇之ILRuntime快速入门相关推荐

  1. Unity 3D模型展示框架篇之项目整理

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 1. ...

  2. Unity 3D模型展示框架篇之自由观察(Cinemachine)

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 在U ...

  3. Unity 3D模型展示框架篇之框架运用

    本项目将整合之前Unity程序基础小框架专栏在Unity 3D模型展示项目基础上进行整合,并记录了集成过程中对原脚本的调整过程.增加了Asset Bundle+ILRuntime热更新技术流程. 效果 ...

  4. Unity 3D模型展示之webGL平台展现

    在之前的项目基础上我们已经打包后在PC端进行展示了.这篇文章主要介绍在切换到webGL上时效果展示不出来需要进行调整,特此记录一下. 1.平台切换 选择WebGL平台切换,没有的可以进行安装,安装之后 ...

  5. Unity 3D模型展示之UI布局

    整体布局情况 导入UI资源并统一将Texture Type设置为Sprite(2D and UI) 1.标题 将Text中的文本设置为'Unity 3D物体展示实例'. 添加Shadow与Outlin ...

  6. unity 3D模型展示旋转缩放

    目标: 在UI层上 自由观察3D 模型,实现鼠标控制模型的旋转,缩放&& 触摸屏手势控制模型的旋转缩放控制: 这里仅将控制代码挂载到相机上,通过对相机的控制来观察模型. 基本上为最小单 ...

  7. Unity 3D模型展示之模型透明效果

    效果展示 1.透明效果实现思路 简单点就是将模型的材质替换成透明材质.需要注意:1.指定范围内的模型进行透明化.2.一个模型会有多个材质,都需要进行透明化.3.还能将模型的材质恢复最初的效果.4.选中 ...

  8. Unity 3D模型展示之自由观察模型

    效果展示 进行调整将灯光放到Main Camera下,旋转的时候光就一直打在这面. 1.观察模型脚本 public class Smooth3DCamera : MonoBehaviour {publ ...

  9. Unity 3D模型展示之控制标注

    效果展示 标注隐藏显示 脚本SwitchOperation中增加控制隐藏显示的方法.在初始化数据时需要给用到的switchPart.info进行赋值. public void hideInfo(boo ...

最新文章

  1. 厦门大学计算机科学每年的保研率是多少,厦大保研率大曝光,高达30%!研厦党该何去何从?...
  2. gin context和官方context_gin 源码阅读(一) -- 启动
  3. Linux-进程内存占用情况
  4. Spring3中js/css/jpg/gif等静态资源无法找到(No mapping found for HTTP request with URI)问题解决--转载...
  5. spring boot apollo demo
  6. 数据连接java面试题
  7. 逆向行驶!数据结构双向链表DoubleLinkedList,Java实现增删改查
  8. 未来5年人工智能将取代6%工作职位
  9. (62)SPI外设驱动协议(一)(第13天)
  10. BZOJ 2653 middle
  11. leetcode(83)—— 删除已排序链表重复元素(Remove Duplicates from Sorted List)
  12. 拜山贴(COM+中的连接复用)
  13. Android高手进阶:Adapter深入理解与优化
  14. 怎样远程连接Access数据库
  15. CorelDRAWX4的VBA插件开发(八)更改尺寸与移动
  16. 增值税发票税控开票软件V2.0.48_ZS_20220429(220518)-3
  17. 配置管理计划的主要内容有哪些?
  18. 知识图谱在小米的应用与探索
  19. 计算机应用基础自主学习,计算机应用基础络自主学习平台使用说明.doc
  20. matlab的dat文件如何打开方式,dat文件如何打开?DAT文件用什么文件打开介绍

热门文章

  1. 模拟银行账户业务,bank添加带参方法实现存款和取款业务, 存款时帐户初始金额为0元,取款时如果余额不足给出提示。
  2. 解析base64获取图片
  3. Python中遍历字典以及字典中的键和值
  4. 《MATLAB 神经网络43个案例分析》:第30章 基于随机森林思想的组合分类器设计——乳腺癌诊断
  5. Visio 用鼠标拖动和缩放画布
  6. 【论文阅读02】2021 任务级兵棋智能决策技术框架设计与关键问题分析 张驭龙
  7. Google 联合美国专利局提供海量专利和商标数据下载
  8. 项目管理-什么是项目管理
  9. 手办模型制作还可以这样简单?
  10. 河北mysql开发_河北mysql