【Unity】Destroy関数とは?オブジェクトを破壊するメソッド

Destroy関数の使い方 Unity

こんにちは、ともくんのゲーム作り部屋にようこそ!

このページでは、

「UnityのDestroy関数ってなに?」

「Destroy関数を使うとどうなるの?」

というお悩みの方に向けた内容となっています。

UnityでDestroy関数を使うと、オブジェクトやコンポーネントを破壊することができます。

例えば、敵を倒した際に、その敵を消す必要がありますが、その際にDestroy関数を使うと消去することができます。

Destroy関数は非常に簡単に使用できる半面、少し負荷がかかる処理のある関数となっています。

そこで、このページでは、Destroy関数がどのような関数なのか、使い方や注意点までをまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.0
Unity6

のバージョンで解説しています。

この記事を書いた人

ゲーム作りを学び始めた一児のパパです。
このブログは、子供から「ゲームを作ってみたい!」と言われ、非プログラマーでゲーム作りをしたことない僕が、ゲーム作りの本を読んで独学でゲーム開発を学んでいるブログです。
同じように初めてゲーム作りをしている方と一緒に学んでいけるようなブログに出来たらいいなと思っています。
また、「このコードはおかしい」とか「もっと良い書き方があるよ!」などあれば、どんどん指摘して頂けると助かります。

Destroy関数とは?

まずは、Destroy関数がどういったものなのか、紹介していきます。

オブジェクトを破壊する処理を行う

Destroy関数とは、オブジェクトを破壊する処理を行うメソッドになっています。

具体的には、オブジェクトとそのオブジェクトを親としている子オブジェクトが、すべて消去されることになります。

例えば、スペースキーを押すとDestroy関数で親オブジェクトを破壊するようにした場合、以下のように一瞬でそのオブジェクトと子オブジェクトが消去され、オブジェクトに関するものは何も残らなくなります。

そのため、Destroy関数を使う際は、その後使うことのないオブジェクトに対して破壊するようにしましょう。

コンポーネントの削除もできる

先ほど、Destroy関数がオブジェクトを破壊できると書きましたが、実はコンポーネントを破壊することもできます。

例えば、オブジェクトに対してRigidbody2Dコンポーネントをつけていた場合、Destroy関数で以下のようにそのコンポーネントだけを消去することができます。

あまり使用する機会の少ない使い方ですが、Destroy関数はコンポーネントも削除できると覚えておきましょう。

Destroy関数の使い方

ここからは、実際にDestroy関数の使い方を紹介していきます。

引数に破壊したいオブジェクトを指定する

Destroy関数は、引数にオブジェクトを指定することで、そのオブジェクトを破壊してくれます。

Destroy(破壊したいオブジェクト);

オブジェクトを指定する際は、GameObject型で指定します。

例えば、自分自身のオブジェクトを破壊したい場合は、

using UnityEngine;

public class Test : MonoBehaviour
{    
    void Start()
    {
        Destroy(this.gameObject); // 自分自身を破壊する
    }

}

と書くだけで、ゲーム実行とともにそのオブジェクトを破壊することができます。

また、他のオブジェクトを破壊させたい場合は、

using UnityEngine;

public class Test : MonoBehaviour
{    
    GameObject square;  // GameObject型の変数を作成

    void Start()
    {
        square = GameObject.Find("Square"); // 変数にオブジェクトを代入する
        Destroy(square); // 指定したオブジェクトを破壊する
    }
}

のように書いてあげれば、指定したオブジェクトが破壊されます。

コンポーネントを指定して破壊できる

Destroy関数は、コンポーネントを破壊することもでき、その際は引数にコンポーネントを指定してあげます。

Destroy(破壊したいコンポーネント);

例えば、オブジェクトに付いているRigidbody2Dコンポーネントを消去したい場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    Rigidbody2D component;  // コンポーネントの変数を宣言
    
    void Start()
    {
        component = GetComponent<Rigidbody2D>();    // Rigidbody2Dコンポーネントを取得
        Destroy(component); // コンポーネントを破壊する
    }

}

のように書いてあげることで、そのオブジェクトのRigidbody2Dコンポーネントが、ゲーム開始とともに削除されます。

第二引数で遅延させることができる

Destroy関数は、引数に破壊したいオブジェクトを指定した後に、第二引数として破壊までの時間を設定することができます。

Destroy(破壊したいオブジェクト, 破壊するまでの時間);

破壊するまでの時間は、float型秒数を設定することになります。

例えば、自分自身を3秒後に破壊したいとする場合、

using UnityEngine;

public class Test : MonoBehaviour
{
    void Start()
    {
        Destroy(this.gameObject, 3.0f); // 自分自身を3秒後に破壊する
    }
}

というスクリプトを付けてあげることで、ゲーム実行後3秒経過したらオブジェクトが破壊されます。

Destroy関数はそのままだと、すぐに消去されるため、遅延させたい場合は設定しておきましょう。

Destroy関数の注意点

ここからは、Destroy関数を使用する際の注意点を紹介していきます。

自分自身の破壊は「this.gameObject」

この記事内でも何度か出てきていますが、自分自身のオブジェクトを破壊する場合は、

Destroy(this.gameObject);

と書きます。

このthisは、自分自身のインスタンスを指すキーワードですが、

Destroy(this);

としてしまうと、そのスクリプトのことを指しているため、オブジェクト自体を削除することはできません。

スクリプトがアタッチされているオブジェクトを破壊したいので、「this.gameObject」と指定します。

処理の負荷が重い・大きい

Destroy関数は、オブジェクトを消去する処理を行いますが、実は一つ欠点があります。

この消去という処理の負荷が大きく、ゲームパフォーマンスに影響する場合があります。

そこで、ゲームパフォーマンスを上げるために、Destroy関数の代わりにSetActive関数を使うことがあります。

このSetActive関数とは、オブジェクトを削除するのではなく、非アクティブ状態に変更して、オブジェクトを表示させなくさせる処理を行います。

ゲーム画面上では、消去されたように見えますが、実際には残っていて、再度アクティブ状態に変更することで、オブジェクトを復活させることもできます。

そのため、ある程度規模の大きいゲームで、パフォーマンスを考えていく場合は、SetActive関数を使用していくほうがよさそうです。

まとめ

このページでは、Destroy関数についてどんな処理をするのか、また使い方や注意点までを紹介していきましたが、いかがでしたでしょうか?

Destroy関数は、オブジェクトやコンポーネントを破壊することができるメソッドです。

倒した敵や画面外のオブジェクトを破壊するなどといった際に、簡単に消去することができる関数です。

ただ、Destroy関数は負荷も大きくゲームパフォーマンスに影響することがあるため、使いすぎには注意しておきましょう。

最後までお読みいただきまして、ありがとうございました!

コメント