前置き
子供からの夢で「牧場物語やルーンファクトリーみたいな牧場ゲームを作ってみたい!」と思っていました。
QiitaでUnityを使った2Dゲームはないかと調べたところ、素晴らしい記事を発見しました。
こちらの神記事を参考に2D牧場ゲームを作成していこうと思います。
前回作成したもの
今回作成するもの
- 1.マップの作成
- 2.マップに衝突判定を設定
1.マップの作成
1-1.マップの画像を分割
-
マップの素材はマップチップ - ぴぽや倉庫からお借りしました。時間があったら自分でマップを作成したいと思います。
-
ダウンロードした画像を
Sprite Editorでいい感じに画像を分割します。
1-2.TileMapとTilePalette
-
この2つは、タイルの画像を設定してマップ上にタイルのように敷き詰める機能のことです。
-
右クリック > 2D Object > Tilemap > Rectangularで新しいTilemapが追加できます。
-
次に
Windows > 2D > Tile Paletteを押すと、以下のような画面が表示されます。 -
今は森と洞窟、畑などの画像だけを追加しました。
- 画像の左上のプルダウンを押すと
Create New Paletteという項目があるので、そして新しいパレットを作成します。 -
Nameは分りやすい名前(今回はGround)、GridとCellSizeはデフォルトで大丈夫です。
- 次に先ほど
Sprite Editorで分割したマップの画像をPaletteにドラッグ&ドロップすると、タイルを保存するために、保存先のフォルダを指定する画面がでます。 - とりあえず好きな名前の専用フォルダを作成して選択します。
1-3.TileMapの編集
-
Tilemapから描きたいタイル(画像は芝生)を選択、画像の右上の筆アイコンを選択します。 - (複数の
Tilemapがある場合は、Active Tilemapを切り替えます) -
Scene画面に好きなようにタイルを設置していきましょう。
- 完成形は上のマップになります。芝生と畑を設置しました。
1-4.レイヤの上下関係を設定する
-
以下の順番で、レイヤーの上下関係を設定していきます。(下が一番上になる)
- 歩くマップのあるレイヤー(map_walk_layer)
- 障害物のあるレイヤー(map_collision_layer)
- アイテムの置いてあるレイヤー(map_item_layer)
- キャラクターが歩くレイヤー(map_char_layer)
-
InspectorでTilemap Rendererより、Sorting Layerの▼を押し、Add Sorting Layerを押します。
1-5.歩ける・歩けないTileを分ける
- 先ほど作成した
Tilemapにmap_walkと名前を付けます。 - 新しく
Tilemapを2つ作成し、map_collisionとmap_itemと名前をつけます。
-
map_walkのTimemapには、Sorting Layerをmap_walk_layerと設定しましょう。-
map_collisionにはmap_collision_layer、map_itemにはmap_item_layerと設定しましょう。
-
- 歩けるTilemap
map_walkを除いた、map_collision、map_itemは以下のようになります。
2.マップに衝突判定を設定
- 次は、キャラクターや木に衝突判定を設定していきましょう。
2-1.衝突判定を設定
-
キャラクターには
Box Collider 2D、マップにはTilemap Collider 2Dのコンポーネントを追加していきます。 -
キャラクターの衝突判定を設定していきます。
-
Box Collider 2DのEdit Colliderのボタンを押し、Collider(緑の枠)の大きさを調整しましょう。体の下部ぐらいにしましょう。
2-2.RididBody2Dの設定を変更
- 前回はキャラクターの
Rigidbody2DのBody TypeをKinematicに設定しました。 - しかし、
Kinematicは標準の衝突判定が無効になります。 - ただ
Dynamicにすると、物理演算が有効になり、キャラクターが画面外に落ちてしまいます。 -
Gravity Scaleを0にすることで落ちなくなります。
- もう一つの設定で、
Freeze RotationのZをチェックしておきましょう。 - そうすることで、キャラクターが障害物にぶつかった時に変な挙動をしなくなります(試しにZをチェックしないで動きを確認してみましょう…)
2-3.コードを修正
- 最後は前回のコード
MoveControllerを修正します。 - このコードで、「山や川にぶつかったら移動させない」みたいな動きができるようです。
public class MoveController : MonoBehaviour {
public readonly float SPEED = 0.1f;
private Rigidbody2D rigidBody;
private Vector2 input;
void Start() {
this.rigidBody = GetComponent<Rigidbody2D>();
// 衝突時にobjectを回転させない設定
this.rigidBody.constraints = RigidbodyConstraints2D.FreezeRotation;
}
private void Update() {
// 入力を取得
input = new Vector2(
Input.GetAxis("Horizontal"),
Input.GetAxis("Vertical"));
}
private void FixedUpdate() {
if (input == Vector2.zero) {
return;
}
// 既存のポジションに対して、移動量(vector)を加算する
rigidBody.position += input * SPEED;
}
}
完成
次回作成するもの(仮)
- キャラに話しかけたときにメッセージを出す













