Unity 代码编译成dll 更新dll实现热更代码
Unity 代码编译成dll 更新dll实现热更代码
实现流程
- 代码编译成DLL
- DLL打包成AssetBundle
- 加载AssetBundle
- 加载代码程序集
- 获取指定类
- 使用反射赋值
C#代码编译成DLL
使用VS创建类库项目
- 模版->Visual C#-> .NET Framework 3.5-> 类库
- 名称即为DLL名字(反射的时候要用)

引用两个Unity相关DLL(防止编译报错)
- 右键项目->添加->引用

- 在引用管理器窗口->浏览->dll路径
- UnityEngine.dll默认路径:C:\Program Files\Unity\Editor\Data\Managed
- UnityEngine.UI.dll默认路径:C:\Program Files\Unity\Editor\Data\UnityExtensions\Unity\GUISystem

- 右键项目->添加->引用
编写一个继承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)

测试代码
- 创建一个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);//给字段赋值
}
}
效果如下

总结
- 代码图片都有就不上传工程
- 安卓测试完全没问题
- IOS不允许使用动态代码所以GG
- 我这里只是简单实现了 实际上有很多限制
Unity 代码编译成dll 更新dll实现热更代码的更多相关文章
- Unity3D热更新之LuaFramework篇[08]--热更新原理及热更服务器搭建
前言 前面铺垫了这么久,终于要开始写热更新了. Unity游戏热更新包含两个方面,一个是资源的更新,一个是脚本的更新. 资源更新是Unity本来就支持的,在各大平台也都能用.而脚本的热更新在iOS平台 ...
- C代码编译成可执行程序的过程
C代码通过编译器编译成可执行代码,经历了四个阶段,依次为:预处理.编译.汇编.链接. 接下来详细讲解各个阶段 一.预处理 1.任务:进行宏定义展开.头文件展开.条件编译,不检查语法. 2.命令:gcc ...
- OC代码编译成c++代码 编译器命令
xcrun -sdk iphoneos clang -arch x86_64 -rewrite-objc Person+Test.m clang -rewrite-objc -fobjc-arc -s ...
- 【CLR via C#】CSC将源代码编译成托管模块
下图展示了编译源代码文件的过程.如图所示,可用支持 CLR 的任何一种语言创建源代码文件.然后,用一个对应的编译器检查语法和分析源代码.无论选用哪一个编译器,结果都是一个托管模块(managedmod ...
- CLR基础,CLR运行过程,使用dos命令创建、编译、运行C#文件,查看IL代码
CLR是Common Language Runtime的缩写,是.NET程序集或可执行程序运行的一个虚拟环境.CLR用于管理托管代码,但是它本身是由非托管代码编写的,并不是一个包含了托管代码的程序集, ...
- Java native代码编译步骤简书
Java native代码编译步骤简书 目的:防止java代码反编译获取密码算法 (1)编写实现类com.godlet.PasswordAuth.java (2)编译java代码javac Passw ...
- 用python写个简单的小程序,编译成exe跑在win10上
每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...
- php代码编译的实现
1.php是解析型的高级语言,zend内核使用c语言实现,有main函数,php脚本就是输入,内核处理后输出结果,内核将php脚本翻译成c程序可识别的opcode就是php的编译. c语言的编译将c代 ...
- Windows下使用Graalvm将Javafx应用编译成exe
1 背景 Graalvm是Oracle推出的一款新型虚拟机,其中一个吸引人的功能是:它可以将Java代码编译成各个平台的本地代码,这些平台包括:linux.macOS.windows.iOS.andr ...
随机推荐
- 爬取微博的数据时别人用的是FM.view方法传递html标签那么jsoup怎么解析呢
使用JSOUP就行 这里给出点思路 我只做了自己的首页和其他人的微博首页的抓取 其他的抓取没尝试(不好意思 比较懒...) 首先是利用JSOUP进行登陆 获取页面 看了下微博的登陆表格 发现用了aja ...
- 假期训练六(poj-1753,递归+hdu-2844,多重背包)
题目一:传送门 题意:有一个4*4的棋盘,每次翻转一个棋子和它的上下左右的四个棋子,判断翻转多少次之后可以变为纯色的棋盘. 思路:总共有C(0,16)+C(1,16)+C(2,16)+……+C(16, ...
- High-radix routers
The idea is to reduce H (hops), by adding explicit links between physically distant routers, thus re ...
- hibernate执行createSQLQuery时字段重名的问题
hibernate执行createSQLQuery时字段重名的问题 不同表关联 ,表字段重名 =>之前若 as 别名 会自动区分 但有一次签移到新服务器 mysql 5.5上: 若字段重名:重 ...
- java socket之传输实体类对象
一.TCP编程 TCP协议是面向连接的.可靠地.有序的,以字节流的方式发送数据.java实现TCP通信依靠2个类:客户端的Socket类和服务器端的ServerSocket类. 基于TCP通信 ...
- MySQL/Oracle视图的创建与使用
1.什么是视图? 视图是一个虚拟的表,是一个表中的数据经过某种筛选后的显示方式,视图由一个预定义的查询select语句组成. 2.视图的特点. 视图中的数据并不属于视图本身,而是属于基本的表,对视 ...
- 5-具体学习git--分支冲突,merge合并
修改1.py: 然后提交修改: git commit -am "change 4 in master" 之后移到dev分支上: 哎呀,这个乱了. 人家意思是都基于c1分出来两个枝, ...
- gitlab常用命令
进入本地仓库访问位置之后执行命令 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote ...
- day24(JAVAWEB上传与下载)
javaWeb上传与下载 上传: 上传方式: jspSmartUpload :应用在jsp上的文件上传与下载组件. FileUpload :用用在jaava环境上的上传的功能 ...
- (记忆化搜索) FatMouse and Cheese(hdu 1078)
题目大意: 给n*n地图,老鼠初始位置在(0,0),它每次行走要么横着走要么竖着走,每次最多可以走出k个单位长度,且落脚点的权值必须比上一个落脚点的权值大,求最终可以获得的最大权值 (题目很容 ...