お米 is ライス

C#やらUnityやらを勉強していて、これはメモっといたほうがええやろ、ということを書くつもりです

クオータービューとかの2Dゲームを作るときの描画順について(一般論およびUnityでの方法論)

初めに

この記事を開いたということはすでにお困りなのだと思うが、3次元座標を持つ2Dグラフィックのゲームを作る際、困ることの1つに「描画順」がある。
ここ数日間、うまいこといかなくて悩んでいたのだが、やっと望むような形になったので備忘録も兼ねてここに書いておく。

描画順の決め方

早速本題であるが、描画順の決め方というものをズバッと教えてやろう。

描画順に寄与する要素を列挙する

例えば、

  • そのオブジェクトがどのマス目にいるのか
  • そのオブジェクトの天頂までの高さはいくらか
  • そのオブジェクトがマス目内のどの位置にいるのか
  • そのオブジェクトが何であるか

みたいな感じである。

描画順に寄与する優先度で並び替える

今回の場合は先ほど列挙したとおりの順番であった。

それぞれの要素について、寄与度を数値化する

例えば、高さならば「何mか」など
ここで、優先度が一番高い要素でない場合は、数値の上限はきちんと定めておかなければならない.。
また、寄与度の数値は整数であったほうがよい(ような気がする)。

寄与度の数値を優先度に応じてオーダーを変えながら足し合わせていく

何が言いたいかというと、例えば、

  • 「どのマス目にいるのか」の寄与度が0~99
  • 「高さはいくらか」の寄与度が0~9
  • 「マス目内のどの位置にいるか」の寄与度が0~999
  • 「そのオブジェクトが何であるか」の寄与度が0~9

であった場合、7ケタの数字の特定のケタの部分に特定の寄与度の情報を埋め込んでいくということをする。
具体的に言うと、上から順に寄与度が「81、3、24、5」だったとすると、描画順の最終的な優先度は「8130245」という風にすればよい。

Unityでの実装方法

2Dモードにするやろ?そうするとPositionのZが小さくなるほど手前に表示されるようになる。
だから上の場合、Zに「-8130245」を指定するといい感じになる。値が大きすぎて嫌なんだったら定数で割ってあげればいい。