AssetBundles與腳本
所有Unity的AssetBundle,無論是從本地擷取 還是www,或者打包整個場景。物體上的腳本都不會被編譯。是以AssetBundle打包的時候即使物體上有腳本。導入後其他所有Unity的檔案都不會有問題,唯獨腳本是沒作用的(錯,隻要主程式裡含這個腳本就沒有問題,也就是主程式和AB一起釋出)。那能不能用腳本呢? 答案是,可以!
核心是腳本可以打包進Dll,然後在用戶端用System.Reflection下的Assembly來加載。
步驟:
開發
(1)正常開發
(2)寫一個如txt的文本文檔,說明物體上挂載的腳本
(3)最後釋出前,打包dll,标注dll版本号
(4)打包AssetBundle,标注AssetBundle版本号
用戶端
(1)先下載下傳AssetBundle作為bytes,再儲存到本地
(2)使用AssetBundle.CreateFromMemory加載,再讀取GameObject
(3)下載下傳dll,并根據文檔将 腳本加載到對應的GameObject上
核心代碼:
2.System.Type type = assembly.GetType ("ShowOnGUI"); //根據腳本類名稱ShowOnGUI得到類
3.gameObject.AddComponent(type);//将這個腳本挂在到物體上
注意
System.Reflection的這個做法對端遊和安卓都沒問題。但是違反蘋果的相關規定,iOS可以用LUA。
打包 code -> assembly -> .bytes -> ab
使用 ab -> .bytes -> assembly
部落客說明:AB裡包含的腳本,主程式裡必須有一份,否則下載下傳過來也會在挂腳本的地方出現歎号,而且通過測試,在AB裡加了一個腳本,主程式不更新也沒有用。可能打包時,AB裡隻包含了腳本的名字,一切以主程式裡的
腳本為準。AB打包腳本處理不完美,lua則是為解決這個問題出現的,極像WEB伺服器端的腳本型解釋執行語言,在服務端随時可以修改,立即生效,更新是相當友善。