ILRuntime是如何与Unity互相调用的

这篇具有很好参考价值的文章主要介绍了ILRuntime是如何与Unity互相调用的。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、ILRuntime的基本介绍

ILRuntime是一个跨平台CLR实现,它可以在多个平台上运行C#代码,包括Android、iOS、Windows、Linux等等。ILRuntime的实现方式是将C#代码编译成IL代码,然后在运行时通过JIT或AOT的方式将IL代码转换为机器代码,从而实现跨平台的效果。ILRuntime的主要功能包括热更新、动态加载、代码加密等等。

对啦!这里有个游戏开发交流小组里面聚集了一帮热爱学习游戏的零基础小白,也有一些正在从事游戏开发的技术大佬,欢迎你来交流学习。

二、Unity与ILRuntime的集成

Unity与ILRuntime的集成主要包括以下几个步骤:

1、添加ILRuntime的插件

首先需要将ILRuntime的插件添加到Unity项目中,这可以通过Unity Asset Store中搜索“ILRuntime”来获取。

2、修改Unity项目的脚本编译方式

默认情况下,Unity项目中的脚本会被编译为Mono或IL2CPP,但是为了使用ILRuntime,需要将脚本编译为.NET Standard 2.0。这可以通过修改Unity项目的Player Settings来实现,在Player Settings中选择“Other Settings”并将“Scripting Runtime Version”设置为.NET 4.x Equivalent,同时将“Api Compatibility Level”设置为.NET Standard 2.0。

3、创建ILRuntime的AppDomain

ILRuntime的AppDomain是一个独立的运行环境,它可以加载和运行IL代码。在Unity项目中,需要在启动时创建一个ILRuntime的AppDomain,并将IL代码加载到AppDomain中。这可以通过在Unity项目中创建一个启动脚本来实现。在启动脚本中,需要使用ILRuntime的API加载和运行IL代码,例如:

using ILRuntime.Runtime.Enviorment;

public class Startup : MonoBehaviour
{
    private AppDomain appDomain;

    private void Start()
    {
        appDomain = new AppDomain();
        appDomain.LoadAssembly("Assembly-CSharp");
        appDomain.Invoke("Assembly-CSharp.Main", "Start", null);
    }

    private void Update()
    {
        appDomain.Invoke("Assembly-CSharp.Main", "Update", null);
    }
}

在上面的代码中,创建了一个ILRuntime的AppDomain,并将“Assembly-CSharp”程序集加载到AppDomain中。然后在Start和Update方法中,通过AppDomain的Invoke方法调用“Assembly-CSharp.Main”类的“Start”和“Update”方法。

三、Unity与ILRuntime的交互

Unity与ILRuntime之间的交互主要通过以下几种方式实现:

1、使用ILRuntime的API调用Unity的API

ILRuntime提供了一些API来调用Unity的API,例如:

using UnityEngine;
using ILRuntime.Runtime.Enviorment;

public class Main : MonoBehaviour
{
    private AppDomain appDomain;

    private void Start()
    {
        appDomain = new AppDomain();
        appDomain.LoadAssembly("Assembly-CSharp");
        appDomain.Invoke("Assembly-CSharp.Main", "Start", null);

        var go = appDomain.Instantiate("Assembly-CSharp.TestGameObject");
        var transform = go.GetComponent<Transform>();
        transform.position = new Vector3(1, 2, 3);
    }

    private void Update()
    {
        appDomain.Invoke("Assembly-CSharp.Main", "Update", null);
    }
}

在上面的代码中,使用ILRuntime的API创建了一个GameObject,并获取了它的Transform组件,然后设置了Transform的位置。

2、使用Unity的API调用ILRuntime的API

Unity可以通过反射机制调用ILRuntime中的API,例如:

using UnityEngine;
using System.Reflection;
using ILRuntime.Runtime.Enviorment;

public class Main : MonoBehaviour
{
    private AppDomain appDomain;

