2D描画まわりの設計

初期のUnity3dを批判するようで恐縮だが2D描画はゲームエンジンに必須の機能である。*1

2Dのゲームを作る上で必要なのは自明だし、3Dのゲームでも各種ゲージやスコア表示、メニュー、タイトルロゴなどで2D表示は必要となる。
…まあ、"sumotori-dreams" のように頑張ってその辺を全部3Dで作ってしまったゲームもあるにはあるにせよ、「特定のゲームでそのようにしている」ということは、「ゲームエンジンに不要である」という結論に結びつくものではない。むしろ「そこまで3Dで作る必要のないゲーム」や「そこは2Dにしておかないと見辛いゲーム」のほうが殆どであるわけで、やはり「必要だ」と言わざるを得ない。


3D描画が作れるならば、2D描画は座標系の取り扱いに関する限り非常に簡単だ。3Dで4x4正方行列だったものが3x3正方行列になる。クォータニオンは不要となり普通に回転角を[rad]で与えてやれば良い。カメラの概念を考える必要は特になく、projection matrix が扱いやすい座標系をレンダリングしてくれれば問題ない。

むしろ2D描画でめんどくさいのは表示プライオリティとテクスチャ管理のほうで、同じテクスチャアトラスを使用するオブジェクトはもちろん連続して描画するのが吉だが、異なるテクスチャアトラスを使用するオブジェクトがプライオリティ的に間に挟まったりするケースについてはUnityのNGUIなどでも苦労しているようだ。3DではZバッファの存在にものを言わせて多少前後しても問題ない表示結果が得られるケースが大半だが、3D表示もある中で2DでもZバッファを使うと3D表示と混在してしまうし、そのためだけにZバッファをクリアするような重そうな処理はできれば避けたい。そもそも描画順で解決できるものにわざわざZバッファを持ち出すのも知性の敗北を感じてしまう。

あとは同じテクスチャアトラスを用いるオブジェクトであれば、可能な限りまとめて描画してしまいたい。GPUの都合を考えつつCPU側上層で扱いやすいデータ構造を考えねばならないのは3Dも2Dも同じだ。

さて、どうしたもんかな…

*1:そもそも不要であるならばNGUIのようなassetは出てこなかったはずだ。最近はUnity本体も対応を進めているようだが。