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)当中.在一个进程中可以包含多个应用程序域,一个应用程序域可以装载一个可执行程序( ...
随机推荐
- Android OpenGL ES 离屏渲染(offscreen render)
通常在Android上使用OpenGL ES,都是希望把渲染后的结果显示在屏幕上,例如图片处理.模型显示等.这种情况下,只需要使用Android API中提供的GLSurfaceView类和Rende ...
- [转]MBProgressHUD 源码分析
源码来源: https://github.com/jdg/MBProgressHUD 版本:0.9.1 MBProgressHUD是一个显示HUD窗口的第三方类库,用于在执行一些后台任务时,在程序中显 ...
- 使用 Python 解数学方程
SymPy是符号数学的Python库.它的目标是成为一个全功能的计算机代数系统,同时保持代码简洁.易于理解和扩展 服务器Ubuntu 1.安装Python 2.安装SymPy库 sudo pip in ...
- Python游戏《外星人入侵》来了~
在游戏<外星人入侵>中,玩家控制着一艘最初出现在屏幕底部中央的飞船.玩家可以使用箭头键左右移动飞船,还可使用空格键进行射击.游戏开始时,一群外星人出现在天空中,他们在屏幕中向下移动.玩家的 ...
- BIOS、EFI与UEFI详解
https://blog.csdn.net/Scythe666/article/details/79708293
- 本地存储(LocalStorage、SessionStorage、Web SQL Database、Indexed DB)
https://www.cnblogs.com/SeeYouBug/p/6127001.html https://blog.csdn.net/inter_peng/article/details/49 ...
- js实现webSocket客户端
var ws = new WebSocket("ws://localhost:8080/msg"); //readyState属性返回实例对象的当前状态,共有四种. //CONNE ...
- VMWare------安装时出现无法将值写入注册表项
安装时提示详情: 无法打开注册表项UNKNOWN\Components\...请确认你是否有足够的权限访问该注册表项,或者与技术支持人员联系. 解决方法: 关掉360安全卫士等软件再安装
- Log4net用法(.config文件)
1.引用log4net.dll 2.在AssemblyInfo.cs中添加初始化: [assembly: log4net.Config.XmlConfigurator(ConfigFile = &qu ...
- Linux环境SVN命令行使用经验总结(转)
在windows机器上开发得差不多了之后,打包传送到开发机编译,在开发机上解决编译错误. [缺点] 浪费时间在打包解包,机器间传输代码. 在windows机器上开发之后,check in代码进分支,在 ...