[情报] 使用 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