記事ディレクトリ
キャラクターやシーンを作成する
まずはキャラクターを作成しますが、ここではプレイヤーとなるカプセルと地面となるスクエアを新規作成しました。
次に、キャラクターにコライダーと剛体を追加し、地面にコライダーを追加します。次に、プレイヤーの剛体に Z 軸コンストレイントを追加して、プレイヤーが傾かないようにします。以下に示すように:
同時に、空のオブジェクトをサブオブジェクトとしてキャラクターに追加して、地面に光線を放射し、地面に触れたかどうかを検出します。
地面チェックをキャラクターの足元に置きます。
地面を作る
次に、地面を表す新しいレイヤーを作成する必要があります。
Square の名前を Ground に変更し、その Layer を Ground に変更します。
キャラクター制御スクリプト
次に、キャラクターを制御するための新しい CharacterController2D スクリプトを作成します。このスクリプトをプレーヤーにマウントします。
地面を確認してください
ジャンプ機能を実装するには地面の存在を検出する必要があり、プレイヤーが地面にいてジャンプキーを押すとジャンプすることができます。
地面を検出するには、キャラクターにサブオブジェクト トリガーを追加する、トリガーを使用して地面を検出するなど、複数の方法があります。また、足元に光線を放射したり、エリア上で衝突検出を実行して地面を検出することもできます。地面はあります。この記事では最後の方法を採用します。
2D 衝突の検出に使用される Physics2D.OverlapCircle メソッドを使用する必要があります。シーン内の指定された位置に円形の領域を作成し、この領域内で他のオブジェクトとの衝突があるかどうかを検出します。
このメソッドのオーバーロードの 1 つを以下に示します。これは、使用するオーバーロードです。
public static Collider2D OverlapCircle(Vector2 point, float radius, int layerMask)
パラメータの意味は次のとおりです。
-
point: 円の中心位置を表す 2 次元ベクトル。円形領域検出の中心点の座標を指定します。つまり、点を中心として、指定された半径を半径として、衝突検出用の円形の領域が作成されます。
-
radius: 円形領域の半径を表します。このパラメータは、衝突検出の範囲のサイズを決定します。半径が大きいほど、衝突オブジェクトが検出される可能性が高くなります。
-
LayerMask: 衝突検出に使用するレイヤーを指定します。レイヤーは、オブジェクトの可視性と衝突インタラクションを制御するための Unity のメカニズムです。特定のレイヤーを衝突検出から制限または除外するには、layerMask を使用します。
このうち、point と radius は必須パラメータですが、layerMask はオプションです。ただし、ここでは地面を個別に検出するためにそれを使用する必要があります。
point には、前に作成したキャラクター サブオブジェクトの位置を使用します。radius には、検出できる範囲を示す別の属性を作成します。もちろん、この値は小さい方がよいです。大きすぎると、検出が無効になります。ジャンプしても不正確になりますし、地上でも検出される可能性があります。
レイウスの定義は次のとおりです。
private float groundCheckRadius = 0.2f;
次に、次のように検出コードを記述します。
// 检测角色是否与地面接触
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);
以下は完全なコードです。これをスクリプトに直接コピーすると、実行できます。
using UnityEngine;
public class CharacterController2D : MonoBehaviour
{
public float speed = 5f;
public float jumpForce = 5f;
public Transform groundCheck;
public LayerMask groundLayer;
private Rigidbody2D rb;
private bool isGrounded;
private float groundCheckRadius = 0.2f;
void Start()
{
rb = GetComponent<Rigidbody2D>();
}
void Update()
{
// 检测角色是否与地面接触
isGrounded = Physics2D.OverlapCircle(groundCheck.position, groundCheckRadius, groundLayer);
// 获取水平输入
float moveInput = Input.GetAxisRaw("Horizontal");
// 应用水平速度
rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);
// 角色跳跃
if (Input.GetButtonDown("Jump") && isGrounded)
{
rb.AddForce(new Vector2(0f, jumpForce), ForceMode2D.Impulse);
}
}
}
次に、プレーヤーのサブオブジェクト グラウンド チェックをコンポーネントのグラウンド チェック プロパティにドラッグし、グラウンド レイヤとして前に設定したグラウンド レイヤを選択します。
演算結果
実行結果は下図のようになり、走ったりジャンプしたりできます。