UnityでTile Mapを使ったケースでの安定した接地判定を行うためのチュートリアル
プレイヤーがタイルマップの地面を歩く際、特に上り坂や斜面でバタつきが発生しないように、Raycast
やOverlapCircle
を使って安定した接地判定を行います。
目次
実行結果
ジャンプするとコンソールに空中であるログが表示されます
チュートリアル
ステップ1: 新規プロジェクトの準備
- Unityを開く:
- 新しい2Dプロジェクトを作成するか、既存のプロジェクトを使用してください。
- タイルマップの設定:
Tilemap
を作成し、タイルを使用して地面を描画します。Tilemap
オブジェクトにTilemap Collider 2D
を追加し、必要に応じてComposite Collider 2D
も追加します(パフォーマンス向上のため)。
ステップ2: プレイヤーオブジェクトの作成
- プレイヤーオブジェクトを作成:
- 2Dスプライト(例: 四角形や円)を用意し、「Player」という名前のオブジェクトを作成します。
- キャラクタスプライトが用意できている場合はそれを使います
- コンポーネントを追加:
Rigidbody 2D
: プレイヤーに物理演算を適用します。- 設定:
Body Type
を「Dynamic」に設定し、Gravity Scale
を1にします。 Capsule Collider 2D
: プレイヤーのコライダーとして使用します。
ステップ3: 足元のチェックポイントを設定
- 空のゲームオブジェクトを作成:
- 「Player」の子オブジェクトとして、
Empty Game Object
を作成し、「GroundCheckPoint」と名前を付けます。 - プレイヤーの足元(下部)に配置します。これが地面との接地を判定するポイントになります。
- 「Player」の子オブジェクトとして、
- インスペクターで確認:
GroundCheck
のTransform
が正しく足元に配置されていることを確認してください。
ステップ4: スクリプトを作成
- 新しい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: スクリプトの設定
- スクリプトを「Player」オブジェクトにアタッチ:
Player
オブジェクトに「PlayerGroundCheck」スクリプトをアタッチします。
- スクリプトの設定を行う:
Ground Check
: 「GroundCheck」オブジェクトをドラッグしてこのフィールドに設定します。Check Radius
: 足元のチェック範囲を設定します(例: 0.2)。Ground Layer
: 地面判定用のレイヤーを設定します。Tilemap
を「Ground」レイヤーに設定するのを忘れないでください。
ステップ6: 地面レイヤーの設定
- 地面レイヤーを作成:
- インスペクターの「レイヤー(Layer)」から「Ground」という新しいレイヤーを作成します。
Tilemap
オブジェクトにこの「Ground」レイヤーを設定します。
ステップ7: テストと調整
- ゲームを再生:
- プレイヤーがタイルマップの地面に立っているとき、「プレイヤーは地面に接地しています」というメッセージがコンソールに表示されることを確認します。
- 斜面を歩く際にバタつきがなく、スムーズに接地しているかをテストします。
- 必要に応じて調整:
Check Radius
を調整して、接地判定の範囲を最適化します。- プレイヤーの
Collider
の形状やPhysicsMaterial2D
を使用して摩擦を調整し、動きを滑らかにします。
実行時、キャラクタに地面チェックポイントが赤丸で表示されているのを確認します
ここのエリアが接地判定のポイントになります
まとめ
このチュートリアルで、プレイヤーがタイルマップ上でスムーズに移動できるようになり、上り坂や斜面でのバタつきを防ぐことができます。Raycast
やOverlapCircle
を使用することで、正確な接地判定を行い、ゲームの動きを自然にすることができます。
参考
ジャンプ処理を追加したサンプルコードになります
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
キーを押したときにジャンプを実行します。isGrounded
がtrue
のときのみジャンプが可能です。 - rb.velocity:
velocity
を直接設定してジャンプ力を加えています。
これで、シンプルなジャンプ機能が追加されました。jumpForce
の値を調整することでジャンプの強さを変更できます。
ディスカッション
コメント一覧
まだ、コメントがありません