---
# System prepended metadata

title: Egret 專案遊戲模組化
tags: [Egret]

---

# 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`