    private void Start()
    {
        appDomain = new AppDomain();
        appDomain.LoadAssembly("Assembly-CSharp");
        appDomain.Invoke("Assembly-CSharp.Main", "Start", null);

        var type = appDomain.LoadedTypes["Assembly-CSharp.TestClass"];
        var method = type.GetMethod("TestMethod");
        method.Invoke(null, null);
    }

    private void Update()
    {
        appDomain.Invoke("Assembly-CSharp.Main", "Update", null);
    }
}

在上面的代码中,使用Unity的反射机制获取了ILRuntime中的“Assembly-CSharp.TestClass”类型和“TestMethod”方法,并调用了它。

3、使用委托实现Unity和ILRuntime的互相调用

ILRuntime提供了一个DelegateBridge类,它可以将Unity和ILRuntime中的委托类型互相转换。例如:

using UnityEngine;
using System;
using ILRuntime.Runtime.Enviorment;

public class Main : MonoBehaviour
{
    private AppDomain appDomain;

    private void Start()
    {
        appDomain = new AppDomain();
        appDomain.LoadAssembly("Assembly-CSharp");
        appDomain.Invoke("Assembly-CSharp.Main", "Start", null);

        var type = appDomain.LoadedTypes["Assembly-CSharp.TestClass"];
        var method = type.GetMethod("TestMethod");
        var action = DelegateBridge.CreateDelegate(typeof(Action), method) as Action;
        action();
    }

    private void Update()
    {
        appDomain.Invoke("Assembly-CSharp.Main", "Update", null);
    }
}

在上面的代码中,使用DelegateBridge类将ILRuntime中的“Assembly-CSharp.TestClass.TestMethod”方法转换为Unity的Action委托类型,并调用了它。

四、ILRuntime的热更新

ILRuntime的热更新是指在运行时替换IL代码,从而实现应用程序的更新。ILRuntime的热更新主要包括以下几个步骤:

1、在ILRuntime的AppDomain中替换IL代码

ILRuntime的AppDomain可以在运行时加载和卸载IL代码,因此可以在运行时替换IL代码。例如:

using UnityEngine;
using ILRuntime.Runtime.Enviorment;

public class Main : MonoBehaviour
{
    private AppDomain appDomain;

    private void Start()
    {
        appDomain = new AppDomain();
        appDomain.LoadAssembly("Assembly-CSharp");
        appDomain.Invoke("Assembly-CSharp.Main", "Start", null);
    }

    private void Update()
    {
        appDomain.Invoke("Assembly-CSharp.Main", "Update", null);

        // 热更新
        var newIL = File.ReadAllBytes("Assembly-CSharp.dll");
        appDomain.LoadAssembly(newIL);
        appDomain.Invoke("Assembly-CSharp.Main", "OnHotUpdate", null);
    }
}

在上面的代码中,使用ILRuntime的API加载了“Assembly-CSharp”程序集,并在Update方法中热更新了IL代码。

2、使用Unity的AssetBundle实现热更新

ILRuntime的热更新也可以使用Unity的AssetBundle来实现,这可以通过将IL代码打包为AssetBundle,并在运行时下载和加载AssetBundle来实现。例如:

using UnityEngine;
using System.Collections;
using ILRuntime.Runtime.Enviorment;

public class Main : MonoBehaviour
{
    private AppDomain appDomain;

    private void Start()
    {
        StartCoroutine(DownloadAndLoadAssetBundle());
    }

    private void Update()
    {
        appDomain.Invoke("Assembly-CSharp.Main", "Update", null);
    }

    private IEnumerator DownloadAndLoadAssetBundle()
    {
        var request = UnityWebRequestAssetBundle.GetAssetBundle("http://localhost/Assembly-CSharp.assetbundle");
        yield return request.SendWebRequest();
        var assetBundle = DownloadHandlerAssetBundle.GetContent(request);
        var il = assetBundle.LoadAsset<TextAsset>("Assembly-CSharp.dll");
        appDomain = new AppDomain();
        appDomain.LoadAssembly(il.bytes);
        appDomain.Invoke("Assembly-CSharp.Main", "Start", null);
    }
}

