見出し画像

【Unity】3Dローグライクゲームの作り方〜Step4-3〜

前回の記事はこちら
前回は壁のオブジェクトを作成し、Fieldクラスに新しいメソッドを追加するところまでを行いました。

DirUtil.Move関数の実装

先に障害物の判定を含めた移動のメソッドをDirUtilに作りましょう。

/**
* マップのデータ(map)と現在の座標(position)と移動したい方向(d)を渡すと
* (もし移動できるならば)移動先の座標を取得
*/
public static Pos2D Move(Field field, Pos2D position, EDir d)
{
   Pos2D newP = GetNewGrid(position, d);
   if (field.IsCollide(newP.x, newP.z)) return position;
   return newP;
}

障害物があれば現在のグリッド座標、障害物が何もなければ移動先のグリッド座標を取得することができるようになりました。

ユニティちゃんが壁にぶつかるようにする

PlayerMovementのUpdateメソッドを少し書き換えます。

newGrid = DirUtil.GetNewGrid(grid, direction);

上記を削除して、次のコードに置き換えて下さい。

newGrid = DirUtil.Move(GetComponentInParent<Field>(), grid, direction);

テストプレイしてみましょう。以下のようになればOKです。

壁とぶつかるユニティちゃん

マップデータの作成

ローグライクといえば自動生成のマップが基本ですが、いきなり実装してしまうとデバッグ時に厄介なことになりがちです。なのでまずは固定マップの読み込みを実装するところから始めます。
読み込む為にはデータが必要ですね。次に紹介する(と言っても受け売りですが)エディターで作成しましょう。

マップの形は自由です。しかし必ずTile LayerとObject Layerを一つずつ作成し、Object Layerにはプレイヤーの初期位置を設定するためのオブジェクトを「Player」という名前で置いて下さい。
筆者は以下のような感じにしました。

スクリーンショット 2020-04-28 23.00.58

なお、適当なマップチップがないという方は次の画像を使って下さい。

画像3

(オプション)oneTileについて

ところで、現在のグリッド幅、少々大きすぎる気がしませんか?
そう思った方はoneTileの値を変えてあげるといいです。
例えば

private const float oneTile = 0.5f;

にすると、こんな感じになります。これはちょっと幅が狭過ぎますね。

スクリーンショット 2020-04-29 2.57.47

private const float oneTile = 1.0f;

今後はこの値でいこうと思います。

という訳で、少々短いですが、今回はここまでと致します。次回からTiled Map Editorで作成したマップデータを読み込めるようにスクリプトを書いていきたいと思います。

この記事が気に入ったらサポートをしてみませんか?