2D的に影のできる場所をどうやって探すか
妹「ジャンプしてる時とかに、影をどうやって出せばいいかという問題があるんだけど」
「どうやってというと」
妹「空中にいるわけだから、足元じゃ駄目で、その下にある地面がどこか調べないといけない。LineTraceかなと思うんだけど、なんか大げさな気もする」
「なるほど。2Dだからライトも使わないのか。それだったらLineTrace案でいいのでは」
妹「でももっと簡単な方法あったりしない? 例えばファミコンのアクションゲームとかでLineTraceなんか使ってなかったんじゃないかなあと」
「それは使ってないと思うけど、仕組み自体がだいぶ違うからね」
「昔の2Dゲームは地形をブロック単位のデータで持ってて、一番シンプルなのだと床があるかないかだけで区別できる。この場合の影は縦方向の位置は一定だから、横の位置だけ自分に合わせて、あとは下に床がない時に非表示にすればいい」
妹「でこぼこしてる時は?」
「その場合は床の高さを調べるんだけど、キャラの横座標から、対応する配列の数字を調べて、その高さに合わせるとか。斜め見下ろし型みたいになってると、さらに配列を二次元に増やさないと駄目だけど、そもそもファミコンだとそこまで複雑な仕様にはしないかも」
妹「そういうやり方では作ってないね」
「UE4のコリジョンシステムは、昔の配列で管理する考え方より柔軟になってるから、ソレ用にLineTraceというのも必要になってくる。今回のケースで調べるのは真下だけだから、LineTraceよりは単純なしくみでいいんだろうけど」
妹「じゃあLineTraceでいいのか。なんかもったいない気もするけど」
「先に配列を作って、そこからブロックをスポーンさせるという作り方はUE4でも出来るし、その場合は昔ながらの方法で当たり判定とってもいいと思うけど。まあでもLineTraceはよく使う物だから、十分高速化されてると思うよ。たぶん」
表向き用の影と、裏向き用の影と、両方くっつけとく
妹「昨日のやり方だと、影が足より前にきちゃうんだけど」
imoue.hatenablog.com
昨日のやり方
「そっか、ポリゴンの表示順が逆になるのか。反対向くと。このへんは2D用のゲームエンジンじゃないからむずかしい。キャラはSpriteStudioだからいいけど、影も含めると、ジャンプした時に困りそうな」
妹「設定で表示順はいじれそうだけど、それで上手くいくかわからないし、他のとこで問題があった。それで常時Tickで影を奥側にずらそうかと思うんだけど」
「それでもちゃんと動くとは思うけど、表用の影と、裏用の影と、1キャラに2つの影をくっつけておくのでもいいかも」
「最初に1つ、こっちから見える影があるから、それを反対の位置と向きになるように、もう1個影をおく」
妹「それだと2つ見えて変になったりしない?」
「今のところ逆を向いたら全然見えないわけだから、どちらか片方の影しか見えないはず。あ、でもマテリアルは両面じゃなくて片面に戻さないとダメだけど」
「これでちゃんとなってるはずなんだけど、見てもよくわからん」
妹「Tickでやるのとどっちがいいの?」
「速度的には、大量にキャラを出してみるとかしないと差は出ないと思うけど、たぶんポリゴンを増やす方が速そうな気がする。あとは好みの問題」
ポリゴンが両面から見えるようにするマテリアル
妹「敵に影をつけてみたんだけど」
「こういう角度のアクションゲームだとあった方がいいね。空中にいる敵とかは奥行きがわかりにくいし」
妹「うん、それはそうなんだけど、左右反転すると影が見えなくなるんだよ」
「この影どうやって出してるの?」
妹「Planeのポリゴンに、黒くて丸い感じの絵になるマテリアルをくっつけてあるんだけど」
「反対を向かせるとポリゴンが裏になるから見えないのかな。このマテリアルの"両面処理"ってとこにチェックを入れるといいはず」
「これで裏表どっちも見えるようになったから、どちら側を向いた敵にも影が見えるよう」
妹「ちゃんと向きに合わせてポリゴンを回転させた方がよくない?」
「それでもいいんだけど、キャラを回転させて、その状態で影を逆方向に回転させてとやると、作ってて混乱しそうな気がする。この影の場合は2ポリゴンしかないわけだから、両面処理にしても大した負荷はなさそう」