Unity|簡単なジャンプ台を作成。特定のオブジェクトで跳ねる動きを実装

Unityの2Dゲーム作成で「簡単なジャンプ台」のようなものを作成してみます。踏んだらプレイヤーが上に上がる感じ(跳ねる)ですね。

ジャンプ判定には「コライダーを利用」したものと「レイキャストを利用」したもの、2つで実装してみます。

はじめに

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

2Dゲームで「プレイヤー(キャラクター)が特定の地面に触れたら上方向に力が加わる」を実装していきます。ジャンプ台のようなイメージですね。

実装開始

簡単な画面を作成してから、プレイヤーの動きを作成、ジャンプ台を作成していきます。

プレイヤーと地面の作成

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

一つは名前をPlayerにして、「Add Component」からBoxCollider2DとRigidbody2Dを追加、もう一つはGroundにして、BoxCollider2Dを追加します。

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

下記スクリプトを作成します。プレイヤーを横方向に動かすスクリプトです。

using UnityEngine;

public class PlayerMove : MonoBehaviour
{
    private float _PlayerSpeed = 5.0f;
    private Rigidbody2D _rb;
    private float _inputX;

    private void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        _inputX = Input.GetAxisRaw("Horizontal");
    }
    private void FixedUpdate()
    {
        _rb.velocity = new Vector2(_inputX * _PlayerSpeed, _rb.velocity.y);
    }
}

スクリプトをPlayerに追加して実行すると、下記のように横方向に移動することができます。

詳しくは下記にて「プレイヤーを左右に動かす」記事にしています。

跳ねる地面を作成

次にプレイヤーが踏んだら跳ねる地面を作成します。

Groundをコピーして、名前をBounce_Groundに変更します。Tagをbounceにして位置と色を変更しておきます。

Playerの配下に「CreateEmpty」で空オブジェクトを追加します。

名前をPointに変更して、BoxCollider2Dを追加、isTriggerにチェックを入れて、コライダー範囲を設定します。

跳ねるスクリプトを作成

触れたときに上方向に力を加えるスクリプトを作成します。

using UnityEngine;

public class Bounce : MonoBehaviour
{
    [SerializeField] private Rigidbody2D _rb;
    private float bounce = 10.0f;

    private void OnTriggerEnter2D(Collider2D collision)
    {
        if(collision.CompareTag("bounce"))
            _rb.AddForce(new Vector2(0, bounce),ForceMode2D.Impulse);
    }
}

Pointに追加して、パラメーターをセットします。

実行してみると、下記のように跳ねる地面に触れると上方向に力が加わります。

Raycastを利用してみる

次にRaycastを利用して実装してみます。まずは、Pointを削除します。

Playerを動かすスクリプトを下記に変更します。

using UnityEngine;

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

    private float _PlayerSpeed = 5.0f;
    private float _bounce = 5.0f;

    private Rigidbody2D _rb;
    private float _inputX;
    private float _inputY;

    private void Awake()
    {
        _rb = GetComponent<Rigidbody2D>();
    }
    void Update()
    {
        _inputX = Input.GetAxisRaw("Horizontal");
        _inputY = Bounce();
    }
    private void FixedUpdate()
    {
        _rb.velocity = new Vector2(_inputX * _PlayerSpeed, _rb.velocity.y);
        if (_inputY != 0)
        {
            _rb.AddForce(new Vector2(0, _inputY), ForceMode2D.Impulse);
        }
    }
    private float Bounce()
    {
        RaycastHit2D hit = Physics2D.Raycast(transform.position, Vector2.down, 0.6f, bounceLayer);
        if(hit.collider != null)
            return _bounce;
        else
            return 0f;
    }
}

Bounce_GroundにLayerをセットします。

パラメータをセットします。

実行してみると下記のようになります。

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