Unity 用プレーヤー 3D および 2D ウォール ジャンプ チュートリアル

壁ジャンプは、プラットフォーマーやアクション ゲームで一般的なメカニズムであり、プレーヤーが壁から飛び降りることを可能にし、ナビゲーションに複雑さと多様性を加えます。このチュートリアルは、提供されている FPS コントローラーに壁ジャンプを統合することを目的としています。最終的には、プレイヤー キャラクターは 2D 設定と 3D 設定の両方で壁ジャンプを実行できるようになります。

'SC_FPSController' スクリプトを使用して 3D 用の壁ジャンプを実装する

Unity FPS コントローラー チュートリアルの基本コードから始めて、壁ジャンプの仕組みを紹介します。

ステップ 1: 壁検出のセットアップ

  • 壁からジャンプできるオブジェクト用に、Unity に "Wall" という名前の新しいレイヤーを追加します。
  • 次の変数を使用して、'SC_FPSController' クラスを更新します。このクラスは、Unity FPS コントローラー チュートリアルから入手できます。
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

ステップ 2: 壁の検出

  • 壁を検出するには、次のロジックを 'Update()' メソッド内に組み込みます。
RaycastHit hit;
if (Physics.Raycast(transform.position, transform.right, out hit, 1f, wallLayer) || Physics.Raycast(transform.position, -transform.right, out hit, 1f, wallLayer))
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

上記のコードのこのレイキャストは、プレーヤーの左右の壁を検出します。

ステップ 3: 3D 用の壁ジャンプの実装

  • 'Update()' メソッド内で、グランド ジャンプ ロジックの後に次を挿入します。
else if (Input.GetButton("Jump") && canMove && isTouchingWall)
{
    moveDirection.y = wallJumpForce;

    // This adds a bit of horizontal force opposite the wall for a more dynamic jump
    if (Physics.Raycast(transform.position, transform.right, 1f, wallLayer))
    {
        moveDirection += -transform.right * wallJumpForce / 2.5f; // Adjust the divisor for stronger/weaker push.
    }
    else if (Physics.Raycast(transform.position, -transform.right, 1f, wallLayer))
    {
        moveDirection += transform.right * wallJumpForce / 2.5f;
    }
}

上記のコードのこのロジックは、プレーヤーがジャンプ ボタンを押しているか、移動できるか、壁に触れているかどうかをチェックします。その場合、壁から離れる方向に垂直方向の力とわずかな水平方向の力が加わります。

'CharacterController2D' スクリプトを使用した 2D 用の壁ジャンプの実装

2D Character Controller for Unity チュートリアルの基本コードから始めて、壁ジャンプ メカニズムを紹介します。

ステップ 1: 壁検出のセットアップ

  • 壁からジャンプできるオブジェクト用に、Unity に "Wall" という名前の新しいレイヤーを追加します。
  • 次の変数を使用して、'CharacterController2D' クラスを更新します。このクラスは、2D Character Controller for Unity チュートリアルから取得できます。:
public LayerMask wallLayer;
public float wallJumpForce = 10f;
private bool isTouchingWall = false;

ステップ 2: 2D で壁を検出する

  • 壁を検出するには、次のロジックを 'Update()' メソッド内に組み込みます。
RaycastHit2D wallHitLeft = Physics2D.Raycast(transform.position, Vector2.left, 1f, wallLayer);
RaycastHit2D wallHitRight = Physics2D.Raycast(transform.position, Vector2.right, 1f, wallLayer);

if (wallHitLeft.collider != null || wallHitRight.collider != null)
{
    isTouchingWall = true;
}
else
{
    isTouchingWall = false;
}

ステップ 3: 2D の壁ジャンプの実装

  • 'Update()' メソッド内で、グランド ジャンプ ロジックの後に次を挿入します。
if (Input.GetKeyDown(KeyCode.W) && isTouchingWall && !isGrounded)
{
    r2d.velocity = new Vector2(r2d.velocity.x, jumpHeight);
    if (wallHitLeft.collider != null)
    {
        r2d.AddForce(new Vector2(wallJumpForce, 0)); // Push to the right when wall is on the left
    }
    else if (wallHitRight.collider != null)
    {
        r2d.AddForce(new Vector2(-wallJumpForce, 0)); // Push to the left when wall is on the right
    }
}

対処された質問:

  1. キャラクターは、Unity で壁をどのように検出できますか?: キャラクターは、レイキャスティングを使用して壁を検出できます。プレイヤーから不可視の光線を希望の方向に発射することで、壁などのオブジェクトがこの光線と交差するかどうかを判断できます。
  2. Unity における 2D と 3D の壁ジャンプの実装の違いは何ですか?: Unity では、2D 物理学は 'Physics2D' メソッドを使用します('Physics2D.Raycast()' など)、3D 物理学では 'Physics' メソッドを使用します ('Physics.Raycast()' など) )。ロジックは比較的似ていますが、方法と方向 (2D の場合は Vector2、3D の場合は Vector3) が異なります。

結論

この追加により、2D 空間内のキャラクターが壁から飛び降りることが可能になります。スムーズなゲームプレイを確保するには、力の値を実験する必要がある場合があります。これらのステップを統合することで、プレイヤーは壁のある環境での 2D キャラクターの動きがより多彩でダイナミックになることに気づくでしょう。