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をセットします。
パラメータをセットします。
実行してみると下記のようになります。