名古屋でアプリ・VR開発を行っています
ワクワクできるゲームをガンガン開発リリース中!

Unityでフィールドの外周にコライダーを配置する

こんにちわ、SAT-BOXのペンギンです

今日はちょっとしたUnity知識を紹介したいと思います。
Unityでゲームを作っている時に、フィールドに沿ってコライダーを作りたい時ってありませんか?

例えば扇形のフィールドがあるとします。
f:id:sat-box:20200728091226p:plain:h360

・posListには、座標をいれておきます
(手動で設定しても良いですが、今回はあらかじめ計算していれてあります)
・colPrefには、コライダー生成用のGameObjectです(非アクティブ)
・colRootには、生成したコライダーを格納する親を設定します
f:id:sat-box:20200728092042p:plain:h360

こんな感じに外周にコライダーを配置したい・・・
f:id:sat-box:20200728093117p:plain:h360

そこで下記 MakeCollider() を実行すれば、外周にコライダーが作られます!
プログラムはこんな感じです。

    //座標リスト
    private List<Vector3> posList = new List<Vector3>();

    [SerializeField, Header("コライダープレハブ")]
    private GameObject colPref;

    [SerializeField, Header("生成したコライダーを格納するルート")]
    private Transform colRoot;

    public void MakeCollider()
    {
        Vector3 vec;
        GameObject colObj;

        for (int i = 0; i < posList.Count - 1; i++)
        {
            //コライダーを生成
            colObj = Instantiate(colPref, colRoot);

            //コライダーの座標を設定
            colObj.transform.position = posList[i];

            //次のコライダーの方向を取得
            vec = posList[i + 1] - posList[i];

            //取得した方向を向かせる
            colObj.transform.LookAt(posList[i] + vec);

            //コライダーの位置の補正
            colObj.transform.position += -colObj.transform.right * 0.55f;

            //次のコライダーまでの距離の半分だけZ座標を移動させる
            colObj.transform.position += colObj.transform.forward * (vec.magnitude / 2.0f);

            //ScaleのZ軸を次のコライダーの距離分にする
            colObj.transform.localScale =
                new Vector3
                (
                    colObj.transform.localScale.x,
                    colObj.transform.localScale.y,
                    colObj.transform.localScale.z * vec.magnitude
                );

            //生成したコライダーをアクティブ状態にする
            colObj.SetActive(true);
        }
    }

今回みたいに曲線に沿ってコライダーを作りたいときとかに便利ですね!
(もっと便利なものがあるかもしれませんが...)

では。