読者です 読者をやめる 読者になる 読者になる

GameProgrammar's Night

ゲームプログラム系の覚え書き

UnrealEngine4で2Dゲームを作ろう! その11 見下ろしマップの回り込み処理

 たまには「2Dゲーム作ろう!」らしいネタで、キャラクターとマップ上のオブジェクトとの描画順をどうするのかというお話です。

回り込み

 回り込みという表現はサークルローカルかもしれないので、実例のgifアニメが下の通り。(マチネででっち上げたので歩きアニメになっていのはただの手抜きですw)

回り込み処理 あり 回り込み処理 なし
f:id:katze_7514:20151029181036g:plain f:id:katze_7514:20151029181012g:plain

 像の周りを回った時に、キャラクターの位置に応じて像の前後にグラフィックが表示されるかどうかということです。
 3Dだと奥行き情報をモデルやコリジョンが持っているので特別考える必要はないのですが、2Dだと相変わらず自前で処理する必要があります。とはいえ、内部的には3D処理されていますので、奥行き軸(見下ろしの時はZ軸、サイドビューの時はY軸)の値を変更するだけで対応ができます。

奥行き値の計算

 見下ろしの場合は画面下方にあるほど、画面手前にきますので、Y座標をZ座標にコピーしています。
 
f:id:katze_7514:20151029183957j:plain

 あとで、ある程度調整ができるように基本Z値を指定できるようにしてあります。
 AdjustZ関数のScene引数はSceneComponentのことで、本ゲームではPaperFlipbookComponentを引数に渡しています。移動を行うActorはこの関数を適切なタイミングで呼んでいます。
 回り込みはグラフィックだけで良いのでActor自体のZ値は書き換えません。ActorのZを書き換えてしまうとコリジョンがめんどくさいです。

 この計算だとマップが広いとカメラのZ値を超えてしまうこともあるので、カメラのZ値はかなり大きい値を入れておきます。
 また、マップ上の静的スプライトもこの計算式を念頭に置いたZ値をPaper2Dのコンポーネントに入れておきます。

奥行き計算アルゴリズムとソート軸

 この辺の処理を作っている時に見つけたのですが、奥行き計算をどうするのかという設定が、プロジェクト設定にありました。
 [プロジェクト設定]→[Rendering]→[透過性] です。

f:id:katze_7514:20151104165220j:plain

 見下ろしマップの場合は上図のように設定すると良いと思います。

項目 意味
Translucent Sort Policy 奥行きソートのアルゴリズム。[Sort Along Axis]は指定軸の値に依存する。2Dゲームの場合はこれで十分です
Translucent Sort Axis アルゴリズムを[Sort Along Axis]にした場合のソート軸。見下ろしの場合はZ軸になりますので、(x, y, z)=(0.0, 0.0, -1.0) と値を入れておきます。