[情報] 使用 Unity 開發 MOBIUS FF 事例

作者: chowleft (什麼....)   2015-04-20 11:02:36
於前陣子舉辦的 Unite 2015 Tokyo 大會上
SQUARE ENIX 社的 Leader Programer 濱口直樹
向開發者分享了使用 Unity 5 開發手機遊戲
"MOBIUS FINAL FANTASY" 遇到的問題和處理方式
參考資料:
巴哈報導:
http://gnn.gamer.com.tw/2/113632.html
簡報PDF:
http://tinyurl.com/mjvqadl
魯蛇小弟我用 google 翻譯
將相關的內容盡量翻成中文了
雖然裡面有一堆翻譯錯誤
還是希望能分享給各位大大
(可搭配參考上面的參考資料)
//=============================
// 1. 在 Unity 上開發規模較大遊戲時的心得
//=============================
* 開發規模較小和較大的遊戲,有什麼地方是完全不同?
同個檔案會同時被更多人修改到
* 多人同時編輯的範例
以一個攻擊動畫的時間軸為例子
和下個 motion 的 blend motion section
擊中判定 plan
跳躍時的音效 sound section
餘光特效 (trigger) effect section
* Unity 不適合多人同時編輯檔案
沒辦法同時讓多人修改 *.scene 和 *.prefab 檔
* 為了在 Unity 上實現多人編輯所作的事
可以在 Inspector 上建立 Asset 之間的關聯
(每個 section 拆成各自的 prefab,
再用一個 array 存他們的 reference
避免大家一起變成同一份prefab ?)
* 藉由 Hook Server 來更新定義相依關係的 prefab
Motion
Plan > 版本管理 > Hook
Effect 工具 < Server
Sound
有人送交資料上去後,
版本管理工具會讓 Hook Server
更新 attack.prefab
Hook Server 會處理他們之間的依賴關係
並自動送交最新的 attack.prefab 資料
因為 Unity 檔案的參考
以 meta 檔裡面的 guid 作為依據
是故即使不用 UnityEditor,
靠自製工具建構 prefab 資料也不會太難
(在google上打 "hook + svn" 之類的
就會看到相關文章了)
* 在 Hierarchy 上的可讀性較低的問題
結果還是自己寫了 editor tool
除了需以一覽方式確認各人負責的 prefab 內容
也為了大幅改善製作效率
放棄了在 Hierarchy 和 Inspector 上設定內容
而用專門的 Timeline tool 來開發
在 C# 參考設定加入 UnityEditor.dll
然後就可以用 UnityEditor.AssetDatabase
對 Asset 作讀寫的動作了
(這段不太確定XD)
* MOBIUS 的開發環境

