妹でもわかるUnrealEngine4

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

毎日更新? 妹に説明するために書いてるけど、たまにわかってない場合もあるUnrealEngine4を中心としたゲーム制作の話。略すとイモリアル

全体マップの作り方・移動編

「移動させる方法は色々考えられるんだけど、まずは自力でLocationを書き換えて行く方法がある。1度で移動させると瞬間移動だけど、例えば2回に分けて、いったん中間点に移動して、途中にDelayをはさんで、そして目的地に行く。3回4回とさらに分けていけば、だんだん瞬間移動から徒歩に近づいていく」

妹「中間はどうやって調べるのだ?」

「まず目的地から出発地のLocationを引いて、2つの場所の差を求める。普通にVector同士で引き算すれば、出力ピンからX・Y・Zのそれぞれの差が入ったVectorが出てくるから、それを使う」

「その差を、分割する数で割って、いま何歩目かの変数で掛ける。歩数はもちろん歩くごとに増やす」

妹「なんだかわかりにくいような。どっちからどっちを引いてとか、なんか混乱しそう」

「そういう時は事前に簡単な図を作って、計算するといいよ」

f:id:una_unagi:20150725221751p:plain

妹「でもこれまっすぐだよね、細かく分けたとしても。そうすると曲がった道は進めないような」

「そのへんは気にしないか、マリオ3みたいに道が直線しかない場合に使う方法だから。曲がる場合は別の手を考える。例えば……すべる床方式」

妹「すべる床?」

RPGのダンジョンに出てくる、乗ったら止まるまで勝手に進んじゃうやつがあるでしょ。あれと同じ仕組みを作る。タイルベースのゲームでよく使う方法。スーパーマリオワールドは多分これに近い方法を使っている。全体としてはまがりくねった道でも、タイル単位で見ると、直進するか90度曲がるかのどっちか」

妹「その場合全体マップをタイルで作らないと駄目なのか?」

「そんなことはないよ。タイルの方が位置は合わせやすいけど、すべる床もタイル単位じゃなきゃいけないってことはないし。ただ、もともとRPG的な仕組みがあるゲームに追加するのは楽だけど、アクションゲームだと別の移動パターンを作ることになるから、ちょっとむずかしいかもしれない」

妹「むずかしくない方法を教えてくれ」

「昨日の移動地点用ブループリントに、ボタンを押した移動先だけじゃなく、移動ルートを付け足すという方法もある。上上左左上上右……みたいな。向きは整数で表して、整数の配列にすればシンプルにデータ化出来る。ようするに、すべる床を別のやり方でやっているだけなんだけど」

妹「道筋で全部指定するのか、やっぱり難しそう」

「ナビメッシュ機能とか、3D用のアクターを動かす機能を使うのも手だと思う。道以外の場所に障害物コリジョンを設置して」

妹「それはちょっと考えたけど、説明はだいたい3D用だし、使い方もまだよくわかってない。教えてもらえば使えると思うけど」

「うん……よくわからないので教えられない」

妹「駄目だった」

「あとはSpriteStudioを使う方法かな」

妹「こないだ歩かせてたやつ?」

「そう。あの時は足としっぽをバタバタさせただけで、アクターとしてはゲーム中のCharacterMovementを使って動かしてた。どう動かすかはプレイヤーの勝手だから、先に決まってたらおかしいし。でも動き自体はつけられるから、道筋が決まってるのであれば別に問題ない」

f:id:una_unagi:20150725221731p:plain

「背景に全体マップを置いて、道の上を通るようにキャラクターに動きをつける。A地点からB地点なら、0フレーム目から9フレーム目を再生するみたいに決めて、移動はさせずに、ただのアニメーションとして再生する。するとキャラが道にそって動いてるように見える」

妹「でもそれ実際には動いてないわけだよね?」

「アクターは一歩も動いてない。足がバタバタ動くのと同じで、ただもうちょっとダイナミックにアニメーションしてるだけ」

妹「それで大丈夫なの?」

「昨日、今どの地点にいるかのデータをLocationと別にしたのはそういう場合にそなえてのこと。Locationを使わないのであれば、実際にアクターが動いてる必要はなくて、そう見えてればなんでもいい」

妹「色んな方法があるんだな」

「たぶん他にもいろいろ方法はあって、もっと簡単お手軽なのもあるかもしれないけど、思いつく範囲だとこんな感じ」

妹「うーん、このさい瞬間移動でもいいか……」