UnityでTile Mapを使ったケースでの安定した接地判定を行うためのチュートリアル

プレイヤーがタイルマップの地面を歩く際、特に上り坂や斜面でバタつきが発生しないように、RaycastOverlapCircleを使って安定した接地判定を行います。


実行結果

ジャンプするとコンソールに空中であるログが表示されます

チュートリアル

ステップ1: 新規プロジェクトの準備

  1. Unityを開く:
    • 新しい2Dプロジェクトを作成するか、既存のプロジェクトを使用してください。
  2. タイルマップの設定:
    • Tilemapを作成し、タイルを使用して地面を描画します。
    • TilemapオブジェクトにTilemap Collider 2Dを追加し、必要に応じてComposite Collider 2Dも追加します(パフォーマンス向上のため)。

ステップ2: プレイヤーオブジェクトの作成

  1. プレイヤーオブジェクトを作成:
    • 2Dスプライト(例: 四角形や円)を用意し、「Player」という名前のオブジェクトを作成します。
    • キャラクタスプライトが用意できている場合はそれを使います
  2. コンポーネントを追加:
    • Rigidbody 2D: プレイヤーに物理演算を適用します。
    • 設定: Body Typeを「Dynamic」に設定し、Gravity Scaleを1にします。
    • Capsule Collider 2D: プレイヤーのコライダーとして使用します。

ステップ3: 足元のチェックポイントを設定

  1. 空のゲームオブジェクトを作成:
    • 「Player」の子オブジェクトとして、Empty Game Objectを作成し、「GroundCheckPoint」と名前を付けます。
    • プレイヤーの足元(下部)に配置します。これが地面との接地を判定するポイントになります。
  2. インスペクターで確認:
    • GroundCheckTransformが正しく足元に配置されていることを確認してください。

ステップ4: スクリプトを作成

  1. 新しいC#スクリプトを作成:
    • 「PlayerGroundCheck」という名前のスクリプトを作成し、以下のコードを追加します。
using UnityEngine;

public class PlayerGroundCheck : MonoBehaviour
{
    public Transform groundCheck; // 足元に配置したチェックポイント
    public float checkRadius = 0.2f; // チェックする範囲の半径
    public LayerMask groundLayer; // 地面として判定するレイヤー

    private bool isGrounded;

    void Update()
    {
        // RaycastまたはOverlapCircleで接地を確認
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, groundLayer);

        if (isGrounded)
        {
            // 地面にいる場合の処理
            Debug.Log("プレイヤーは地面に接地しています");
        }
        else
        {
            // 地面にいない場合の処理
            Debug.Log("プレイヤーは空中にいます");
        }
    }

    void OnDrawGizmosSelected()
    {
        // デバッグ用にチェックポイントを視覚化
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(groundCheck.position, checkRadius);
    }
}

ステップ5: スクリプトの設定

  1. スクリプトを「Player」オブジェクトにアタッチ:
    • Playerオブジェクトに「PlayerGroundCheck」スクリプトをアタッチします。
  2. スクリプトの設定を行う:
    • Ground Check: 「GroundCheck」オブジェクトをドラッグしてこのフィールドに設定します。
    • Check Radius: 足元のチェック範囲を設定します(例: 0.2)。
    • Ground Layer: 地面判定用のレイヤーを設定します。Tilemapを「Ground」レイヤーに設定するのを忘れないでください。

ステップ6: 地面レイヤーの設定

  1. 地面レイヤーを作成:
    • インスペクターの「レイヤー(Layer)」から「Ground」という新しいレイヤーを作成します。
    • Tilemapオブジェクトにこの「Ground」レイヤーを設定します。

ステップ7: テストと調整

  1. ゲームを再生:
    • プレイヤーがタイルマップの地面に立っているとき、「プレイヤーは地面に接地しています」というメッセージがコンソールに表示されることを確認します。
    • 斜面を歩く際にバタつきがなく、スムーズに接地しているかをテストします。
  2. 必要に応じて調整:
    • Check Radiusを調整して、接地判定の範囲を最適化します。
    • プレイヤーのColliderの形状やPhysicsMaterial2Dを使用して摩擦を調整し、動きを滑らかにします。

実行時、キャラクタに地面チェックポイントが赤丸で表示されているのを確認します
ここのエリアが接地判定のポイントになります


まとめ

このチュートリアルで、プレイヤーがタイルマップ上でスムーズに移動できるようになり、上り坂や斜面でのバタつきを防ぐことができます。RaycastOverlapCircleを使用することで、正確な接地判定を行い、ゲームの動きを自然にすることができます。

参考

ジャンプ処理を追加したサンプルコードになります

using UnityEngine;

public class PlayerGroundCheck : MonoBehaviour
{
    public Transform groundCheck; // 足元に配置したチェックポイント
    public float checkRadius = 0.2f; // チェックする範囲の半径
    public LayerMask groundLayer; // 地面として判定するレイヤー
    public float jumpForce = 5f; // ジャンプ力
    private bool isGrounded;
    private Rigidbody2D rb;

    void Start()
    {
        // Rigidbody2Dコンポーネントの取得
        rb = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // RaycastまたはOverlapCircleで接地を確認
        isGrounded = Physics2D.OverlapCircle(groundCheck.position, checkRadius, groundLayer);

        if (isGrounded)
        {
            // 地面にいる場合の処理
            Debug.Log("プレイヤーは地面に接地しています");
        }
        else
        {
            // 地面にいない場合の処理
            Debug.Log("プレイヤーは空中にいます");
        }

        // ジャンプの入力処理
        if (isGrounded && Input.GetKeyDown(KeyCode.Space))
        {
            Jump();
        }
    }
    void Jump()
    {
        // 上方向にジャンプ力を加える
        rb.linearVelocity = new Vector2(rb.linearVelocity.x, jumpForce);
    }

    void OnDrawGizmosSelected()
    {
        // デバッグ用にチェックポイントを視覚化
        Gizmos.color = Color.red;
        Gizmos.DrawWireSphere(groundCheck.position, checkRadius);
    }
}

追加の説明

  • Rigidbody2Dの取得Start()メソッドでRigidbody2Dコンポーネントを取得しています。これにより物理演算を行うことができます。
  • ジャンプ処理Update()メソッドでSpaceキーを押したときにジャンプを実行します。isGroundedtrueのときのみジャンプが可能です。
  • rb.velocityvelocityを直接設定してジャンプ力を加えています。

これで、シンプルなジャンプ機能が追加されました。jumpForceの値を調整することでジャンプの強さを変更できます。

参考

C#,Tile Map,Unity

Posted by hidepon