* MOBIUS 的資料確認流程
各人負責的 prefab
v
v 送交
v
版本控制工具
v
v 通知 Hook Server
v
Hook Server
v
v 處理依賴關係的 prefab
v 更新後的內容會送交回去
v
版本控制工具
v
v 一定時間後會收集相關資料
v 交由另外的 Server 去編譯 AssetBundle
v
AssetBundle Build Server
v
v 以 console 模式啟動 UnityEditor
v 編譯 MOBIUS 的內容約需 3 小時
v 完畢後就會上傳到
v Game Server 的儲存空間
v
Game Server
v
v 下載資料後,
v 就可以開始遊戲了
v
Android & iOS
//=============================
// 2. 在手機平台上開發高品質遊戲的心得
//=============================
* Unity 慢吞吞的原因
需了解 C# (Mono 2.0) 的特性
分配 heap 記憶體會增加 GC 的頻率
struct -> stack memory
class -> heap memory
注意字串處理
class 和 enum 的 toString() 效能不好
foreach 會在 heap memory 生成 enumerator
增加 GC 的頻率
認真處理向量運算時
效能會很吃緊
在適當的地方考慮用 native code
在 Assets/Plugin 放 dll
就可以簡單呼叫 native code
elif UNITY_ANDROID
[DllImport("libNativePlugin")]
private static extern void updatePhysicsBone(IntPtr data, float delta);
elif UNITY_IPHONE
[DllImport("__Internal")]
private static extern void updatePhysicsBone(IntPtr data, float delta);
endif
兩者之間的資料傳遞用
Marshal.AllocGlobal(size)
用 C# coding 還是比較簡單
考慮使用的時機用不同方案處理
開發效率才會高
(MOBIUS 在 IK 和物理晃動上使用)
* 先了解敵人在哪裡
APP 使用的 Memory 量
iOS: 350 ~ 600 MB
Andriod: 400 ~ 1100 MB
相比 Andriod 高端機種搭載 2 ~ 3 GB 的記憶體
iPhone 高端機只有 1 GB
Andriod 和 iPhone 在記憶體管理上完全不同
Andriod app 以 Java 運作
一般都會預留較多記憶體以防止 GC 發生
不過因為 Unity 是用 Mono 的緣故
所以 iOS 也必須擔心 GC 的問題...?
因為在同等規格下 iOS 比 Andriod 的效能更好
如果 APP 在兩個平台都想推出,
先開發 Andriod 比較不會出問題
* 接下來要考慮 download size
最近在家機平台上FF系列的容量
FFXV 體驗版: 5 GB
LRFF: 10 GB
第一次執行所需的下載資料量
(實際產品可能會不同)
================================
iOS Andriod
================================
Package 70 MB 40 MB
================================
first DL 350 MB 500 MB (低)
(品質可選) 700 MB 1 GB (高)
================================
為了縮減資料量,
使用壓縮版的 AssetBundle
* 貼圖格式會影響資料大小
iOS Andriod
===================
不透明貼圖 RGB PVRTC RGB ETC
透明貼圖 RGBA PVRTC RGBA ETC2
部分 Andriod GPU 不支援 ETC2
考慮到該類 GPU 需載入
含 alpha 通道的貼圖時
也有人直接用 RGBA 16 bit
考慮一張 2048x2048 的貼圖
PVRTC 4bit 2 MB
ETC2 8bit 4 MB
RGBA 16bit 8 MB
RGBA 32bit 16 MB
(有 mipmap 的話再乘 1.33)
可知貼圖格式對容量影響非常大
* 針對不同的 GPU 選擇最適合的貼圖格式
不同 GPU 有各自適合的貼圖格式
(吃不了的好像就變RGBA了)
===============================
PowerVR RGB PVRTC 4bit
RGBA PVRTC 4bit
===============================
Adreno RGB ATC 4bit
RGBA ATC 8bit
===============================
Mali RGB ETC 4bit
RGBA 32bit (size減半)
===============================
Mali RGB ASTC 6x6 (3.6bpp)
(T600後) RGBA ASTC 4x4 (8bpp)
===============================
Tegra DXT1 (4bpp)
DXT5 (8bpp)
===============================
使用正確的貼圖格式可以
減少顯示記憶體的損耗
加快載入速度
較少程度的畫質劣化
判斷使用的機型時:
SystemInfo.deviceModel
UnityEngine.iOS.Device.generation
* 但設計人員只想管理一份資料
管理多份貼圖很麻煩...
想針對每個 GPU 輸出適合的貼圖
又不想管理一堆貼圖資料
* 雖然 Unity 可以指定輸出的貼圖格式...
貼圖設定上只有一個選擇格式的欄位
iOS 可以直接選 PVRTC 沒問題
但 Andriod 沒辦法一次產出各種格式的貼圖
* 藉由 Asset Bundle Build Server 來處理
為了製作適合各種 GPU 的 AssetBundle
準備 10 台以上的 Build Server
每台 Server 分別且持續的
製作對應各種貼圖格式的 AssetBundle
如果在 Unity 裡修改 Texture2D 的 TextureFormat
會導致貼圖的快取資料需要重建
在 Unity 要製作 AssetBundle 之前
先用自己寫的 Script,
將圖片檔案的 meta 檔裡的,
textureFormat 等數值換掉,
再呼叫 Unity 直接編譯 AssetBundle
這樣在 Build Server 這邊
就可以省掉建立快取資料的時間
提升 AssetBundle 的生成速度
* 讓 Shader 在一開始就編譯好
因為目標平台的 GPU 版本不同
沒辦法事先在 AssetBundle
編譯 Shader 資料
應用程式讀到 Shader 資料時
會立刻編譯,但這時會花很多時間
先將會用到的 Shader 集中起來
一開始就載入這個 AssetBundle
之後讓其他 AssetBundle 依賴它
就可以省下每次都要編譯的問題
( 可參考: http://tinyurl.com/mr7l3jb )
//=============================
遊戲影片:
https://youtu.be/0GlVAlyNi0I
作者: dreamnook (亞龍)   2015-04-20 11:44:00
實用!
作者: laikyo (六元)   2015-04-20 13:09:00
受益良多
作者: gn00671975 (PrideShadow)   2015-04-20 13:52:00

Links booklink

Contact Us: admin [ a t ] ucptt.com