精华内容
下载资源
问答
  • ILRuntime Unity3D示例的热更新思路,用于线上游戏代码的热更。
  • ILRuntime Unity热更新

    万次阅读 多人点赞 2019-05-28 19:35:44
    在新的项目中,使用到了ILRuntime的热更新方式,不同于XLua等,这种方式的热更新是由纯C#实现的,所以就不需要客户端懂Lua的代码。...目前大致的理解为:将游戏分为两个部分,Unity和Hotfix。其中主要的游戏逻...

    在新的项目中,使用到了ILRuntime的热更新方式,不同于XLua等,这种方式的热更新是由纯C#实现的,所以就不需要客户端懂Lua的代码。更详细的介绍可以看官方的文档。

    官方的介绍及文档为:http://ourpalm.github.io/ILRuntime/public/v1/guide/index.html

    目前大致的理解为:将游戏分为两个部分,Unity和Hotfix。其中主要的游戏逻辑部分也就是可能需要热更的部分都写在Hotfix当中,然后将其导出为Hotfix.dll文件供Unity使用。游戏上线后若需要更新代码,只需要修改Hotfix中的代码,然后生成新的Hotfix.dll文件热更上去即可。

    接下来就用一个简单的Demo来实现这么一个过程。思路为,把原本UI逻辑的类放在Hotfix当中,由于没有继承MonoBehaviour,所以通过实现一个带有Start,Update等方法的接口,然后在Unity部分相应调用,来实现Hotfix中的生命周期。同时通过GameObject.Find的方法找到对应的组件,进行操作。

     

    创建Unity工程环境

    首先我们创建一个新的Unity工程,然后将ILRuntime需要的部分导入工程当中,即官方Demo中的Mono.Cecil.20,Mono.Cecil.Pdb,ILRuntime三个文件夹(删除ILRuntime/Adapters/Editor)

    勾选 player settings -> Other Settings - > Allow 'unsafe' Code选项

     

    创建Hotfix工程环境

    打开我们的VS,文件->新建->项目,创建一个C#类库,命名为Hotfix,如图

    然后在解决方案->引用处右键,添加引用,如图

    其中UnityEngine.dll,UnityEngine.UI.dll 和 UnityEngine.CoreModule.dll三个文件在Unity的安装目录下,Assembly-CSharp.dll在上面创建的Unity工程的Library/ScriptAssemblies目录下

    注:UnityEngine.CoreModule.dll是在Unity2017.2之后的版本才有,之前的版本可以不用添加,若在官方demo中UnityEngine.dll报找不到的错误的话,重新引用下正确目录下的dll文件即可。

     

    创建接口与适配器,并实现接口

    首先我们可以在Unity中创建一个简单的接口,用于处理Hotfix中的生命周期

    public interface IUI
    {
        void Start();
        void Update();
    }

    然后在Hotfix工程中,新建一个类Main.cs,实现IUI接口

    namespace Hotfix
    {
        //IUI为unity中的接口,所以要在unity中实现一个继承适配器
        public class MainUI:IUI
        {
            public void Start()
            {
    
            }
    
            public void Update()
            {
    
            }
        }
    }

    由于IUI是Unity的接口,而MainUI是Hotfix的类,这里有一个ILRuntime中跨域继承的概念,官方文档提到如果你想在热更DLL项目当中继承一个Unity主工程里的类,或者实现一个主工程里的接口,你需要在Unity主工程中实现一个继承适配器。

    所以我们在Unity中创建一个类 InterfaceIUIAdaptor.cs,实现继承适配器(根据文档给的代码进行修改)

    using ILRuntime.CLR.Method;
    using ILRuntime.Runtime.Enviorment;
    using ILRuntime.Runtime.Intepreter;
    using System;
    
    public class InterfaceIUIAdaptor : CrossBindingAdaptor
    {
        public override Type BaseCLRType {
            get {
                return typeof(IUI);//这是你想继承的那个类
            }
        }
    
        public override Type AdaptorType {
            get {
                return typeof(Adaptor);//这是实际的适配器类
            }
        }
    
        public override object CreateCLRInstance(ILRuntime.Runtime.Enviorment.AppDomain appdomain, ILTypeInstance instance)
        {
            return new Adaptor(appdomain, instance);//创建一个新的实例
        }
    
        //实际的适配器类需要继承你想继承的那个类,并且实现CrossBindingAdaptorType接口
        public class Adaptor : IUI, CrossBindingAdaptorType
        {
            ILTypeInstance instance;
            ILRuntime.Runtime.Enviorment.AppDomain appdomain;
    
            IMethod m_Start;
            bool m_StartGot;
    
            IMethod m_Update;
            bool m_UpdateGot;
    
            public Adaptor()
            {
    
            }
    
            public Adaptor(ILRuntime.Runtime.Enviorment.AppDomain appdomain, ILTypeInstance instance)
            {
                this.appdomain = appdomain;
                this.instance = instance;
            }
    
            public ILTypeInstance ILInstance { get { return instance; } }
    
            //你需要重写所有你希望在热更脚本里面重写的方法,并且将控制权转到脚本里去
            public void Start()
            {
                if (!m_StartGot)
                {
                    m_Start = instance.Type.GetMethod("Start", 0);
                    m_StartGot = true;
                }
                if (m_Start != null)
                {
                    appdomain.Invoke(m_Start, instance, null);//没有参数建议显式传递null为参数列表,否则会自动new object[0]导致GC Alloc
                }
            }
    
            public void Update()
            {
                if (!m_UpdateGot)
                {
                    m_Update = instance.Type.GetMethod("Update", 0);
                    m_UpdateGot = true;
                }
                if (m_Update != null)
                {
                    appdomain.Invoke(m_Update, instance, null);
                }
            }
        }
    }

     

    读取Hotfix.dll文件,并执行其内部操作

    首先我们将Hotfix工程中,解决方案右键生成,生成Hotfix.dll和Hotfix.pdb两个文件,将这两个文件拷贝到Unity的StreamingAssets目录下。

    然后我们创建一个新的类 Launch.cs,在这里面我们首先读取上面的两个Hotfix文件,然后进行一些ILRuntime的预设置,例如绑定继承适配器,注册委托等。最后我们要在里面找到Hotfix中实现IUI接口的类,因为这些类就是我们的UI逻辑类,然后在自己的Start,Update等生命周期方法中,调用Hotfix中IUI类对应的方法。代码如下:

    using ILRuntime.Runtime.Enviorment;
    using System;
    using System.Collections;
    using System.Collections.Generic;
    using System.IO;
    using System.Linq;
    using UnityEngine;
    
    public class Launch : MonoBehaviour
    {
        List<Action> DllUIUpdateList = new List<Action>();
    
        ILRuntime.Runtime.Enviorment.AppDomain appdomain;
        void Start()
        {
            StartCoroutine(LoadILRuntime());
        }
    
        IEnumerator LoadILRuntime()
        {
            //读取dll文件
            appdomain = new ILRuntime.Runtime.Enviorment.AppDomain();
    
            WWW www = new WWW(Application.streamingAssetsPath + "/Hotfix.dll");
    
            while (!www.isDone)
            {
                yield return null;
            }
            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.LogError(www.error);
            }
            byte[] dll = www.bytes;
            www.Dispose();
    
            www = new WWW(Application.streamingAssetsPath + "/Hotfix.pdb");
    
            while (!www.isDone)
            {
                yield return null;
            }
            if (!string.IsNullOrEmpty(www.error))
            {
                Debug.LogError(www.error);
            }
            byte[] pdb = www.bytes;
            using (System.IO.MemoryStream fs = new MemoryStream(dll))
            {
                using (System.IO.MemoryStream p = new MemoryStream(pdb))
                {
                    appdomain.LoadAssembly(fs, p, new Mono.Cecil.Pdb.PdbReaderProvider());
                }
            }
    
            OnILRuntimeInit();
    
            OnILRuntimeInitialized();
        }
    
        void Update()
        {
            if (DllUIUpdateList.Count > 0)
            {
                foreach(var update in DllUIUpdateList)
                {
                    update();
                }
            }
        }
    
        void OnILRuntimeInit()
        {
            //跨域继承绑定适配器
            appdomain.RegisterCrossBindingAdaptor(new InterfaceIUIAdaptor());
            //Button点击事件的委托注册
            appdomain.DelegateManager.RegisterDelegateConvertor<UnityEngine.Events.UnityAction>((act) =>
            {
                return new UnityEngine.Events.UnityAction(() =>
                {
                    ((Action)act)();
                });
            });
        }
    
        void OnILRuntimeInitialized()
        {        
            //获取Hotfix.dll内部定义的类
            List<Type> allTypes = new List<Type>();
            var values = appdomain.LoadedTypes.Values.ToList();
            foreach (var v in values)
            {
                allTypes.Add(v.ReflectionType);
            }
            //去重
            allTypes = allTypes.Distinct().ToList();
    
            DllUIUpdateList.Clear();
            foreach (var v in allTypes)
            {
                //找到实现IUI接口的类 Adaptor 前面写的适配器IUI的类
                if (v.IsClass && v.GetInterface("Adaptor") != null)
                {
                    //生成实例
                    var gs = appdomain.Instantiate<IUI>(v.FullName);
    
                    //调用接口方法
                    gs.Start();
                    DllUIUpdateList.Add(gs.Update);
                }
            }
        }
    }
    

    注:代码中有一个委托注册的功能,是因为在Hotfix中调用UGUI的Button的onCkick,需要生成委托转换器,否则会报错

     

    搭建UI及实现UI逻辑

    Demo中,简单的在场景中创建一个简单的Button和Text,然后将Launch.cs挂到Canvas上即可。然后在我们之前Hotfix中创建的MainUI.cs中添加我们的UI逻辑:

    using UnityEngine;
    using UnityEngine.UI;
    
    namespace Hotfix
    {
        //IUI为unity中的接口,所以要在unity中实现一个继承适配器
        public class MainUI:IUI
        {
            Button m_btn;
            Text m_text;
            int count = 0;
            bool isClick = false;
    
            public void Start()
            {
                m_btn = GameObject.Find("Canvas/Button").GetComponent<Button>();
                m_text = GameObject.Find("Canvas/Text").GetComponent<Text>();
                m_text.text = "MainUI Start";
    
                //点击事件的委托需要在unity中实现委托转换器
                m_btn.onClick.AddListener(BtnClick);
            }
    
            public void Update()
            {
                if (isClick)
                {
                    if (count % 20 == 0)
                    {
                        m_text.text = "MainUI Update" + count / 20;
                    }
                    count++;
                }
            }
    
            void BtnClick()
            {
                isClick = true;
            }
        }
    }
    

    然后重新生成下dll文件,将原来Unity StreamingAssets下的文件替换掉即可(以后修改逻辑亦是如此,达到热更的效果)。

     

    运行效果如下:

     

    更详细的内容请看后面的文章~~~~

    展开全文
  • 我这里使用的unity版本是2017.4.8 vs版本是2017 下载后解压会有以下两个文件: ILRuntimeDemo:unity主工程 HotFix_Project :热更工程 ...请先打开ILRuntimeDemo unity主工程并先执行一次编译Assembly-CSh...

     

     

    案例下载地址:https://github.com/Ourpalm/ILRuntimeU3D/

    我这里使用的unity版本是2017.4.8   vs版本是2017

    下载后解压会有以下两个文件:

    ILRuntimeDemo:unity主工程

    HotFix_Project :热更工程

    请先打开ILRuntimeDemo unity主工程并先执行一次编译 Assembly-CSharp.dll 文件

    再使用vs2015,或者2017打开 HotFix_Project热更工,然后需要引入几个库文件:如下:

     

    unity安装目录\Unity2017.4.8\Unity\Editor\Data\Managed\UnityEngine.dll

    unity安装目录\Unity2017.4.8\Unity\Editor\Data\UnityExtensions\Unity\GUISystem\UnityEngine.UI.dll

    unity安装目录\Unity2017.4.8\Unity\Editor\Data\Managed\UnityEngine\UnityEngine.CoreModule.dll

    UnityILRuntimeDemo工程目录\ILRuntimeDemo\Library\ScriptAssemblies\Assembly-CSharp.dll

     

    注意:

    需要注意的是 UnityEngine.dll 和 UnityEngine.CoreModule.dll 同时引入的话,可能会有冲突,我这里是只引入UnityEngine.CoreModule.dll,因为在热更Demo工程里面有用到协程,不引入这个库会报错

    做完这些后就可以更改热更工程里面的代码,运行Unity主工程就可以看到更改。

     

    展开全文
  • using System; using System.Collections....using UnityEditor; using UnityEngine; public static class ILTools{ private const string dllName = "Hotfix.dll"; private const string pdbName = "Hotfix.pdb";
    using System;
    using System.Collections.Generic;
    using System.Diagnostics;
    using System.IO;
    using UnityEditor;
    using UnityEngine;
    using System.Threading.Tasks;
    public static class ILRuntimeTool
    {
        private const string dllName = "Hotfix.dll";
        private const string pdbName = "Hotfix.pdb";
        private const string msbuildExe = "C:/Windows/Microsoft.NET/Framework/v4.0.30319/MSBuild.exe";//找到MSBuild的路径
        [MenuItem("Tools/ILRuntime/Build Hotfix(Debug)")]
        static void BuildHotfixDebug()
        {
            BuildHotfix("Debug");
        }
    
        [MenuItem("Tools/ILRuntime/Build Hotfix(Release)")]
        static void BuildHotfixRelease()
        {
            BuildHotfix("Release");
        }
    
        static void BuildHotfix(string _c)
        {
            if (!File.Exists(msbuildExe))
            {
                UnityEngine.Debug.LogError("找不到 MSBuild 工具");
                return;
            }
            System.IO.DirectoryInfo parent = System.IO.Directory.GetParent(Application.dataPath);
            string projectPath = parent.ToString();
            ProcessCommand(msbuildExe, projectPath + "/../Hotfix/Hotfix.csproj /t:Rebuild /p:Configuration=" + _c);//更改 IL 工程的所在的目录
            UnityEngine.Debug.LogFormat("Hotfix {0} 编译完成", _c);
        }
    
    
        [MenuItem("Tools/ILRuntime/Copy Hotfix Files(Debug)")]
        public static void CopyHotfixFilesDebug()
        {
            CopyHotfixFilesAsync("Debug");
        }
    
        [MenuItem("Tools/ILRuntime/Copy Hotfix Files(Release)")]
        public static void CopyHotfixFilesRelease()
        {
            CopyHotfixFilesAsync("Release", false);
        }
    
        async static void CopyHotfixFilesAsync(string _c, bool copyPDB = true)
        {
            System.IO.DirectoryInfo parent = System.IO.Directory.GetParent(Application.dataPath);
            string projectPath = parent.ToString();
            string srcPath = projectPath + "/../Hotfix/bin/" + _c + "/";//更改 IL 工程的所在的目录
            string dstPath = GetStreamAssetsPath();
            await CopyFileAsync(srcPath + dllName, dstPath + "/" + dllName);
            if (copyPDB)
            {
                await CopyFileAsync(srcPath + pdbName, dstPath + "/" + pdbName);
                UnityEngine.Debug.LogFormat("Copy {0} and {1} from {2} to {3}", dllName, pdbName, srcPath, dstPath);
            }
            AssetDatabase.Refresh();
            UnityEngine.Debug.LogFormat("Copy {0} from {1} to {2}", dllName, srcPath, dstPath);
        }
    
        public static void ProcessCommand(string command, string argument)
        {
            ProcessStartInfo start = new ProcessStartInfo(command);
            start.Arguments = argument;
            start.CreateNoWindow = true;
            start.ErrorDialog = true;
            start.UseShellExecute = true;
            if (start.UseShellExecute)
            {
                start.RedirectStandardOutput = false;
                start.RedirectStandardError = false;
                start.RedirectStandardInput = false;
            }
            else
            {
                start.RedirectStandardOutput = true;
                start.RedirectStandardError = true;
                start.RedirectStandardInput = true;
                start.StandardOutputEncoding = System.Text.UTF8Encoding.UTF8;
                start.StandardErrorEncoding = System.Text.UTF8Encoding.UTF8;
            }
            Process p = Process.Start(start);
            if (!start.UseShellExecute)
            {
                // UnityEngine.Debug.LogFormat("--- output:{0}", p.StandardOutput.ToString());
                // printOutPut(p.StandardOutput);
                // printOutPut(p.StandardError);
            }
            p.WaitForExit();
            p.Close();
        }
    
        public static async Task CopyFileAsync(string src, string dst, bool isWWWRead = false)
        {
            if (File.Exists(dst))
                File.Delete(dst);
    
            string dirPath = System.IO.Path.GetDirectoryName(dst);
            if (!Directory.Exists(dirPath))
                CreateDirectory(dirPath);
            if (isWWWRead)
            {
                byte[] content = await LoadFileBytesAsync(PrefixPath(src));
                await WriteFileAsync(dst, content);
            }
            else
            {
                File.Copy(src, dst, true);
            }
        }
    
        public static async Task<byte[]> LoadFileBytesAsync(string filePath)
        {
            byte[] fileBytes;
            if (!File.Exists(filePath))
            {
                return null;
            }
            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read, 4096, true))
            {
                fileBytes = new byte[fileStream.Length];
                await fileStream.ReadAsync(fileBytes, 0, (int)fileStream.Length);
            }
            return fileBytes;
        }
    
        public static async Task WriteFileAsync(string path, byte[] content)
        {
            string dirPath = System.IO.Path.GetDirectoryName(path);
            if (!IsDirectoryExist(dirPath)) CreateDirectory(dirPath);
    
            FileStream fs = new FileStream(path, FileMode.Create);
            await fs.WriteAsync(content, 0, content.Length);
            fs.Close();
        }
    
        public static bool IsDirectoryExist(string path)
        {
            return System.IO.Directory.Exists(path);
        }
    
        public static bool CreateDirectory(string path)
        {
            bool result = true;
            try
            {
                System.IO.Directory.CreateDirectory(path);
            }
            catch (Exception exp)
            {
                UnityEngine.Debug.LogErrorFormat("create directory fail {0}", exp.ToString());
                result = false;
            }
            return result;
        }
    
    
        public static string PrefixPath(string path)
        {
            switch (Application.platform)
            {
                case RuntimePlatform.Android:
                    return path;
                case RuntimePlatform.IPhonePlayer:
                case RuntimePlatform.OSXEditor:
                    return "file://" + path;
                case RuntimePlatform.WindowsPlayer:
                case RuntimePlatform.WindowsEditor:
                    return "file:///" + path;
                default:
                    UnityEngine.Debug.LogError("[PrefixPath] 不支持的平台:" + Application.platform.ToString());
                    return "";
            }
        }
    
        public static string GetStreamAssetsPath()
        {
    #if UNITY_ANDROID
            return "file:///" + Application.streamingAssetsPath
    #else
    
    
            return Application.streamingAssetsPath;
    #endif
        }
    }
    
    
    展开全文
  • Unity热更新之ILRuntime 广州市码锋网络有限责任公司创始人,从事...

    扫码下载「CSDN程序员学院APP」,1000+技术好课免费看

    APP订阅课程,领取优惠,最少立减5元 ↓↓↓

    订阅后:请点击此处观看视频课程

     

    视频教程-Unity热更新之ILRuntime-Unity3D

    学习有效期:永久观看

    学习时长:140分钟

    学习计划:3天

    难度:

     

    口碑讲师带队学习,让你的问题不过夜」

    讲师姓名:官剑铭

    CEO/董事长/总经理

    讲师介绍:广州市码锋网络有限责任公司创始人,从事游戏开发九年,熟练前后端的各种技术,我很乐意将企业中商用的技术分享给你,帮助你解决工作的各种问题.

    ☛点击立即跟老师学习☚

     

    「你将学到什么?」

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

    ILRuntime的优势

    同市面上的其他热更方案相比,ILRuntime主要有以下优点:

    • 无缝访问C#工程的现成代码,无需额外抽象脚本API
    • 直接使用VS2015进行开发,ILRuntime的解译引擎支持.Net 4.6编译的DLL
    • 执行效率是L#的10-20倍
    • 选择性的CLR绑定使跨域调用更快速,绑定后跨域调用的性能能达到slua的2倍左右(从脚本调用GameObject之类的接口)
    • 支持跨域继承
    • 完整的泛型支持
    • 拥有Visual Studio的调试插件,可以实现真机源码级调试。支持Visual Studio 2015 Update3 以及Visual Studio 2017
    _____________________________________________________________________________________________________________

    本课程带领大家极速的上手ILRuntime中,让大家学会在Unity如何快速集成ILRuntime热更新技术~

     

    「课程学习目录」

    1.通过HelloWorld示例入个门先
    2.概念说明
    3.调用热更工程中的静态方法(一)
    4.调用热更工程中的静态方法(二)
    5.实例化热更新里的类(一)
    6.实例化热更新里的类(二)
    7.成员调用
    8.泛型方法的调用(一)
    9.泛型方法的调用(二)
    10.在热更里监听按钮的点击
    11.在热更里监听用户输入框的输入
    12.Func的两种调用情况
    13.委托调用的总结
    14.跨域继承(一)
    15.跨域继承(二)
    16.重定向说明
    17.性能优化CLR绑定
    18.CLR绑定自动分析依赖
    19.利用async与await在方法内部实现等待

     

    7项超值权益,保障学习质量」

    • 大咖讲解

    技术专家系统讲解传授编程思路与实战。

    • 答疑服务

    专属社群随时沟通与讲师答疑,扫清学习障碍,自学编程不再难。

    • 课程资料+课件

    超实用资料,覆盖核心知识,关键编程技能,方便练习巩固。(部分讲师考虑到版权问题,暂未上传附件,敬请谅解)

    • 常用开发实战

    企业常见开发实战案例,带你掌握Python在工作中的不同运用场景。

    • 大牛技术大会视频

    2019Python开发者大会视频免费观看,送你一个近距离感受互联网大佬的机会。

    • APP+PC随时随地学习

    满足不同场景,开发编程语言系统学习需求,不受空间、地域限制。

     

    「什么样的技术人适合学习?」

    • 想进入互联网技术行业,但是面对多门编程语言不知如何选择,0基础的你
    • 掌握开发、编程技术单一、冷门,迫切希望能够转型的你
    • 想进入大厂,但是编程经验不够丰富,没有竞争力,程序员找工作难。

     

    「悉心打造精品好课,3天学到大牛3年项目经验」

    【完善的技术体系】

    技术成长循序渐进,帮助用户轻松掌握

    掌握Unity3D知识,扎实编码能力

    【清晰的课程脉络】

    浓缩大牛多年经验,全方位构建出系统化的技术知识脉络,同时注重实战操作。

    【仿佛在大厂实习般的课程设计】

    课程内容全面提升技术能力,系统学习大厂技术方法论,可复用在日后工作中。

     

    「你可以收获什么?」

    了解什么是热更新

    掌握ILRuntime脚本热更新技术

     

    展开全文
  • 最近公司项目要用到ILRuntime热更,安排我去弄。看着网上的各种教程,头秃了三天,算是把一些简单的热更给整出来了。也是踩坑无数……在此记录一下。 Tip:由于全程没有人指导,代码虽然可以实现,但写的是否合理、...
  • ILRuntime English Document 中文在线文档 由于近期墙的问题导致部分地区无法访问Github page,如遇到中文文档无法访问,请尝试翻墙 Unity Demo Project, Unity示例工程 QQ群:512079820
  • Unity ILRuntime框架设计

    2021-02-19 20:35:30
    框架的将提供以下这些接口,这些接口将从0开始,在Unity里将C#脚本编译成dll,然后将dll放到服务器上,再将dll下载下来,进行加载,到最后从Unity主工程调用热更新的代码逻辑. 1.Create hotfixdll接口 将热更部分的代码 ...
  • ILRuntimeUnity热更新插件,支持 安卓,ios等热更,内有Demo示例
  • Unity ILRuntime踩坑记录

    千次阅读 2019-06-16 10:13:00
    ILRuntime对多线程不兼容,在热更代码里使用多线程会导致Unity崩溃闪退 在热更代码里重写主工程的虚函数时,不能再调base.xxx(),否则会爆栈,也就是StackOverflow ...
  • Unity热更新之ILRuntime

    千人学习 2019-04-15 08:51:46
    ILRuntime项目为基于C#的平台(例如Unity)提供了一个纯C#实现,快速、方便且可靠的IL运行时,使得能够在不支持JIT的硬件环境(如iOS)能够实现代码的热更新 ILRuntime的优势 同市面上的其他热更方案相比,ILRuntime...
  • Unity接入ILRuntime步骤

    2020-04-11 14:28:39
    一、当然是先去下载...二、把ILRuntime项目中的ILRuntime、Dependencies文件夹复制到unity项目中 三、根据官方手册(https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html)删除ILRuntime文件夹中的...
  • Unity ILRuntime笔记-总结

    2020-01-21 18:48:26
    使用ILRuntime的原因: 参考:https://www.cnblogs.com/decode1234/p/10270911.html c# 编译成 IL,可以由Mono VM 解释执行 IL,但是Mono实现跨平台,需要针对每个平台进行移植,非常耗时耗力;并且Mono的版权所限...
  • 从0开始学习ILRuntime到框架设计,解决所有ILRuntime使用过程的问题.
  • ILRuntime学习记录

    千次阅读 2018-07-25 10:04:52
    Unity示例工程Github地址https://github.com/Ourpalm/ILRuntimeU3D/ 在线文档https://ourpalm.github.io/ILRuntime/  最近按照主程要求,学习了ILRuntime这个u3d的热更,首先当然是找到QQ群组织:51207...
  • Unity 接入 ILRuntime 热更方案

    千次阅读 2019-09-27 15:48:12
    引言 最近看了一下 ET 框架,本来只是研究一下网络模块,后来抽时间看一下热更框架...对 Unity 引擎有一定了解的开发者都应该知道: Unity 支持使用 C# 做脚本语言,是依赖 Mono 引擎运行 C# 编译后的 IL 中间语言...
  • https://github.com/meta-42/ILRuntime 教程 https://ourpalm.github.io/ILRuntime/public/v1/guide/index.html 转载于:https://www.cnblogs.com/sanyejun/p/7159263.html
  • Unity ILRuntime -- 多线程

    千次阅读 2018-08-16 09:44:32
    在ILRT中使用多线的话,要确保: 确保ILRT的某个方法执行时,只在一个线程(不要多线程,如两线程A,B,A执行了C.Method,...如下图,是我和ILRuntime作者在群里聊天的部分内容 (我就是哪个:Newbie,呵呵~) ...
  • 现在公司使用unity来做类似 容器插件化 的设计,即一个unity工程会在运行时根据时机加载不同的小app,这些小app都是一个单独的项目,全部使用 ILRuntime 来实现。于是就会有一个问题,每当需要创建一个小app的时候,...
  • 关于Unity项目的优化点,有很多博客介绍过,我也曾经发过很多,今天呢把一些具体的数据拿出来和大家分享 优化测试点 测试1 foreach 和 for循环的比较 测试代码/ gc ms/1w次 foreach循环遍历数组 gc:1.0MB 30...

空空如也

空空如也

1 2 3 4 5 ... 8
收藏数 147
精华内容 58
关键字:

ilruntimeunity