【Unity】2Dタイルマップ④ 衝突判定 Tilemap Collider 2D
Unity 2020.2.1f1 Personal(2021年3月)
前回の続きです!
今回は2Dタイルマップの壁に衝突判定を入れてキャラクターが壁で止まるようにしていきます。
衝突判定はTilemap Collider 2Dコンポーネントで実装します。
キャラクターを移動させる
まずはキャラクターが移動するScriptを作成しましょう。
PlayerControllerとPlayerの2つのScriptを作成していきます。
まずはPlayerから。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class Player : MonoBehaviour { public void MoveUp() { transform.position = new Vector3(transform.position.x, transform.position.y + 0.05f); } public void MoveDown() { transform.position = new Vector3(transform.position.x, transform.position.y - 0.05f); } public void MoveLeft() { transform.position = new Vector3(transform.position.x - 0.05f, transform.position.y); } public void MoveRight() { transform.position = new Vector3(transform.position.x + 0.05f, transform.position.y); } }
Player.cs
上下左右に移動するMoveメソッドを書きました。
Playerを前回作成したSlimeオブジェクトに実装します。
続いてPlayerのMoveメソッドを呼び出すPlayerControllerを作成していきます。
Playerの移動をカメラが追う機能もついでに入れていきます。
using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerController : MonoBehaviour { [SerializeField] Player _player; [SerializeField] Transform _camera; void Update() { if (Input.GetKey(KeyCode.A)) _player.MoveLeft(); if (Input.GetKey(KeyCode.W)) _player.MoveUp(); if (Input.GetKey(KeyCode.D)) _player.MoveRight(); if (Input.GetKey(KeyCode.S)) _player.MoveDown(); } private void LateUpdate() { if (_camera.position.x != _player.transform.position.x || _camera.position.x != _player.transform.position.y) { _camera.position = new Vector3(_player.transform.position.x, _player.transform.position.y, -10f); } } }
PlayerController.cs
UpdateメソッドでAWSDボタンを押すとPlayerのMoveメソッドが実行されます。
LateUpdateではカメラとプレイヤーの位置がズレたらカメラの位置が調整されます。
作成が完了したらHierarchyにてControllerという名前のオブジェクトを新規作成しPlayerControllerを付けます。
PlayerControllerのInspectorに表示されるPlayerにSlimeを、CameraにMain Cameraをドラッグ&ドロップして設定します。
AWSDキーでプレイヤーを動かせるようになりました。
最後にSlimeオブジェクトに衝突判定を付けます。
まずはCircleCollider2Dコンポーネントを設定します。
通路を通れるようにRadiusを0.4に変更します。
次にRigidBody2Dコンポーネントを設定します。
重力を受けないようにGravity Scaleを0に変更します。
Wall(壁)タイルマップを作成する
続いてタイルマップです。
見えづらいので前回作成したCeilingとSecretCeilingのタイルマップは非アクティブにし、
CeilingとSecretCeilingのチェックを外し非アクティブ化
Hierarchyにて2D Object > TIlemap > Rectangularから新たにWallという名前のTIlemapを作成します。
続いてWallのInspector最下部のAdd Componentから Tilemap Collider 2Dを実装します。
AddComponentからTilemap Collider 2Dを探す
Tilemap Collider 2Dを実装
今回はTilemap Collider 2Dはデフォルト設定のままで問題ありません。
Wall(壁)を配置する
それではWall(壁)を配置していきます。
Wallにはこちらの画像をご使用ください。
wall.png
Pixel per Unitを64、Filter ModeをPoint(no filter)に設定し、
前回使用したTile Paletteに配置します。
また、Active TilemapをWallに変更します。
続いてWallを配置していきます。
Fieldに沿ってWallを配置
WallのTileの周りに見える緑色の線がColliderです。
それでは実際にプレイヤーを動かしてWallで止まるかを確認してみましょう。
** 結果
キャラクターは無事進み壁にぶつかると止まりました。
2DTilemapのColliderはTilemap Collider 2Dを付けると覚えておけばOKです。
今回は以上です。
ありがとうございました〜。