初めに
キャラクターの進行を防ぐ見えない壁の作り方を2D, 3Dそれぞれ紹介します。
2Dの場合
見えない壁の作り方
今回は、次のようなキャラクターを想定しています。
- Rigidbody2Dを使ってキャラクターを動かす
- Collider2Dを使って当たり判定をとる
見えない壁は次のように作っていきます。
- 空のゲームオブジェクトを生成する
Hierarchy で右クリックし、Create Empty をクリックすることで生成できます。 - GameObject に BoxCollider2D をつける
Inspector の AddComponent から BoxCollider2D を選択すればつけられます。 - BoxCollider2D のサイズと位置を調整する
Scene ビューで Gizmos をオンにした状態で、GameObject を選択すると、GameObject の Collider が確認できます。(緑色の長方形がBoxCollider2D)
Transform から Position と Scale が変更できます。
確認
今回のキャラクターは以前、ChatGPTに作ってもらったスクリプトを使用します。
using UnityEngine; public class CharacterMovement : MonoBehaviour { public float moveSpeed = 5f; // キャラクターの移動速度 public float jumpForce = 10f; // ジャンプするときの力 public int maxJumps = 2; // ジャンプ可能回数 private int jumpCount = 0; // ジャンプ回数のカウント private Rigidbody2D rb; // Rigidbody2Dコンポーネントの参照 private SpriteRenderer sprite; // SpriteRendererコンポーネントの参照 void Start() { rb = GetComponent<Rigidbody2D>(); // Rigidbody2Dコンポーネントを取得 sprite = GetComponent<SpriteRenderer>(); // SpriteRendererコンポーネントを取得 } void FixedUpdate() { // キー入力を取得 float moveHorizontal = Input.GetAxis("Horizontal"); // Rigidbody2Dを使ってキャラクターを移動させる Vector2 movement = new Vector2(moveHorizontal, 0f); rb.velocity = movement * moveSpeed; // キャラクターの向きを設定 if (moveHorizontal > 0) { sprite.flipX = false; // 右を向く } else if (moveHorizontal < 0) { sprite.flipX = true; // 左を向く } // ジャンプ処理 if (Input.GetButtonDown("Jump") && jumpCount < maxJumps) { rb.AddForce(Vector2.up * jumpForce, ForceMode2D.Impulse); jumpCount++; } } void OnCollisionEnter2D(Collision2D collision) { // 地面に接触したときにジャンプ回数をリセットする if (collision.gameObject.CompareTag("Ground")) { jumpCount = 0; } } }
このスクリプトについては、下のリンク先をご覧ください。
(実行して確認)
youtu.be
3Dの場合
見えない壁の作り方
基本的には、2Dの場合と同様です。違いは BoxColldier2D や Rigidbody2D が BoxCollider、Rigidbody になったことです。
3Dの場合に書き直したものを載せますが、必要ない方は飛ばしてください。
次のようなキャラクターを想定しています。
- Rigidbody を使ってキャラクターを動かす
- Collider を使って当たり判定をとる
見えない壁は次のように作っていきます。
- 空のゲームオブジェクトを生成する
Hierarchy で右クリックし、Create Empty をクリックすることで生成できます。 - GameObject に BoxCollider2D をつける
Inspector の AddComponent から BoxCollider を選択すればつけられます。 - BoxCollider2D のサイズと位置を調整する
Scene ビューで Gizmos をオンにした状態で、GameObject を選択すると、GameObject の Collider が確認できます。(緑色の長方形がBoxCollider)
Transform から Position と Scale が変更できます。
確認
オブジェクトを動かして、確認してみます。
今回は、次の画像のように床の周りを見えない壁で囲ってみます。
床は Cube を生成し、BoxCollider をつけます。(確認に色を付ける必要はないですが、見やすくするために Material を使って緑色にしています。)
キャラクターは Cupsule を生成し、次のスクリプトをつけます。
using UnityEngine; [RequireComponent(typeof(Rigidbody))] //自動でRididbodyがつくようにしている public class ObjectController : MonoBehaviour { public float speed = 10.0f; public float jumpForce = 500.0f; private Rigidbody rb; void Start() { rb = GetComponent<Rigidbody>(); } void FixedUpdate() { // 前後左右の移動 float moveHorizontal = Input.GetAxis("Horizontal"); float moveVertical = Input.GetAxis("Vertical"); Vector3 movement = new Vector3(moveHorizontal, 0.0f, moveVertical); rb.AddForce(movement * speed); // ジャンプ if (Input.GetKeyDown(KeyCode.Space)) { rb.AddForce(Vector3.up * jumpForce); } } }
※Cupsuleを生成したとき、デフォルトでCupsuleCollider はついています。Rigidbody はスクリプトをつけたら自動でつくように RequireComponent を使っています。RequireComponent については、下のリンク先で紹介しています。ぜひご覧ください。
このままキャラクターを動かすと、ごろごろと回転してしまいます。Rigidbody の Freeze Rotation をすべて true にすることで、回転をさせないようにできます。また、スクリプトの speed から移動速度を調整できます。
あとは位置とサイズ、カメラを調整し、実行してみましょう。
(実行して確認)
youtu.be
最後に
- 見えない壁はゲームオブジェクトに BoxCollider をつけて作る