【Unity2D】Collider以外の当たり判定【Boxcast】

Unity

最初に言っておきます、あんまり自分も理解しきれていないです…申し訳ないです…。

Physics2D.BoxCast

    private void Update()
    {

        RaycastHit2D hit = Physics2D.BoxCast(transform.position, new Vector2(1, 1), 0, Vector2.zero);

          Debug.Log(hit.collider);
    }

Physics2D.BoxCastメソッドは8つほど引数を指定できるそうですが、イマイチよく分からなかったです。
4つ指定すればエラーが出なかったので4つにしました。
1つ目の引数にorizin(transform.position)
2つ目の引数にsize(new Vector2(1,1))
3つ目の引数にangle(0)
4つ目の引数にdirection(Vector2.zero)

を指定しています。
理解しきれていないのですが、orizinは中心点、sizeはボックスのサイズ、angleは角度、directionは方向指定、みたいな感じだと思います。
ただ、directionに関しては殆ど分からないです…。
試しにdirectionにVector2.rightを指定してみると、右方向にかなり長く判定が出てしまいました。

Physics2D.Boxcastメソッドは戻り値にRaycastHit2D型の結果を返すので
RaycastHit2D hit = Physics2D.BoxCast(transform.position, new Vector2(1, 1), 0, Vector2.zero);
と、hitに結果を入れています。

その後、if文でhitに結果が入っていたらDebug.Log(hit.collider)でコライダー情報を表示しています。

しかし、これだと初めに当たったコライダー情報しか取得できません。

Physics2D-BoxCast - Unity スクリプトリファレンス
Casts a box against colliders in the Scene, returning the first collider to contact with it.

Physics2D.BoxCastAll

そんなときはこのメソッドを使えば、当たったコライダーの全てを配列で返してくれます。

private void Update()
    {
        RaycastHit2D[] allHit = Physics2D.BoxCastAll(transform.position, new Vector2(1, 1), 0, Vector2.zero);

        for(int i = 0; i < allHit.Length; i++)
        {
            Debug.Log(allHit[i].collider);
        }
    }

Physics2D.BoxCastAllメソッドは戻り値にRaycastHit2D型の配列を返します。
for文で配列の数、Debug.Log(allHit[i].collider)でコライダー情報を表示しています。

if文で(allHit[i].collider.tag == “TagName”)というようにすれば、特定のタグに当たった時に何かの処理をするというようなことが出来ます。

Physics2D-BoxCastAll - Unity スクリプトリファレンス
Casts a box against colliders in the Scene, returning all colliders that contact with it.

DrawCubeで当たり判定を可視化

private void OnDrawGizmos()
    {
        Gizmos.color = Color.red; //色指定
        Gizmos.DrawCube(transform.position, new Vector2(1, 1)); //中心点とサイズ
    }

UnityではGizmoという物を描画できます。
こんな機能あるなんて最近知りました…。

常に描画したい場合はOnDrawGizmosメソッド内にコードを書きます。
今回はGizmos.colorをレッドにして、Gizmos.DrawCubeメソッドで赤いキューブを描画しました。
1つ目の引数は中心点で、2つ目の引数はキューブのサイズです。
中心点とサイズを先程書いたBoxCast関連のメソッドのと同じにして、同じ範囲を描画してどこに判定があるのか見えるようにします。

もしGizmoが表示されない場合は、このボタンがオフになっているのかもしれません。



ただ、BoxCastの引数のangleで角度を付けた場合、DrawCubeメソッドに角度を付ける引数は見つからなかったのでどう描画すればいいのか分かりません…。

MonoBehaviour-OnDrawGizmos() - Unity スクリプトリファレンス
選択可能にしたり、常に描画したいギズモを描画するには OnDrawGizmos を使用します
Gizmos-DrawCube - Unity スクリプトリファレンス
中心とサイズを持つキューブを描画します

コメント

タイトルとURLをコピーしました