Unity 代码编译成dll 更新dll实现热更代码

时间:2021-08-05 12:48:41

Unity 代码编译成dll 更新dll实现热更代码

实现流程

  • 代码编译成DLL
  • DLL打包成AssetBundle
  • 加载AssetBundle
  • 加载代码程序集
  • 获取指定类
  • 使用反射赋值

C#代码编译成DLL

  • 使用VS创建类库项目

    • 模版->Visual C#-> .NET Framework 3.5-> 类库
    • 名称即为DLL名字(反射的时候要用)

      Unity 代码编译成dll 更新dll实现热更代码
  • 引用两个Unity相关DLL(防止编译报错)

    • 右键项目->添加->引用

      Unity 代码编译成dll 更新dll实现热更代码
    • 在引用管理器窗口->浏览->dll路径
    • UnityEngine.dll默认路径:C:\Program Files\Unity\Editor\Data\Managed
    • UnityEngine.UI.dll默认路径:C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity\GUISystem

      Unity 代码编译成dll 更新dll实现热更代码
  • 编写一个继承MonoBehaviour的简单代码

using UnityEngine;
using UnityEngine.UI; namespace A
{
public class Class1 : MonoBehaviour
{
public Text text; int number = 0; void Update()
{
if (Input.GetMouseButtonDown(0))
{
number++;
text.text = "鼠标左键按下:" + number;
}
}
}
}
  • 生成DLL
    • 右键项目 生成
    • 在项目的bin\Debug目录获得DLL

DLL打包成AssetBundle

  • 把生成的DLL后缀修改为bytes(unity不支持dll后缀打包为AssetBundle)(下图1)
  • 放入项目中 设置AssetBundleName(下图2)
  • 打包代码(放入Editor文件夹)(下图3)
using UnityEngine;
using System.Collections;
using UnityEditor;
using System.IO; public class BuildAssetBunble
{
[MenuItem("BuildAsset/Bunble")]
public static void Build()
{
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.DeterministicAssetBundle, EditorUserBuildSettings.activeBuildTarget); AssetDatabase.Refresh();
}
}
  • 创建StreamingAssets放入AssetBundle文件(下图4)
  • 点击BuildAsset/Bunble按钮(下图5)

Unity 代码编译成dll 更新dll实现热更代码

测试代码

  • 创建一个Text游戏对象
  • 新建一个Test代码挂在到Text游戏对象上

using UnityEngine;
using UnityEngine.UI;
using System;
using System.Reflection; public class Test : MonoBehaviour
{
void Start()
{
Text text = gameObject.GetComponent<Text>();//获取组建 string path = string.Empty; if (Application.platform == RuntimePlatform.WindowsEditor)
{
path = Application.streamingAssetsPath + "/a_dll";
}
else if (Application.platform == RuntimePlatform.Android)
{
path = Application.streamingAssetsPath + "!assets/a_dll";
} AssetBundle assetBundle = AssetBundle.LoadFromFile(path);//加载AssetBundle TextAsset textAsset = assetBundle.LoadAsset<TextAsset>("A");//加载AssetBundle中的A Assembly assembly = Assembly.Load(textAsset.bytes);//加载托管程序集 Type item = assembly.GetType("A.Class1");//获取程序集指定类 Component comparer = gameObject.AddComponent(item);//添加到游戏对象上 FieldInfo fieldInfo = comparer.GetType().GetField("text");//使用反射获取实例的字段 fieldInfo.SetValue(comparer, text);//给字段赋值
}
}

效果如下

Unity 代码编译成dll 更新dll实现热更代码

总结

  • 代码图片都有就不上传工程
  • 安卓测试完全没问题
  • IOS不允许使用动态代码所以GG
  • 我这里只是简单实现了 实际上有很多限制

