# Egret 專案遊戲模組化 ### 目標: 將遊戲相依檔案全部放置於主專案egret結構外部 遭遇問題: :::danger 1. egret的skin只會打包resource底下的exml檔案 2. 若tsconfig有設定src以外要include的資料夾, src的ts檔在manifest內路徑會錯誤 ::: 解決方法: :::success 1. 撰寫plugin(ExmlExtension)直接hack ExmlPlugin的參數,讓遊戲的skin也可以打包進去 2. 將src資料夾內容搬移至components,manifest內路徑即會正常(~~希望有更好解法~~) ::: --- 最終**主專案**結構如下圖: ![](https://i.imgur.com/nhlwYPk.png) components: 主要基底類和共用的scripts(原src資料夾) Games: 遊戲資料夾 src: 留空(為了egret build可以執行) resource: 共用的資源檔 --- Games底下的遊戲資料夾結構如下圖: ![](https://i.imgur.com/9d62WlI.png) resource: 放egret的資源檔案 assets: 圖檔、json等資源 skin: exml檔案 sounds: 音效檔 src: 程式碼檔案 **xxx.res.json**: 結構同**default.res.json**,只放該遊戲使用到的資源 (PS. 若和default.res.json內的key相同,會把對應url路徑覆蓋掉) **lang.json**: 該遊戲使用到的多國(同樣避免key相同) **music.json**: 該遊戲使用到的音效表(同樣避免key相同),**game**欄位要設定遊戲資料夾名稱 ![](https://i.imgur.com/qMPJlIz.png) 以上3個檔案皆為透過路徑讀取,若有更改檔名,可覆寫掉參數 ![](https://i.imgur.com/mkzRPAi.png) 遊戲Scene檔須覆寫設定如下: ![](https://i.imgur.com/HYoDgbO.png) **gameName**為遊戲資料夾名稱 **resList**為該scene用到的resource group名稱(原本的resourceList) PS. 若有設定gameName,轉場前會讀取這3個json檔後才轉場 如果不需要讀取json,直接把檔名改為空字串即可 --- ### Egret UI Editor 要編輯遊戲的skin檔案,要另外將該遊戲設定檔(res.json)和skin檔路徑加入。 如下圖: ![](https://i.imgur.com/7m8ver0.png) --- 新增xxx.res.json之後,要修改 **wingProperties.json** 對應遊戲的relativePath 到正確的resource路徑,如下圖 (將影響到素材的相對路徑) ![](https://i.imgur.com/mzfNzMK.png) :::info xxx.res.json檔名不能重複,在editor上重複的會無法正常顯示 ::: --- ### 相依資源設定 如果場景有需要讀取遊戲外部資料夾的res.json的狀況,可以設定 ``` public dependFolder:string = "BullBull"; protected dependConfig:string[] = ["bullbull.res.json"]; ``` :::success 使用情境範例: 假設想要用外部資料夾BullBull的resource,可以如下圖設置檔案 然後code照上述設定即可使用。 ![](https://i.imgur.com/B96t30Y.png) PS. **目前外部資料夾仍需放在Games底下** ::: :::success 外部資源的結構同其他遊戲 ![](https://i.imgur.com/2OpzZCX.png) ::: --- ### 複數Config設定 如果場景有需要複數res.json的狀況,可以設定 ``` protected resList: string[] = ["aduqiu_hall" , "qiuqiu_hall"]; protected resConfig: string[] = ["aduqiu.res.json", "qiuqiu.res.json"]; ``` :::success 使用情境範例: 假設AduQiu和QiuQiu想要共用一份resource,這份resource放在qiuqiu資料夾 可以如下圖設置檔案,然後code照上述設定即可使用 ![](https://i.imgur.com/Qkd4SRY.png) PS. **需注意qiuqiu.res.json是設定qiuqiu資料夾內的資源** ::: --- ### 將遊戲放入主專案 1. 將遊戲資料夾放入主專案**Games**資料夾內(透過git submodule) 2. 設定大廳skin的遊戲入口按鈕 3. GameType設定遊戲名稱與ID 4. RoomManager設定遊戲使用的class檔,如下圖 ![](https://i.imgur.com/iXu0EA5.png) ###### tags: `Egret`