ひとりでのアプリ開発 - fineの備忘録 -

ひとりでアプリ開発をするなかで起こったことや学んだことを書き溜めていきます

Unity - 見えない壁の作り方

初めに

 キャラクターの進行を防ぐ見えない壁の作り方を2D, 3Dそれぞれ紹介します。


2Dの場合

見えない壁の作り方

 今回は、次のようなキャラクターを想定しています。

  • Rigidbody2Dを使ってキャラクターを動かす
  • Collider2Dを使って当たり判定をとる

 見えない壁は次のように作っていきます。

  1. 空のゲームオブジェクトを生成する
    Hierarchy で右クリックし、Create Empty をクリックすることで生成できます。
  2. GameObject に BoxCollider2D をつける
    Inspector の AddComponent から BoxCollider2D を選択すればつけられます。
  3. 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;
        }
    }
}

 このスクリプトについては、下のリンク先をご覧ください。

fineworks-fine.hatenablog.com

(実行して確認)
youtu.be

3Dの場合

見えない壁の作り方

 基本的には、2Dの場合と同様です。違いは BoxColldier2D や Rigidbody2D が BoxCollider、Rigidbody になったことです。

 3Dの場合に書き直したものを載せますが、必要ない方は飛ばしてください。

 次のようなキャラクターを想定しています。

  • Rigidbody を使ってキャラクターを動かす
  • Collider を使って当たり判定をとる

 見えない壁は次のように作っていきます。

  1. 空のゲームオブジェクトを生成する
    Hierarchy で右クリックし、Create Empty をクリックすることで生成できます。
  2. GameObject に BoxCollider2D をつける
    Inspector の AddComponent から BoxCollider を選択すればつけられます。
  3. 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 については、下のリンク先で紹介しています。ぜひご覧ください。

fineworks-fine.hatenablog.com

 このままキャラクターを動かすと、ごろごろと回転してしまいます。Rigidbody の Freeze Rotation をすべて true にすることで、回転をさせないようにできます。また、スクリプトの speed から移動速度を調整できます。

 あとは位置とサイズ、カメラを調整し、実行してみましょう。

(実行して確認)
youtu.be

最後に

  • 見えない壁はゲームオブジェクトに BoxCollider をつけて作る