Unity3D研究院之指令碼批量打包渠道包研究

2021-06-22 11:49:21 字數 4312 閱讀 2775

最近在研究unity3d指令碼批量打包,比如在android平台下各種不同解析度和不同記憶體大小的機器,可能還有不同的渠道包,不同渠道可能用的sdk都不一樣,這一切的一切都表明你的**無法做到自適應的,除非批量打包提供各個平台的預定義標籤#define 。unity預設提供了一些預定義標籤如:

unity_editor  : 編輯器模式下。

unity_standalone:pc mac linux模型下。

unity_iphone:ios模式下。

unity_android:android模式下。

還有很多預定義標籤、大家可以在這裡看到:

官方提供的標籤屬於比較大的範圍標籤,比如我希望在unity_android下面在寫一些自定義的標籤、類似 qq uc cmcc這樣的渠道標籤該如何呢?如下圖所示,projectsetting打包介面每個平台都會有scripting define symbols這個選項,可以在這裡新增每個平台下對應的自定義標籤(多個標籤用「;」號隔開),這裡我設定的是android平台,如果ios也需要打這樣的渠道標籤那麼也要在ios頁面scripting define symbols選項處新增對應的標籤。

標籤做出來了就好辦了,然後在**中我們可以這樣來寫。如果在scripting define symbols中沒有出現的標籤預設是不啟用的,就像 #define test 一樣,會自動被注釋掉。

然後我們看看如何實現指令碼批量打包。

using unityengine;

using unityeditor;

using system.collections;

using system.collections.generic;

using system;

using system.io;

public

class myeditorscript

[menuitem ("custom/build android uc")]

static

void performandroiducbuild ()

[menuitem ("custom/build android cmcc")]

static

void performandroidcmccbuild ()

[menuitem ("custom/build android all")]

static

void performandroidallbuild ()

[menuitem ("custom/build iphone qq")]

static

void performiphoneqqbuild ()

[menuitem ("custom/build iphone qq")]

static

void performiphoneucbuild ()

[menuitem ("custom/build iphone cmcc")]

static

void performiphonecmccbuild ()

[menuitem ("custom/build iphone all")]

static

void performiphoneallbuild ()

//這裡封裝了乙個簡單的通用方法。

static

void bulidtarget(string name,string target)

if(target == "ios")

//每次build刪除之前的殘留

if(directory.exists(target_dir))

}else

//***************===這裡是比較重要的東西********************===

switch(name)

//***************===這裡是比較重要的東西********************===

//開始build場景,等待吧~

genericbuild(scenes, target_dir + "/" + target_name, buildtarget,buildoptions.none);

}private

static

string findenablededitorscenes()

return editorscenes.toarray();

} static

void genericbuild(string scenes, string target_dir, buildtarget build_target, buildoptions build_options)}}

這裡面忘說了一點,如果我們希望在效能高的手機上用一套好的資源,在效能低的手機上用一套差一點的資源該怎麼辦?那麼首先我們先搞清楚unity會把什麼資源打包,什麼資源不打包?1.resources資料夾resources資料夾是乙個唯讀的資料夾,通過resources.load()來讀取物件。因為這個資料夾下的所有資源都可以執行時來載入,所以resources資料夾下的所有東西都會被無條件的打到發布包中。建議這個資料夾下只放prefab或者一些object物件,因為prefab會自動過濾掉物件上不需要的資源。舉個例子我把模型檔案還有貼**件都放在了resources資料夾下,但是我有兩張貼圖是沒有在模型上用的,那麼此時這兩張沒用的貼圖也會被打包到發布包中。假如這裡我用prefab,那麼prefab會自動過濾到這兩張不被用的貼圖,這樣發布包就會小一些了。2.streamingassetsstreamingassets資料夾也是乙個唯讀的資料夾,但是它和resources有點區別,resources資料夾下的資源會進行一次壓縮,而且也會加密,不使用點特殊辦法是拿不到原始資源的。但是streamingassets資料夾就不一樣了,它下面的所有資源不會被加密,然後是原封不動的打包到發布包中,這樣很容易就拿到裡面的檔案。所以streamingassets適合放一些二進位制檔案,而resources更適合放一些gameobject和object檔案。streamingassets 只能用過www類來讀取!!

3. 最後凡是在hierarchy檢視物件引用過的資源檔案也會被無條件打包到發布包中。如果有一部分檔案可能沒有在resources資料夾下也沒有在streamingassets資料夾下,也沒有被hierarchy檢視遊戲物件引用,那麼這類資源是不會被打包到發布包中的。

ok!搞清楚這一點就好辦了!在處理不同包對應不同資源包的時候,盡量讓可配置的資源放在resources 或streamingassets資料夾下,執行的時候程式動態的來讀取它們,最後顯示在遊戲中就可以了。 在批量打包前,在project檢視下建立不同包的資源資料夾, 然後指令碼 assetdatabase 動態的將資源拷貝至resources或streamingassets 資料夾中,

[menuitem ("custom/build android qq")]

static

void performandroidqqbuild ()

**中說到還有乙個重要的東西就是playersettings類。因為在build的時候不同平台下可能會有一些platformsettings是不一樣的,所以需要在指令碼裡面動態的設定它,強大的引數列表在這裡: 。 根據情況來批量構建自己的工程吧~

另外,由於ios工程比較特殊,使用這樣的方法我們只能生成出來多個ios的工程檔案,但是這並不是最終發布的版本。如果想一鍵生成.ipa檔案的話。

1.通過命令列來build ios

2.通過shell來自動打包 1生成的xcode工程,最終生成渠道包。

Unity3D研究院之平面小球重力感應詳解(十三)

手機重力感應應該對大多數開發者並不陌生,在新一代智慧型手機android ios wp7 很多遊戲都是使用手機自帶重力感應功能製作的,強大的unity3d 遊戲引擎當然對這個也是完美支援的,今天由momo帶大家學習3d 世界中的手機重力感應。本章我們的目標是實現乙個小球在螢幕中通過搖晃手機重力加速度...

Unity3D研究院之UGUI乙個優化效率小技巧

無意間發現了乙個小技巧。如下圖所示,可以發現ugui的image元件的raycasttarget勾選以後會消耗一些效率,為了節省效率就不要勾選它了,不僅image元件text元件也有這樣的問題。一般ui裡也就是按鈕才需要接收響應事件,那麼大部分image和text是是不需要開raycasttarge...

Unity3d 外掛程式研究之EasyTouch外掛程式

unity3d easytouch 初步使用教程 詳細 unity外掛程式easytouch學習記錄 unity外掛程式 easytouch5教程 unity外掛程式 easytouch的使用 第二 第三 第四 void onenable 此函式是搖桿移動中所要處理的事 void onjoystic...