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をセットします。

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

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


