オブジェクトを合体する(マージ)【Unityメモ】

今回はUnity2Dで「オブジェクト」を合体させてみます。いわゆるマージと言うやつですね。

はじめに

Unityのバージョンは2021.3.14f1です。

下記の様に白い箱同士(同じオブジェクト)がぶつかると青い箱になるのを実装していきます。

実装開始

簡単な画面を作成してスクリプトで実装していきます。

UIの作成

Hierarchyで右クリック、「2DObject」→「Sprites」→「Square」を追加。

名前をGroundにして、スケールと色を変更、BoxCollider2Dをアタッチして地面にします。

Hierarchyで右クリック、「2DObject」→「Sprites」→「Square」を追加。

名前をWhiteBoxに変更、BoxCollider2DとRigidbody2Dをアタッチ。

コピーして白い箱を2つにします。コピーした箱は位置(Position)を変更します。

実行すると下記の様な感じに。

合体後のオブジェクト

同じくコピーして名前と色を変更。

両方ともプレハブ化してBlueBoxの方は消します。

スクリプトを作成

下記スクリプトを作成し、whiteboxにアタッチします。衝突した時に、合体後のオブジェクトを生成して元のオブジェクトを破壊します。

using UnityEngine;

public class MergeBox : MonoBehaviour
{
    [SerializeField] private GameObject BoxObject;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        if (colobj.CompareTag("MergeBox"))
        {
            Instantiate(BoxObject, transform.position, Quaternion.identity);
            Destroy(collision.gameObject);
            Destroy(gameObject);
        }
    }
}

Tagをセットして、パラメータに作成したプレハブ(合体後の青箱)をセット。

このまま実行すると、衝突した物体同士で実行してしまうので、フラグを利用して1度しか実行しないように変更。

using UnityEngine;

public class MergeBox : MonoBehaviour
{
    [SerializeField] private GameObject BoxObject;
    private bool isMergeFlag = false;

    private void OnCollisionEnter2D(Collision2D collision)
    {
        GameObject colobj = collision.gameObject;

        if (colobj.CompareTag("MergeBox"))
        {
            if (colobj.GetComponent<MergeBox>().isMergeFlag == true) return;

            isMergeFlag = true;
            Instantiate(BoxObject, transform.position, Quaternion.identity);
            Destroy(collision.gameObject);
            Destroy(gameObject);
        }
    }
}

これで衝突した時に元の物体を消して、新しい物体を生成します。

片方を消して、もう片方のスプライトを変更するって言う方法もありますね。

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