ハシゴを作成して登ったり降りたりする|Unity2Dゲーム

Unity2Dゲームで「ハシゴを登ったり、降りたり」するのをスクリプトで簡単に実装してみます。

はじめに

Unityのバージョンは「2021.3.14f1」で作成しています。

2Dゲームで「プレイヤー(キャラクター)がハシゴを登ったり降りたりする機能」を実装していきます。

実装開始

簡単なプレイヤーを作成した後に、ハシゴを追加していきます。

プレイヤーと地面の作成

「2DObject」→「Sprites」→「Square」を2つ追加します。

一つはgroundに名前を変更して、AddComponentから「BoxCollider2D」を追加します。

もう一つはPlayerに名前を変更して、AddComponentから「BoxCollider2D」と「Rigidbody2D」を追加します。Rigidbody2DはGravityScaleを変更、FreezeRotationにチェックを入れます。

プレイヤーを横移動するスクリプト

下記スクリプトを作成して、Playerオブジェクトに追加します。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{

    private float speed = 5.0f;
    private Rigidbody2D rb;
    private float inputX;

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

    void Update()
    {
        inputX = Input.GetAxisRaw("Horizontal");
    }

    void FixedUpdate()
    {
        rb.velocity = new Vector2(inputX * speed, rb.velocity.y);
    }
}

キーボードの「A」、「D」、「←」、「→」で左右に動きます。

ハシゴの作成

次にハシゴを作成していきます。下記画像を利用していきます。inkscapeで簡単に作成したものです。

まずは、画像をUnityにドラッグアンドドロップして取り込みます。

Hierarchyに、取り込んだ画像をドラッグアンドドロップします。Layerを「ladder」にして、AddComponentから「BoxCollider2D」を追加して、isTriggerにチェックを入れます。

はしごでプレイヤーを縦移動するスクリプト

スクリプトを下記に変更します。raycastを利用してプレイヤーがハシゴにいるのを判定して、ハシゴにいるときは上下に動けるように制御しています。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    [SerializeField] private LayerMask ladderLayer;

    private float speed = 5.0f;
    private Rigidbody2D rb;
    private float gravity;
    private float inputX;
    private float inputY;

    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        gravity = rb.gravityScale;
    }

    void Update()
    {
        inputX = Input.GetAxisRaw("Horizontal");
        inputY = Input.GetAxisRaw("Vertical");
    }

    void FixedUpdate()
    {
        rb.velocity = new Vector2(inputX * speed, rb.velocity.y);

        if (Ladder()) 
        {
            rb.velocity = new Vector2(rb.velocity.x, inputY * speed);
            rb.gravityScale = 0f;
        }
        else
        {
            rb.gravityScale = gravity;
        }
    }
    private bool Ladder()
    {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.5f, ladderLayer);
        if (hit.collider != null)
            return true;
        else
            return false;
    }
}

raycastについては下記の記事が参考になります。

パラメータのLayerにはladderをセットします。

実行してみると下記のような感じに。ハシゴにいるときだけ上下することができます。

タイトルとURLをコピーしました