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上
核心代碼:
1.assembly=Assembly.Load (m_WWW.bytes);//從服務器上讀取dll,作為assembly。中間可以加bytes的本地保存
2.System.Type type = assembly.GetType ("ShowOnGUI"); //根據腳本類名稱ShowOnGUI得到類
3.gameObject.AddComponent(type);//將這個腳本掛在到物體上
注意
System.Reflection的這個做法對端游和安卓都沒問題。但是違反蘋果的相關規定,iOS可以用LUA。
打包 code -> assembly -> .bytes -> ab
使用 ab -> .bytes -> assembly
源自:http://www.siluyouxi.com/game/code/u3d/1494.html
博主說明:AB里包含的腳本,主程序里必須有一份,否則下載過來也會在掛腳本的地方出現嘆號,而且通過測試,在AB里加了一個腳本,主程序不更新也沒有用。可能打包時,AB里只包含了腳本的名字,一切以主程序里的
腳本為准。AB打包腳本處理不完美,lua則是為解決這個問題出現的,極像WEB服務器端的腳本型解釋執行語言,在服務端隨時可以修改,立即生效,更新是相當方便。