2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【Unity初歩】~Physicsを使った当たり判定~

Last updated at Posted at 2023-12-13

はじめに

前回、敵を増殖できたので、この敵への当たり判定とゴールオブジェクトの当たり判定をPhysicsを使って実装してみたいと思います。

前回の記事

Physicsの当たり判定の種類

2種類あります。

Collisionモード…衝突モード。オブジェクトが当たった場合と、跳ね返りの衝突も検知される。ので、オブジェクト同士が当たると跳ね返る。

状態 メソッド
当たった瞬間 OnCollisionEnter2D
当たってる間 OnCollisionStay2D
当たり終わった瞬間 OnCollisionExit2D

Triggerモード…すり抜けモード。オブジェクトが当たった場合のみ検知される。跳ね返りは検知されないのでオブジェクト同士が当たってもすり抜ける感じになる。

状態 メソッド
当たった瞬間 OnTriggerEnter2D
当たってる間 OnTriggerStay2D
当たり終わった瞬間 OnTriggerExit2D

敵に当たり判定をつける

Physicsを使うため、敵(🦐)のPrefabにCircle Collider 2Dコンポーネントをアタッチします。
重力もつけたいので、Rigidbodyもアタッチします。
※本当は増殖させる前に原本で当たり判定作っておくのが良かったかも。
image.png

敵(🦐)のPrefabを以下のように書き換えます。

public class EnemyController : MonoBehaviour
{
    Rigidbody2D rigidbody2;
    float walkForce = 30.0f;
    float maxWalkSpeed = 2.0f;
    bool isTouch = false;

    void Start()
    {
        this.rigidbody2 = GetComponent<Rigidbody2D>();
    }

    void Update()
    {
        // 画面外まで下に落ちたら消える
        if (transform.position.y < -5)
        {
            Destroy(gameObject);
        }

        // 地面に落ちたら左移動
        if (this.isTouch)
        {
            // 速度
            float speed = Mathf.Abs(this.rigidbody2.velocity.x);
            // 左横移動
            if (speed < this.maxWalkSpeed)
            {
                this.rigidbody2.AddForce(transform.right * -1 * this.walkForce);
            }
        }
    }

    // 
    void OnCollisionEnter2D(Collision2D collision)
    {    
        if (collision.gameObject.name == "Kani")
        {
            Debug.Log("ゲームオーバー");
        } else
        {
            this.isTouch = true;
        }
    }

🦀に当たるとゲームオーバーに(ここでは一旦コンソール表示)、地面に着地した場合はそのまま左に移動して落ちていくようにしました。
左横に移動する処理は以前Physicsを使った横移動で🦀にかいたスクリプトと同じ内容です。

ゴールを追加して当たり判定をつける

ゴールオブジェクトを追加します。

image.png

追加したゴールオブジェクトにBox Collider 2Dコンポーネントをアタッチします。
追加したら、Box Collier 2Dの「Is Trigger」にチェックを入れます。

image.png

チェックをいれると、すり抜けモードとなり、下のスクリプトで登場するOnTriggerEnter2Dメソッドが使えるようになります。

private void OnTriggerEnter2D(Collider2D collision)
{
    Debug.Log("ゴール");
}

おわりに

このゲームの完成も近づいてきた感じがします。
次回、ゴールをするとクリアシーンに遷移するようにしたいと思います。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?