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(0, 0, 200, 200), "Load"))
        {
            StartCoroutine(Load());
        }
    }
}
时间: 2024-11-03 21:50:58

Unity3D Android动态反射加载程序集的相关文章

动态创建加载程序集

public class CodeProvider { //动态创建Driver类 private string strStart = "using System;" + "public static class Driver { public static void Main(){ "; private string strEnd = " } }"; /// <summary> /// 根据输入的文本动态编译,返回编译结果 ///

使用C#的AssemblyResolve事件动态解析加载失败的程序集

我们知道反射是 依赖注入 模式的基础,依赖注入要求只在项目中引用定义接口的程序集,而不引用接口实现类的程序集,因为接口实现类的程序集应该是通过反射来动态加载的,这样才能保证接口与其实现类之间的松耦合.可是有时候我们使用反射动态加载程序集的时候会失败,因为除非我们手动将接口实现类的程序集放在项目生成后的bin目录下,或者是在GAC中,否者.Net Framework并不知道该到哪里去寻找接口实现类的dll程序集文件.幸运的是我们如果使用 AppDomain.CurrentDomain.Assemb

C# 动态加载程序集信息

在设计模式的策略模式中,需要动态加载程序集信息,本文通过一个简单的实例,来讲解动态加载Dll需要的知识点. 涉及知识点: AssemblyName类,完整描述程序集的唯一标识, 用来表述一个程序集. Assembly类,在System.Reflection命名空间下,表示一个程序集,它是一个可重用.无版本冲突并且可自我描述的公共语言运行时应用程序构建基块. Module类 表述在模块上执行反射,表述一个程序集的模块信息. Type类,在System命名空间下,表示类型声明:类类型.接口类型.数组

C#使用反射加载多个程序集

当开发插件的时候需要用到反射,在客户端动态加载遍历程序集,并调用每个程序集的方法. 创建一个控制台应用程序,首先设计一个接口: public interface ISay { void SaySth(); } 在控制台应用程序下创建Plugins文件夹,控制台的可执行文件和所有程序集文件都生成在这里.右键控制台项目--"属性"--"生成",把"输出路径"设置成Plugins文件夹. 创建类库项目Assembly1,添加对控制台项目的引用,并创建实

C# 动态加载程序集dll (实现接口)

一.程序集(接口程序集):LyhInterface.Dll namespace LyhInterface{    public interface ILyhInterface    {        void Run();    }} 二.程序集(实现接口的程序集):LyhClassLibrary1.dll, LyhClassLibrary2.dll,LyhClassLibrary3.dll,所有程序集引用:LyhInterface.dll namespace LyhClassLibrary1{

Unity3d热更新全书-加载(二)如何在不用AssetBundle的前提下动态加载预设

Unity3D的主要构成大家都知道,首先是场景图,场景图上的节点构成一颗树. 每个节点对应一个GameObject对象 然后每个GameObject有若干个组件 有一些组件会与资源产生关系,比如MeshRenderer会关联材质,材质会关联shader和贴图 场景图的一部分可以被保存为一个预设,prefab. 有时候我们会需要用预设去复用,而预设的加载似乎只能通过AB去打包,其实不然,这里我们有一个开源的库就可以解决这个问题. 为什么不使用AB,可以见上一篇,加载(一),不使用AB一份资源全平台

android左右滑动加载分页以及动态加载数据

android UI 往右滑动,滑动到最后一页就自动加载数据并显示 如图: Java代码 package cn.anycall.ju; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.content.ActivityNotFoundException; impo

仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢?

原文:仅反射加载(ReflectionOnlyLoadFrom)的 .NET 程序集,如何反射获取它的 Attribute 元数据呢? 平时我们获取一个程序集或者类型的 Attribute 是非常轻松的,只需要通过 GetCustomAttribute 方法就能拿到实例然后获取其中的值.但是,有时我们仅为反射加载一些程序集的时候,获取这些元数据就不那么简单了,因为我们没有加载目标程序集中的类型. 本文介绍如何为仅反射加载的程序集读取 Attribute 元数据信息. 本文内容 仅反射加载一个程序

Android图片异步加载之Android-Universal-Image-Loader类库的使用

Android开发中我们会经常遇到图片过多或操作不当造成Out of Memory异常,有时虽然是解决了这个问题但却会影响程序的运行效率,例如:当用户在快速滑动滚动条的过程中,我们程序在仍在艰难的加载服务器端的图片,这样给用户造成了极不好的体验.其实网络上关于图片的异步加载和缓存的讲解很多,但是其实,写一个这方面的程序还是比较麻烦的,要考虑多线程,缓存,内存溢出等很多方面,针对这一广大开发者都会遇到的问题,一些牛人们已经帮我们解决了这一问题,今天我为大家介绍一款很流行的开源类库,可以很很好的解决