妹でもわかるUnrealEngine4

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

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

全体マップの作り方

妹「アクションとかするレベルと別に、全体マップみたいなレベルが欲しいんだけど、どうやって作ったらいいのか全然わからん」

「色々方法はあるけど……例えばゲーム用のレベルをそのまま全体マップにするとか」

妹「どういうこと?」

RPGツクールの場合だと、4方向に歩ける"全体マップみたいなダンジョン"を作って、そこに街とかダンジョンとかの絵を置いて、そこに乗ったり、乗った状態でボタンを押すと中に入れるようにする方法がある。フィールドマップと同じような原理だけど、歩いて冒険する物じゃないから、一画面に収まるようなので、絵も縮小した感じにすることがおおい」

妹「でもこれRPGツクールじゃないですぞ?」

「横スクロールでも似たような事は出来るよ。レベル中に山や谷を置いて、ワープポイントを作って、そこに重なったらそれぞれのステージに進める感じ」

妹「うーん、そういうのも出来るのかもしれないけど、もっとこうスーパーマリオワールドみたいな感じのがいいんだけど」

「そうするとこういう感じのやつ?」

f:id:una_unagi:20150724220006p:plain

妹「そうそう、そういう感じの画面で、キャラクターがぐいーっと動いていくやつ」

「マウスが前提ならクリックに反応させるけど……」

妹「マウスじゃないのが前提で」

「そうすると、4方向のどのボタンを押すとどの場所に移動するかというデータを準備して、押したらそこに移動させればいいんじじゃないかな」

妹「どういう風に準備したらいいかわからん……」

「まずは各ステージ用のブループリントを作る。とりあえず移動地点という名前にするけど、これはスプライトとして作る。マリオワールドなら黄色や赤の丸として作るところだけど、絵が不要ならゲーム中は非表示にしてもいい。編集中に場所がわかればいいから。全体マップに重ねる感じでステージを配置する。仮におむすびの絵にしてある」

f:id:una_unagi:20150724224255p:plain

「ステージ番号と、4方向それぞれの移動先が必要で、これは変数として作って、エディタから設定できるようにしておくのがいい。移動先の変数はオブジェクトリファレンスの中の移動地点……つまり今作ってるブループリントと同じ種類にする」

f:id:una_unagi:20150724225056p:plain

「もう1つ今どの拠点に居るか?というデータも必要。これもオブジェクトリファレンスで移動地点を保存すればいいんだけど、他のレベルと行ったり来たりしたり、セーブやロードをした時に上手く動かないかもしれないから、ステージ番号で記録した方がいいと思う」

妹「どこに居るかは変数作らなくても、キャラクターのスプライトの場所を見ればわかるのでは?」

「あとで移動処理を作る時に、どの地点からどの地点まで動かすというのが必要なるんだけど、Locationから逆算してステージ番号や移動地点のインスタンスを探すのは難しいから、数字で保存しておく方が後で探しやすいと思う」

妹「そうすると今度は数字からインスタンス探すのが難しそうなんだけど」

「Foreachで移動地点のインスタンスの中から、記録してる番号とステージ番号と一致するのを探せばいいだけだよ」

妹「ステージ番号って1-1とか1-2とか?」

「ゲーム中の表記はそれでいいけど、その場合変数としては文字列型になるから、11とか12とかの数字の方が使い勝手はいいと思う。とりあえずはそれぞれのステージが区別出来ればいいんだけど」

妹「移動先が無い時は?」

「動かさない。他のゲームでも細かい仕組みはともかく、だいたいこんな感じで作ってるはずだよ。タイルマップみたいに上下左右につながってないから、どこを押したらどこにつながるか、個別に設定しておく。そして決定ボタンを押すと、今居る地点のステージ番号で、次にどのレベルを読み込むのか分岐させる」

妹「斜め移動は?」

「斜め方向を1発で押すのはまず無理だから、結局上下左右のどれかが先に反応しちゃうことが多い。1回押すと次の場所までノンストップで行っちゃうタイプには斜めは向かない。それで困るような全体マップはマップの方を微調整する」

妹「どこに移動するか決める方法はわかったけど、どうやってそこに移動するの?」

「移動先のLocationに合わせて瞬間移動でもいいと思うけど、明日は歩いて移動してる感を出す方法を考えてみる」