ゴマちゃんフロンティア

アザラシが大好きなエンジニアの開発日記です

【Unity】BoxCollider2Dの範囲でEdgeCollider2Dを作りたくなったお話

time 2022/08/20

今回は記事タイトルの通り、「BoxCollider2Dの範囲で」「EdgeCollider2Dの各辺を作りたい」というケースがあったので、変換するスクリプトを作ってみたお話です。

「エディタ上から直接EdgeCollider2Dで作ればいいよね?」と思われるかもしれませんが、私はEdgeCollider2DでBoxCollider2Dのような四角形を作るのが非常に苦手です。
「Edit Collider」による編集も操作性が悪く、ただの四角形を作る度に苦戦していたりします。
※操作性云々は個人の感想です

ということで書いたスクリプトがこちら。

using System.Collections.Generic;
using UnityEngine;

public class EdgeColliderConverter : MonoBehaviour
{
    [SerializeField]
    private BoxCollider2D boxCollider2D;

    void Start()
    {
        var edgeCollider2D = gameObject.AddComponent<EdgeCollider2D>();
        edgeCollider2D.offset -= new Vector2(transform.position.x, transform.position.y);
        
        var pointList = new List<Vector2>();
        pointList.Add(new Vector2(boxCollider2D.bounds.min.x, boxCollider2D.bounds.max.y));
        pointList.Add(new Vector2(boxCollider2D.bounds.max.x, boxCollider2D.bounds.max.y));
        pointList.Add(new Vector2(boxCollider2D.bounds.max.x, boxCollider2D.bounds.min.y));
        pointList.Add(new Vector2(boxCollider2D.bounds.min.x, boxCollider2D.bounds.min.y));
        pointList.Add(new Vector2(boxCollider2D.bounds.min.x, boxCollider2D.bounds.max.y));

        edgeCollider2D.points = pointList.ToArray();
    }
}

アタッチされているBoxCollider2DのBoundsを参照し、EdgeCollider2Dの各辺を作ります。
BoundsのminとmaxがBoxCollider2Dの左下と右上になるので、それを元にポイントを追加しています。

四角形だからポイントは4つあればよさそうだけど、なんで5つなの?

EdgeCollider2DはBoxCollider2Dと異なり「辺」であり「範囲」ではないので、頂点を4つ定義すれば自動的に囲んでくれる…というものではありません。
なので「始点となるポイント」+「辺4つを作るためのポイント」で計5つ必要になります。

また、アタッチされているオブジェクトの位置によってはポイントがずれてしまうので、移動している分だけoffsetをマイナスして補正しています。
最終的に生成されるEdgeCollider2Dはこんな感じ。

使い終わったBoxCollider2Dはお好みで消したり無効化したりしましょう。

down

コメントする