Unity(C#)初心者・入門者向けチュートリアル ひよこのたまご

AndroidやiOS向けアプリを簡単に作れるゲーム開発環境Unity(ユニティ)の使い方を、チュートリアル方式で一緒に学びましょう!

【Unity】2Dタイルマップ④ 衝突判定 Tilemap Collider 2D

f:id:hiyotama:20210313223221p:plain
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オブジェクトに実装します。

f:id:hiyotama:20210313214015p:plain

続いて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をドラッグ&ドロップして設定します。

f:id:hiyotama:20210313215515p:plain

AWSDキーでプレイヤーを動かせるようになりました。

最後にSlimeオブジェクトに衝突判定を付けます。
まずはCircleCollider2Dコンポーネントを設定します。
通路を通れるようにRadiusを0.4に変更します。

f:id:hiyotama:20210313224254p:plain

次にRigidBody2Dコンポーネントを設定します。
重力を受けないようにGravity Scaleを0に変更します。

f:id:hiyotama:20210313224548p:plain

Wall(壁)タイルマップを作成する

続いてタイルマップです。
見えづらいので前回作成したCeilingとSecretCeilingのタイルマップは非アクティブにし、

f:id:hiyotama:20210313220116p:plain
CeilingとSecretCeilingのチェックを外し非アクティブ化

Hierarchyにて2D Object > TIlemap > Rectangularから新たにWallという名前のTIlemapを作成します。

f:id:hiyotama:20210313220357p:plain

続いてWallのInspector最下部のAdd Componentから Tilemap Collider 2Dを実装します。

f:id:hiyotama:20210313220645p:plain
AddComponentからTilemap Collider 2Dを探す

f:id:hiyotama:20210313220833p:plain
Tilemap Collider 2Dを実装

今回はTilemap Collider 2Dはデフォルト設定のままで問題ありません。

Wall(壁)を配置する

それではWall(壁)を配置していきます。
Wallにはこちらの画像をご使用ください。

f:id:hiyotama:20210313221133p:plain
wall.png

Pixel per Unitを64、Filter ModeをPoint(no filter)に設定し、
前回使用したTile Paletteに配置します。
また、Active TilemapをWallに変更します。

f:id:hiyotama:20210313221542p:plain

続いてWallを配置していきます。

f:id:hiyotama:20210313221705p:plain
Fieldに沿ってWallを配置

WallのTileの周りに見える緑色の線がColliderです。
それでは実際にプレイヤーを動かしてWallで止まるかを確認してみましょう。

** 結果

f:id:hiyotama:20210313223221p:plain

キャラクターは無事進み壁にぶつかると止まりました。
2DTilemapのColliderはTilemap Collider 2Dを付けると覚えておけばOKです。

今回は以上です。
ありがとうございました〜。