【Unity】2Dアプリで地面にいるときだけジャンプできるようにする

2023年9月20日

Unityで2Dのジャンプアクションを実装するための基本的なサンプルコードを提供します。このコードは、Unityの新しいInput Systemを使用しています。以下の手順に従って、プロジェクトにコードを追加し、ジャンプできる2Dアプリを作成できます。

構成概要

Unityプロジェクトを作成

2Dのキャラクターを用意し、プロジェクトに追加します
スプライトやアニメーションが含まれます

キャラクターにRigidbody2Dコンポーネントを追加します
これにより、物理的な挙動が制御されます

キャラクターにBox Collider 2Dコンポーネントを追加し、地面との衝突を検出できるようにします

キャラクターに以下のC#スクリプトをアタッチします
このスクリプトは、ジャンプ機能を実装します

サンプルコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class PlayerController : MonoBehaviour
{
    public float jumpForce = 5.0f;  // ジャンプの力
    private bool isJumping = false; // ジャンプ中かどうかを追跡するフラグ
    private Rigidbody2D rb;

    private void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }

    private void Update()
    {
        if (Input.GetButtonDown("Jump") && !isJumping)
        {
            // ジャンプボタンが押され、ジャンプ中でない場合
            Jump();
        }
    }

    private void Jump()
    {
        rb.velocity = new Vector2(rb.velocity.x, jumpForce);
        isJumping = true;
    }

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (collision.gameObject.CompareTag("Ground"))
        {
            // 地面と接触したらジャンプ可能に戻す
            isJumping = false;
        }
    }
}

プロジェクトのInput Managerから、ジャンプボタンの設定を確認してください。通常、デフォルトではスペースキーまたはジョイスティックのボタンがジャンプボタンに割り当てられています。必要に応じてカスタマイズできます。

これで、キャラクターが地面にいるときにジャンプできる2Dアプリが完成します。キャラクターは地面に接触するとジャンプ可能になり、ジャンプボタンが押されたときにジャンプします。このコードを基に、さまざまなゲームメカニクスやアニメーションを追加して、ゲームをカスタマイズできます。

課題点

このコードには、基本的なジャンプメカニズムがありますが、改善の余地がいくつかあります。以下に、コードの問題点とそれを解決する方法を示します。

ジャンプの連続使用制限

現在のコードでは、ジャンプ中に連続でジャンプできてしまいます。通常、プレイヤーがジャンプボタンを押し続けた場合、1回のジャンプだけが許可されるようにしたいでしょう。これを修正するには、ジャンプフラグを使用します。

private bool canJump = true; // ジャンプの制限を追加

private void Update()
{
    if (Input.GetButtonDown("Jump") && !isJumping && canJump)
    {
        Jump();
    }
}

private void Jump()
{
    rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    isJumping = true;
    canJump = false; // ジャンプ中はジャンプを制限
}

private void OnCollisionEnter2D(Collision2D collision)
{
    if (collision.gameObject.CompareTag("Ground"))
    {
        isJumping = false;
        canJump = true; // 地面に接触したらジャンプ可能に戻す
    }
}

ジャンプの高さ制御

現在のコードでは、ジャンプの高さが固定されています。キャラクターが長距離をジャンプする場合、ジャンプ力を調整できるように、ジャンプ力を調整可能なプロパティとして外部から設定できるようにしましょう

public float jumpForce = 5.0f; // ジャンプの初期力

// ジャンプ力を外部から設定可能にするプロパティ
public float JumpForce
{
    get { return jumpForce; }
    set { jumpForce = value; }
}

地面判定

現在のコードでは、地面を"Ground"タグで判定しています。より汎用的な方法として、Raycastを使用して地面判定を行うことが推奨されます。これにより、地面の形状に関係なく正確な判定が行えます。Raycastを使用するためには、キャラクターにCollider2Dを追加し、Groundレイヤーを作成して、それに所属させます。次に、Raycastを使って地面判定を行います。

private LayerMask groundLayer; // 地面のレイヤーマスク

private void Start()
{
    rb = GetComponent<Rigidbody2D>();
    groundLayer = LayerMask.GetMask("Ground"); // "Ground"レイヤーを設定
}

private void Update()
{
    if (Input.GetButtonDown("Jump") && !isJumping && canJump)
    {
        Jump();
    }
}

private void Jump()
{
    rb.velocity = new Vector2(rb.velocity.x, jumpForce);
    isJumping = true;
    canJump = false;
}

private void FixedUpdate()
{
    // 地面判定をRaycastで行う
    RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.1f, groundLayer);
    if (hit.collider != null)
    {
        isJumping = false;
        canJump = true;
    }
}

これらの修正を加えることで、より柔軟で正確なジャンプメカニズムを持つ2Dゲームを開発できます。プロジェクトの要件に合わせてコードをカスタマイズしてください。

参考

Unity

Posted by hidepon