在上面的代码中,使用Unity的WebRequest下载了“Assembly-CSharp.assetbundle”文件,并使用AssetBundle加载了“Assembly-CSharp.dll”文件,并将IL代码加载到ILRuntime的AppDomain中。文章来源地址https://www.toymoban.com/news/detail-567611.html

到了这里,关于ILRuntime是如何与Unity互相调用的的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用Rider C# Dll工程和Unity工程互相调用、断点方法

    创建C# Dll工程,生成C#工程Dll 创建Unity工程 Unity调用C#工程的代码 C#工程调用Unity工程的代码 断点方法 创建工程 选这个,注意UnityEngineDll这个选项,要选你目标unity版本的Dll 生成Dll 右键工程 简单,能看到这篇文章的都是优秀的同学,所以,此步略过 下面这两个复制到unity工程

    2024年01月20日
    浏览(58)
  • 【Unity】 基础交互入门(C#脚本互相调用的方法,含动态绑定脚本)

    脚本A: 在需要被调用的类里这样写: 脚本B: 在其他类里调用: 如果出现无法识别上下文的提示,检查一下以下问题: 1、两个脚本的命名空间是否一致,如果不需要的命名空间可以直接删除。 2、类名是否大写开头,且命名合法,且和文件名一致。 3、更新编译一下保存一

    2024年02月15日
    浏览(53)
  • Unity ILRuntime热更新(二)

    2024年02月12日
    浏览(42)
  • Unity ILRuntime热更新(一)

    Name: ILRuntime Url: https://registry.npmjs.org Scopes: com.ourpalm 左上角的Packages选择My Registries选项 选择其中的ILRuntime并安装 安装完成后 再导入其示例工程 我们需要在工具栏的Edit中选择ProjectSettings 在Other Setting 中 勾选 Allow ‘unsafe’ Code 的选项 看到一个HotFix_Project的文件夹,该文件夹在

    2024年02月12日
    浏览(36)
  • 十八、Unity游戏引擎入门

    1、下载     首先需要下载Unity Hub,下载网址:https://unity.com/cn。     然后在其中下载Unity编辑器并安装,可选择最新版本。     接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件,例

    2024年02月16日
    浏览(79)
  • Unity 热更新方案之——ILRuntime

    做游戏离不开热更新,目前市面上热更新方案用的比较多的是Lua(XLua,ToLua),最近又出现了基于C#的热更新 huatuo(已改名HybridCLR又叫wolong)。来不及学习了,以后用到了再去了解吧。 笔者入行做的第一个项目是利用ILRuntime进行热更新的,当时也是用的稀里糊涂的,一些坑点

    2023年04月08日
    浏览(38)
  • 使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(78)
  • Unity、UE、Cocos游戏开发引擎的区别

    Unity、Unreal Engine(UE)和Cocos引擎是三个常用的游戏开发引擎,它们在功能和特性上有一些区别。以下是它们之间的主要区别: 编程语言:Unity使用C#作为主要的编程语言,开发者可以使用C#脚本进行游戏逻辑编写。Unreal Engine主要使用C++作为编程语言,但也支持蓝图系统,允许

    2024年02月22日
    浏览(66)
  • Unity vs Godot :哪个游戏引擎更适合你?

    游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来,Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较,以期为开发者提供正确的选择建议。 Godot和Unity都有各自的优势,没有绝对的好坏之分。Godot开源免费,上手简单,更适合2D和小型游戏

    2024年01月23日
    浏览(98)
  • 30分钟了解所有引擎组件,132个Unity 游戏引擎组件速通!【收藏 == 学会】

    🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN 🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 🌲Unity实战100例专栏推荐:Unity 实战100例 教程 🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📆 未来很长

    2024年02月11日
    浏览(74)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包