把腳本抽取出來做成dll:
1.打開vs新建項目
2.選擇類庫簿寂,設置目標框架為.NET Framework3.5(根據(jù)unity版本來選,4.x版本的選2.0,5.x版本用3.5的),或者項目建成后選擇項目嗽交,右鍵點擊篮幢,選擇屬性在應用程序那里也可以設置目標框架
3.點擊確定打開項目
4.把腳本文件拷貝到項目的目錄里,右鍵點擊項目穷缤,選擇添加現(xiàn)有項敌蜂,選擇剛拷貝的腳本文件,把腳本文件添加到項目里
5.設置相關(guān)引用津肛,到unity的安裝目錄找到UnityEngine.dll章喉,設置為項目引用,解決報錯等
6.根據(jù)需要設置解決方案配置為Release或Debug身坐,右鍵點擊項目選擇生成
7.在項目目錄的bin文件夾下即可找到對應生成的dll
dll的加載反射:
1.把dll文件后綴改為bytes(好像是必須是這個后綴的秸脱,少了一個s都坑了我半天),打包成AB文件
2.加載AB文件獲取Bytes數(shù)據(jù)
3.反射部蛇,獲取類實現(xiàn)代碼
IEnumerator TestLoadDll()
? ? {
? ? ? ? string path = "dllassets/testdll.bytes.unity3d";
? ? ? ? if (Application.isEditor || Application.platform == RuntimePlatform.WindowsPlayer)
? ? ? ? {
? ? ? ? ? ? path = "file:///" + Application.dataPath + "/StreamingAssets/" + path;
? ? ? ? }
? ? ? ? else if (Application.platform == RuntimePlatform.Android)
? ? ? ? {
? ? ? ? ? ? path = Application.streamingAssetsPath + "/" + path;
? ? ? ? }
? ? ? ? else
????????{
?????????path = "file:///" + Application.streamingAssetsPath + "/" + path;
????????}
? ? ? ? WWW www= new WWW(path);
? ? ? ? yield return www;
? ? ? ? if(www.error != null)
? ? ? ? {
? ? ? ? ? ? Debug.LogError("加載出錯: " + www.error);
? ? ? ? ? ? yield break;
? ? ? ? }
? ? ? ? Object obj = www.assetBundle.LoadAsset("testdll.bytes");
? ? ? ? //Assembly ass = Assembly.Load(((TextAsset)obj).bytes);
? ? ? ? Assembly ass = System.AppDomain.CurrentDomain.Load(((TextAsset)obj).bytes);
? ? ? ? System.Type main = ass.GetType("Main");
? ? ? ? GameObject go = GameObject.Find("Main Camera");
? ? ? ? go.AddComponent(main);
? ? ? ? www.Dispose();
? ? }
實際使用中發(fā)現(xiàn)摊唇,掛載在資源上的腳本,不是從dll上掛上去的涯鲁,加載出來的資源是找不到腳本的巷查,只有從dll直接掛到資源上有序,資源和代碼分離后加載的資源才能找到腳本。
參考 https://blog.csdn.net/gz_huangzl/article/details/52486509
解決的辦法是岛请,要么把所有掛載在資源上的腳本都換成dll直接掛載旭寿,或者把不必要掛載在資源上的腳本分離出來,設計好框架,加載出來的資源都保存對應引用就可以了崇败,沒必要所有腳本都掛到資源上盅称,有些必須要掛在資源上的做成dll放在開發(fā)工程里也沒關(guān)系,比如ui框架的相關(guān)代碼后室,或者在加載資源那里寫邏輯遍歷一遍資源骨骼缩膝,獲取對應的腳本id,查找出來掛上去即可咧擂。