前置き
子供からの夢で「牧場物語やルーンファクトリーみたいな牧場ゲームを作ってみたい!」と思っていました。
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;
}
}
完成
次回作成するもの(仮)
- キャラに話しかけたときにメッセージを出す