Unity3D Android动态反射加载程序集
这种办法在iOS下是不让用的,只能在Android下用。用起来也很方便了。
1、先创建一个c#工程,引用到的UnityEngine.dll在Unity的安装目录里找吧

2、将编译的dll放入Unity工程,并打成assetBundle。(要把缀名改成.bytes,这个类型Unity才识别,才能打成assetbundle)

打bundle代码
#if UNITY_EDITOR
[MenuItem("GameObject/BuildAsset")]
static void BuildAsset()
{
var se = Selection.GetFiltered(typeof (Object), SelectionMode.DeepAssets); foreach (var o in se)
{
string sp = AssetDatabase.GetAssetPath(o);
string tar = Application.streamingAssetsPath + "/" + o.name + ".unity3d"; if (!BuildPipeline.BuildAssetBundle(o, null, tar, BuildAssetBundleOptions.CollectDependencies,BuildTarget.Android))
{
Debug.Log(tar);
}
}
AssetDatabase.Refresh(); }
#endif
右键点资源,就有BuildAsset

bundle就会生成StreamingAssets里
3、写测试代码
using System.Collections;
using System.Collections.Generic;
#if UNITY_EDITOR
using UnityEditor;
#endif
using UnityEngine; public class TestGame : MonoBehaviour
{ // Use this for initialization
void Start ()
{ } // Update is called once per frame
void Update () { } IEnumerator Load()
{
#if UNITY_EDITOR
var path = "file://" + Application.streamingAssetsPath + "/" + "ReflectTest.dll.unity3d";
#else
#if UNITY_ANDROID
var path = "jar:file://" + Application.dataPath + "!/assets/" + "ReflectTest.dll.unity3d";
#elif UNITY_IOS
var path = Application.dataPath + "/Raw/"+"ReflectTest.dll.unity3d";
#endif
#endif //var path = "file://"+Application.streamingAssetsPath + "/" + "HelipadEscapeGame.unity3d";
Debug.Log("path="+path);
using (WWW www = new WWW(path))
{
yield return www;
var tex = www.assetBundle.LoadAsset<TextAsset>("ReflectTest.dll");
//var tex = www.assetBundle.LoadAsset<TextAsset>("HelipadEscapeGame"); var ass = System.Reflection.Assembly.Load(tex.bytes);
var type = ass.GetType("Class1"); gameObject.AddComponent(type);
} }
#if UNITY_EDITOR
[MenuItem("Assets/BuildAsset")]
static void BuildAsset()
{
var se = Selection.GetFiltered(typeof (Object), SelectionMode.DeepAssets); foreach (var o in se)
{
string sp = AssetDatabase.GetAssetPath(o);
string tar = Application.streamingAssetsPath + "/" + o.name + ".unity3d"; if (!BuildPipeline.BuildAssetBundle(o, null, tar, BuildAssetBundleOptions.CollectDependencies,BuildTarget.Android))
{
Debug.Log(tar);
}
}
AssetDatabase.Refresh(); }
#endif
void OnGUI()
{
if (GUI.Button(new Rect(, , , ), "Load"))
{
StartCoroutine(Load());
}
}
}
Unity3D Android动态反射加载程序集的更多相关文章
- Unity热更新之C#反射加载程序集
用C#反射加载程序集的方式可以动态的从assetBundle资源包或其他资源包里加载脚本到工程中,即便是原工程中不存在的脚本. 我这里就用加载本地assetBundle的方式来进行讲解了,加载网络上的 ...
- 使用C#的AssemblyResolve事件动态解析加载失败的程序集
我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...
- 使用C#的AssemblyResolve事件和TypeResolve事件动态解析加载失败的程序集
我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合. ...
- Android系统下的动态Dex加载
1 问题在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把使用 ...
- C#动态加载程序集(转)
C#动态加载程序集 今天在看网络上的一篇关于‘.NET应用自动部署窗体技术’.NET的自动部署技术构造在.NET框架之中,它使得应用程序能够通过HTTP连接从远程服 务器按需下载程序集.有了这个功能, ...
- Android系统下的动态Dex加载与app速度优化
1 问题 在Android系统中,一个App的所有代码都在一个Dex文件里面.Dex是一个类似Jar的存储了多有Java编译字节码的归档文件.因为Android系统使用Dalvik虚拟机,所以需要把 ...
- C# 动态加载程序集信息
本文通过一个简单的实例,来讲解动态加载Dll需要的知识点.仅供学习分享使用,如有不足之处,还请指正. 在设计模式的策略模式中,需要动态加载程序集信息. 涉及知识点: AssemblyName类,完整描 ...
- C#使用反射加载多个程序集
当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法. 创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth( ...
- 应用程序域 System.AppDomain,动态加载程序集
一.概述 使用.NET建立的可执行程序 *.exe,并没有直接承载到进程当中,而是承载到应用程序域(AppDomain)当中.在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序( ...
随机推荐
- Thinkphp5笔记一:项目部署
系统:window 7 64位 Thinkphp版本:5.0.5 环境:wampserver集成 笔记分为两大部分,配置篇与数据库篇 一.虚拟主机部署/本地部署 在网站根目录下建立文件index.ph ...
- koa-route模块
const Koa = require('koa'); const route = require('koa-route'); const app = new Koa(); const about = ...
- Node.js之 EventLoop 理解(转)
关于Node.js的第一个基本概念是I/O操作开销是巨大的: 所以,当前变成技术中最大的浪费来自于等待I/O操作的完成.有几种方法可以解决性能的影响: 同步方式:按次序一个一个的处理请求.利:简单:弊 ...
- 8 map的用法
what's map go里面的map和python字典差不多. 类似其他语言中的哈希表或者字典,以key-value的形式存储的数据 key必须是支持==或者!=比较运算的类型,不可以是函数.map ...
- CorelDRAW中如何再制对象详解
再制对象指的是快捷地将对象按一定的方式复制为多个对象,此种复制是复制的复制,再制不仅可以节省复制的时间,再制间距还可以保证复制效果.本教程将详解如何在CorelDRAW软件中再制对象. CorelDR ...
- 申请LINE 帐号的所有方法
如果你打算用LINE 交朋友或是做行销,你就必须先要拥有一个甚至许多个LINE 帐号.在本篇文章中,将分享给你目前申请LINE 帐号的所有可能方法. 目前LINE 公司允许大家使用以下二种身分申请LI ...
- pytesseract 报windows err no2的错误
需要把源安装文件pytesseract.py的修改为,tesseract_cmd = 'C:/Program Files (x86)/Tesseract-OCR/tesseract.exe' 原始是t ...
- Git------创建本地库时绿色标志不显示
转载: http://blog.csdn.net/zixiao217/article/details/77018392 解决方法: 按Win+R键打开运行对话框,输入 regedit.exe ,准备修 ...
- vim分屏
使用vim分屏的时候 ,可以在终端直接输入 vim -On 1.php 2.php 3.php 垂直分屏 三个文件 如果是在某个窗口里面想打开另外一个文件如何做呢? 按下esc,然后按下冒号 输入 回 ...
- NuGet的几个小技巧(转)
NuGet的几个小技巧 因为可视化库程序包管理器的局限性,有很多需要的功能在界面中无法完成. 以下技巧均需要在“程序包管理器控制台”中使用命令来完成. 一.改变项目目标框架后,更新程序包 当改变项 ...