Unity 代码编译成dll 更新dll实现热更代码的更多相关文章

  1. Unity3D热更新之LuaFramework篇&lbrack;08&rsqb;--热更新原理及热更服务器搭建

    前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...

  2. C代码编译成可执行程序的过程

    C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc ...

  3. OC代码编译成c&plus;&plus;代码 编译器命令

    xcrun -sdk iphoneos clang -arch x86_64 -rewrite-objc Person+Test.m clang -rewrite-objc -fobjc-arc -s ...

  4. 【CLR via C&num;】CSC将源代码编译成托管模块

    下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...

  5. CLR基础,CLR运行过程,使用dos命令创建、编译、运行C&num;文件,查看IL代码

    CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...

  6. Java native代码编译步骤简书

    Java native代码编译步骤简书 目的:防止java代码反编译获取密码算法 (1)编写实现类com.godlet.PasswordAuth.java (2)编译java代码javac Passw ...

  7. 用python写个简单的小程序,编译成exe跑在win10上

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  8. php代码编译的实现

    1.php是解析型的高级语言,zend内核使用c语言实现,有main函数,php脚本就是输入,内核处理后输出结果,内核将php脚本翻译成c程序可识别的opcode就是php的编译. c语言的编译将c代 ...

  9. Windows下使用Graalvm将Javafx应用编译成exe

    1 背景 Graalvm是Oracle推出的一款新型虚拟机,其中一个吸引人的功能是:它可以将Java代码编译成各个平台的本地代码,这些平台包括:linux.macOS.windows.iOS.andr ...

随机推荐

  1. ntp服务器搭建与客户端设置

    服务器对时间要求非常严格,linux服务器文件的生成,日志,以及数据库的连接都是根据时间的逻辑 进行任务处理,如果时间不同步,那么,处理的任务,以及出问题的分析日志,时间不对,很难分析 直接更改lin ...

  2. 简单实现异步编程promise模式

    本篇文章主要介绍了异步编程promise模式的简单实现,并对每一步进行了分析,需要的朋友可以参考下 异步编程 javascript异步编程, web2.0时代比较热门的编程方式,我们平时码的时候也或多 ...

  3. openstack-L版安装

    参照官方install document: http://docs.openstack.org/liberty/install-guide-rdo/ 实验环境:centos7.2 桥接: 192.16 ...

  4. Jquery select 选中项中自定义的值

    给select 赋值,除了已有的value及text,新建一属性simple_name function GetDicOfficeList(dicType, sid) { $.ajax({ url: ...

  5. django基本命令备忘录

    1. 新建一个 django project django-admin.py startproject project-name 新建 app python manage.py startapp ap ...

  6. 织梦DEDECMS &lbrace;dede&colon;field name&equals;&&num;39&semi;position&&num;39&semi;&sol;&rcub;标签增加其它属性的

    在默认情况下,织梦(DedeCms)系统当前位置的调用标签为: {dede:field name='position'/} 在这种默认的情况下,生成后的代码大致为如下格式: 主页 > 应用软件 ...

  7. 在NOARCHIVELOG和ARCHIVELOG模式之间选择

    本节介绍在选择以NOARCHIVELOG或ARCHIVELOG模式运行数据库时必须考虑的问题,并包含以下主题: 在NOARCHIVELOG模式下运行数据库 在ARCHIVELOG模式下运行数据库 是否 ...

  8. jdbc --例子7

    package cn.kitty.o1; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLE ...

  9. Mysql 索引 n-gram分词引擎使用

    概述: 类似于书籍的目录,找到一本书的特定内容,需要首先找到内容对应页码,定位对应页码 存储引擎使用类似方法进行数据查找,先找到索引中对应值,然后根据匹配的索引找到对应行 实现原理: 索引的实现通常使 ...

  10. mysql、oracle 中按照拼音首字母排序

    mysql中按照拼音首字母排序 convert(name using gbk) ASC 注:name 为字段名称 oracle中按照拼音首字母排序 nlssort(enterprise_name,'N ...