歡迎加入Unity業内qq交流群:956187480
qq掃描二維碼加群
原工程源碼下載下傳:https://download.csdn.net/download/qq_37310110/11143484
ios不支援反射更新,故此方案隻适用安卓,PC端設定模式 : 1.更新模式 2.不更新模式
本架構為銜接架構并非遊戲架構,接入後需要擴充到自己的遊戲架構裡
一.Main類編寫
入口函數,在更新模式下負責加載打成ab包後的Dll檔案,并調用DllManager的初始化函數
參考反射 方法調用:https://blog.csdn.net/qq_37310110/article/details/89515198
public class Main : MonoBehaviour
{
public bool isUpdate = false;
Assembly assembly;
void Start()
{
if (isUpdate)
{
//更新啟動
Debug.Log("更新啟動");
StartCoroutine(LoadDll());
}
else
{
//正常啟動
Debug.Log("正常啟動");
gameObject.AddComponent<DllManager>().InitAssembly(isUpdate,null);
}
}
IEnumerator LoadDll()
{
string path = Application.streamingAssetsPath + "/mydll";
WWW www = new WWW(path);
yield return www;
AssetBundle bundle = www.assetBundle;
TextAsset asset = bundle.LoadAsset("MyDLL", typeof(TextAsset)) as TextAsset;
assembly = Assembly.Load(asset.bytes);
Type type = assembly.GetType("DllManager");
var com = gameObject.AddComponent(type);
MethodInfo methodInfo = type.GetMethod("InitAssembly");
methodInfo.Invoke(com, new object[] { isUpdate, assembly });
}
}
二:Unity編寫
剛開始所有腳本都放在unity本地,模式設定為非更新模式,所有的元件添加都為動态添加。
這樣做我們可以在開發階段本地測試,測試沒問題再制作Dll檔案。
public class DllManager : MonoBehaviour
{
public static DllManager Instance;
public Assembly assembly;
public bool isUpdate;
void Awake()
{
Instance = this;
}
//初始化反射資源
public void InitAssembly(bool isUpdate, Assembly assembly)
{
this.assembly = assembly;
this.isUpdate = isUpdate;
LoadMainView();
}
//加載主界面
private void LoadMainView()
{
var mainView = Instantiate(Resources.Load("Panel")) as GameObject;
mainView.transform.SetParent(GameObject.Find("Canvas").transform);
mainView.transform.localPosition = Vector3.zero;
AddCompotent(mainView, "MainUI");
}
//動态加載腳本
public Component AddCompotent(GameObject entity, string compotentName)
{
if (isUpdate)
{
//反射加載
return entity.AddComponent(assembly.GetType(compotentName));
}
else
{
//正常加載
return entity.AddComponent(Type.GetType(compotentName));
}
}
}
三:Dll檔案制作
用VicrosoftStudio制作Dll
1.建立類庫項目
2. 右鍵解決方案進入屬性界面
普及.net framework版本差別 https://blog.csdn.net/qq_37310110/article/details/89514260
3.引入Unity的dll,右鍵引用,添加引用
在Unity的安裝路徑下找到UnityEngine.dll和UnityEngine.dll添加
4.把unityceshi測試好的腳本檔案拖到vs内
設定目前解決方案為啟動項,生成Dll後,把dll字尾改成bytes,為什麼要改後面說明,改好後拖到Unity,到此dll制作完成
四: 給dll檔案打AB包
打包操作網上各種版本各種方法都有,後面可能會把我之前封裝好的打包方案記錄給 大家看,目前簡單打包即可。
Editor編寫打包腳本
[MenuItem("打AB包/Build Windows Resource", false, 13)]
public static void BuildWindowsResource() {
BuildAssetResource(BuildTarget.StandaloneWindows, true);
}
public static void BuildAssetResource(BuildTarget target, bool isWin) {
string dataPath = "c:/DLLTest/";
if (Directory.Exists(dataPath)) {
Directory.Delete(dataPath, true);
}
if (!Directory.Exists(Application.streamingAssetsPath)) Directory.CreateDirectory(Application.streamingAssetsPath);
BuildPipeline.BuildAssetBundles(Application.streamingAssetsPath, BuildAssetBundleOptions.None, target);
}
給dll檔案設定ab标簽:Dll檔案直接打包會失敗無效,改字尾名bytes即可
打包:
結束。
五:運作測試
更新模式跟非更新模式 運作結果正常一樣,說明沒問題;接下來改一下腳本邏輯做一下更新
:
替換MainUI腳本重新生成dll,替換舊的dll
更新後運作結果
https://download.csdn.net/download/qq_37310110/11143484
版權聲明:歡迎加入qq交流群:956187480 https://blog.csdn.net/qq_37310110/article/details/83145193
歡迎加入Unity業内qq交流群:956187480
qq掃描二維碼加群