zoukankan      html  css  js  c++  java
  • 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());
            }
        }
    }
  • 相关阅读:
    在IE和Firfox获取keycode
    using global variable in android extends application
    using Broadcast Receivers to listen outgoing call in android note
    help me!virtual keyboard issue
    using iscroll.js and iscroll jquery plugin in android webview to scroll div and ajax load data.
    javascript:jquery.history.js使用方法
    【CSS核心概念】弹性盒子布局
    【Canvas学习笔记】基础篇(二)
    【JS核心概念】数据类型以及判断方法
    【问题记录】ElementUI上传组件使用beforeupload钩子校验失败时的问题处理
  • 原文地址:https://www.cnblogs.com/mrblue/p/7323896.html
Copyright © 2011-2022 走看看