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

妹でもわかるUnrealEngine4

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

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

レトロゲームプロジェクトの研究④Sokoban編

f:id:una_unagi:20160315211155p:plain

「今日調べるのは、倉庫番っぽいゲームプロジェクトのSokoban」


内容

タイルベースのフィールド上に置かれた箱を、全て目的地に移動させることを目的にしたパズルゲーム
上下左右のカーソルキーで移動。
箱を押すことは出来ても引っ張ることは出来ない。
箱の色と、置く場所のマークの色は同じでなければいけない。

レベル構成

Mainmenu

開始画面・マップ選択画面。
全てウィジェットのみで進行。

Level1~4

難易度ごとのマップ
TileMapで壁と床と背景を表現する。
自機用のCharacterPawn_BPを配置。
箱はCrate_BP、目的地にはStrongePoint_BPを配置。

ブループリント

GameCamera_BP

カメラの他に、マップ上のポイント数と、ゲームインスタンス(GameInstance_BP)の初期化呼び出しも行っている。

Creat_BP

箱(荷物)のスプライト。
押せる状態かどうかの判定。
色設定と、同じ色の目的地と重なっているかどうかで画像を切り替える。

StoragePoint_BP

箱と重なった場合に同じ色か判定して、一致している目的地の数を更新。

GameInstance_BP

ゲームをクリアした状態かどうかの判定を行う。
クリアした状態と判断した時はウィジェットを表示。

CharacterPawn_BP

移動処理・移動先に箱がある場合は押す処理。
1手前の状態に戻すやり直し処理。
(毎回移動する前に現在位置を保存して、やり直しボタンを押すとその地点に戻る)
(箱を押す場合は押す前の箱の場所も記憶)
方向ごとのアニメーションを切り替える。


「これも有名なゲームで、色んなところで使われているゲームルール」

妹「押すのは物理とかでやったら駄目なんだよね?」

「それでもいいけど、ピッタリ動かすのは無理だから、それでもクリア出来るようなマップ構造にする必要がある。このプロジェクトではTileMapを使っていて、1マスが100cmという設定になっている」

妹「じゃあもし100の倍数じゃなくて、微妙にズレてたら……」

「なんだか変な感じになる。キャラクターや箱もピッタリ同じ大きさで、Locationも縦と横が100の倍数になるようになってる。ルールの改造は難しいけど、ルール通りのマップを作るのはわりと簡単に出来る。TileMapを編集して、箱や目的地のアクターをコピーしていくだけでOK」

妹「箱があるのとかは?」

「LineTraceで調べてる。このゲームもAIとかはないから、コリジョンの判定が一番むずかしい。箱を押せるのかどうかというところ。タイルべースのゲームだから、コリジョンを無視してLocationの位置関係だけで調べても良さそうな気がする。自分とLocationが100違うやつは隣にあるってことだから。コンストラクションの段階で100の倍数に揃える処理も入れておけばズレもなくせる」