本期教程,我們要學習如何將外部資源加載到遊戲中,比如圖片、模型或UGY文件等。我們將使用Unity引擎,我已經安裝了2020.3.0F1C1版本的Unity。
首先,我們需要創建一個新項目。我選擇了2D模板,因為我們的遊戲是2D的。不同的模板可能會有一些預設不同,但對遊戲影響不大。創建項目可能需要一些時間,我們可以進行其他操作。
接下來,我們需要添加一些引用。在Unity中,我們使用Asset Bundle模塊來加載AB包。如果只需要加載圖片,其實可以不使用AB包,直接加載圖片並生成Sprite。但對於模型等資源,最好還是使用AB包。
創建項目可能會有點慢,在等待時,我們可以進行其他操作。我們先製作一個簡單的UI界面,比如一個畫布和一些控件,如文本和按鈕。Unity提供了很多UI控件,我們可以根據需要選擇。
現在,我們已經創建了一個空項目。我們先製作一個簡單的UI,比如一個畫布。然後,我們可以添加一些控件,比如文本和圖片按鈕。在這裡,我們可以使用TextMeshPro組件,它提供了更好的文本顯示效果。
這個TextMeshPro可以實現一些比較漂亮的效果,但一般情況下都是很需要的。它提供了單選按鈕、選項滑動條、下拉選單、輸入框等控件。我們可以創建一個自定義UI,比如叫做"Mod窗口",使用TextMeshPro作為背景框,並將其錨點設置在中下方,文字居中顯示。
這裡我做了一些簡單的演示,比如創建了一個按鈕,大小為8×1,以便清晰顯示。我展示了一個按鈕和一個滑動條,還更改了它們的名稱。然後我創建了一個文本框來顯示滑動條的數值,初始值設為零。
現在我們想將這個UI放到遊戲中,首先我們需要將它製作成一個預製體。然後在Assets包中新建一個文件夾,比如"Hello Mod",注意文件夾名只能使用小寫英文字符。
接下來,我們需要創建一個腳本來進行打包操作。在腳本中使用Unity Editor的命名空間,並創建一個按鈕來調用打包操作。然後我們就可以在Unity界面上看到一個名為"TOOS打包"的按鈕了。
現在我們按下這個打包按鈕,就會調用這個方法,我們可以在其中編寫打包操作。首先,我們定義一個變量來表示我們要放置ab包的文件夾,比如我要將其放在名為"ab"的文件夾中。然後,我們檢查該文件夾是否存在,如果不存在,則創建它。
接下來,我們使用BuildPipeline中的AssetBundleManifest模塊,選擇我們之前寫的文件夾作為輸出目錄,並設置打包選項。打包選項包括壓縮方式等,你可以根據需要進行設置。然後,選擇輸出的平臺,根據遊戲需要選擇適當的平臺,比如Windows64位。
如果出現編譯錯誤,可能是因為我們的腳本是一個編輯器腳本,所以我們需要將其放在Editor文件夾下。重新運行一下操作,然後在項目文件夾中查看是否生成了ab文件夾,裡面包含了我們打包好的文件。
接下來,我們要加載這個文件。文件的加載方式有多種,比如使用IO命名空間的文件加載方法。但是,我們更傾向於將這個ab包與我們的DLL一起發佈,而不是作為單獨的兩個文件。但如果你的mod和資源是分開的,你也可以使用文件加載方式。你可以複製ab包到遊戲目錄,並使用路徑來加載資源。
最後,我們可以通過實例化預製體來加載UI。我們將預製體的名字設置為"HelloModCanvas",然後將其實例化出來。現在我們啟動遊戲,按下快捷鍵,就可以看到我們的UI已經加載出來了。
現在我們已經有了這個UI,但它上面還沒有任何方法。我想說的是,最好不要在Unity裡面寫這些方法,最好是在mod裡面寫好之後,在加載出來後進行方法的綁定。
為什麼呢?因為如果你在Unity裡面寫這些方法,你還需要單獨生成一個DLL,然後將其與mod一起發佈。這樣就會變成兩個問題。其實這樣並不太方便,因為一般情況下最好的做法是mod只有一個DLL,文件太多會讓玩家感到困擾,可能會造成混淆。
我來舉個例子,比如我們想要在按鈕點擊事件上輸出一個"Hello world"。我會單獨寫一個方法來實現。現在我們取消UI的KMS,獲取到我們想要的按鈕。我們可以像這樣找到相應的按鈕,然後獲取它的transform屬性。
接下來,我們給按鈕綁定一個方法,當點擊按鈕時輸出"Hello world"。我們可以使用Lambda表達式,當然,如果你不瞭解Lambda表達式,你可以去學習一下。當然,除了Lambda表達式之外,你也可以不用命名函數,直接傳入一個函數也可以。
但是,我更推薦使用上面的方式,因為這樣方便你查錯。然後我們再來綁定一下滑動條。同樣的方式,找到滑動條,然後給它綁定一個方法,當值改變時輸出一個參數,然後讓後面的數字跟著滑動條的值改變。最後,我們再綁定一下觸發器,讓它在點擊時顯示隱藏滑動條。這樣我們就完成了綁定。
當然,實際上,一個一個獲取控件是有點麻煩的,但是如果你要處理的控件很多,你可以自己寫一些前置的方法來簡化它。這個部分就需要你們自己去擴展這個想法了。我這裡演示的是最基本的操作。
遊戲重啟一下,然後開發一下,關鍵出來了。點擊按鈕後,可以看到"Hello Word1"的輸出,這樣UI的加載基本完成了。
現在讓我說一下其他的加載方式。因為我們現在是從文件加載的,但是很多時候我們不希望UI分開發布,我們希望玩家只拿到一個DLL。那怎麼辦呢?我們可以將UI文件直接拖動到我們的mod項目裡面,然後選擇嵌入的資源,將其視為一個嵌入的資源。然後我們就不使用文件加載,而是使用流加載。這種加載方式比較常用,其他加載方式你們可以自行查閱。
另外,關於圖片的加載,如果你只是加載一張圖片,沒有必要打包這麼麻煩。你可以直接在Unity裡面創建一個Texture2D,然後讓它加載數據,最後生成一個Sprite來顯示。當然,如果你不想用這種方式,也可以直接將圖片拖拽進來,然後打包,就可以直接使用了。
最後,如果你已經打包了圖片,要加載這張圖,只需要在代碼中指定文件名即可。這裡需要注意的是,文件名不需要後綴名,Unity會自己尋找。本期教程到這也說得差不多了。