【Unity】SetActive関数とは?オブジェクトのアクティブ状態を変更する

SetActiveとは? Unity

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

このページでは、

「UnityのSetActive関数ってどういうものなの?」

「SetActive関数の使い方が知りたい!」

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

Unityでスクリプトを使って、ゲームオブジェクトのアクティブ状態を変更するのに、SetActive関数が使われます。

アクティブ状態とは、そのオブジェクトを有効化するかどうかで、非アクティブにするとゲーム画面から表示されなくなります。

SetActive関数は、このアクティブ状態の切り替えを行うことができるメソッドになっています。

そこで、このページでは、Unityで使うことができるSetActive関数について、どんな仕様や特徴なのか、また使い方や注意点までをまとめていきます。

なお、このページでは、

Windows11
Unity Hub3.11.1
Unity6

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

この記事を書いた人

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

SetActive関数とは?

まずは、SetActive関数について、冒頭でも解説しましたが、仕様や特徴を簡単に紹介していきます。

アクティブ・非アクティブを切り替えるメソッド

SetActive関数は、オブジェクトのアクティブ状態を切り替えることができるメソッドになっています。

オブジェクトのアクティブ状態は、オブジェクトを選択した際のインスペクターウィンドウ上のチェック欄を入れているかどうかの部分で決められています。

この欄にチェックが入っていない場合は非アクティブ状態となり、ゲーム画面にそのオブジェクトが表示されず、紐づいているコンポーネントやスクリプトの処理も行われません。

SetActive関数を使うことで、このアクティブ状態を切り替えて、そのオブジェクトを表示させたり非表示にさせるといった処理を行うことができます。

非アクティブ化してDestroy関数の代わりに使われる

ゲーム内でオブジェクトを消去させたい場合に、Destroy関数の代わりとして、SetActive関数が使われることがあります。

例えば、プレイヤーが敵のオブジェクトにダメージを与えて、敵のオブジェクトを消去するなどの時です。

Destroy関数は、手軽にオブジェクトを破壊して消すことができますが、ゲーム内での負荷が大きく、何度も処理が行われる場合、ゲームが重くなる原因となってしまいます。

そこで、Destroy関数の代わりにSetActive関数を利用して、オブジェクトを非アクティブ状態にすることで、同じようにオブジェクトを表示させないでゲーム画面から消去させるということができます。

また、Destroy関数と比べてもSetActive関数は負荷が少ないため、使われていることが多い関数です。

SetActive関数の使い方

ここからは、SetActive関数の使い方についてまとめていきます。

SetActiveの前にGameObjectを指定する

SetActive関数は、オブジェクトのアクティブ状態を切り替える処理のため、SetActive関数の前でそのオブジェクトをGameObject型で指定します。

GameObject.SetActive(引数);

例えば、スクリプトを直接アタッチしているオブジェクトのアクティブ状態を変える場合は、

this.gameObject.SetActive(引数);

と、this.gameObjectという記述になります。

引数にtrueかflaseを指定してアクティブ状態を決める

SetActive関数は、引数にbool型を入れてあげることで、アクティブにするか非アクティブにするかの処理が行われます。

▼アクティブ状態にする場合

GameObject.SetActive(true);

▼非アクティブ状態にする場合

GameObject.SetActive(false);

例えば、スクリプトを直接アタッチしているオブジェクトのアクティブ状態をオフに変える場合は、

this.gameObject.SetActive(false);

と書いてあげることで、オブジェクトが非アクティブ状態に変わります。

SetActive関数の注意点

ここからは、SetActive関数を使う際の注意点をまとめていきます。

非アクティブにするとスクリプトも止まる

非アクティブ状態のオブジェクトは、紐づいているコンポーネントやスクリプトも全て非アクティブとなり動かなくなります。

例えば、オブジェクトに直接アタッチしたスクリプトの中で、SetActive関数を使って非アクティブ状態にしたとします。

そして、スクリプト内で再度そのオブジェクトをSetActive関数でアクティブ状態に変更しようとしても、スクリプト自体が動かないのでアクティブ状態に変更できません。

そのため、非アクティブ状態のオブジェクトをアクティブ状態に切り替える場合は、他のスクリプトからそのオブジェクトを取得して、アクティブ状態に切り替える処理を行う必要があります。

非アクティブのオブジェクトはFind関数で探せない

非アクティブのオブジェクトは、Find関数で探すことができない点も注意しておきましょう。

先ほどのように、別のスクリプトからオブジェクトのアクティブ状態を切り替える場合に、オブジェクト情報を取得しておく必要があります。

このオブジェクト情報を取得する際に、良く使われるのがFind関数ですが、非アクティブのオブジェクトはFind関数を使って情報を取得することができません。

そこで、非アクティブのオブジェクト情報を取得するために、スクリプト内でGameObject型の変数をpublicで宣言して、そのオブジェクト情報を代入させておくのが便利です。

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public GameObject enemy;    // publicで変数を宣言

    void Start()
    {
        enemy.SetActive(true);  // オブジェクトをアクティブにする
    }
}

上記の5行目のようにpublicでGameObject型の変数を宣言することで、インスペクターウィンドウにその変数が表示されるので、アクティブ状態を切り替えたいゲームオブジェクトをドラッグ&ドロップして直接指定することで、オブジェクト情報を取得することができます。

SetActive関数を使って、オブジェクトの表示・非表示の切り替えを繰り返したい場合は、別のスクリプトからオブジェクト情報を取得してSetActive関数を使うやり方が最適だと思います。

アクティブ状態かどうかはactiveSelfで取得する

SetActive関数で、非アクティブ状態のオブジェクトをアクティブに切り替えることができますが、そのオブジェクトがアクティブか非アクティブかを判断するのは、SetActive関数ではできません。

オブジェクトがアクティブかどうかを判定する関数として、activeSelfというメソッドを使います。

このactiveSelfは、そのゲームオブジェクトのアクティブ状態をbool型で返してくれる関数になっていて、アクティブであればtrue、非アクティブであればfalseを返します。

GameObject.activeSelf

そのため、そのオブジェクトがアクティブな場合に、SetActive関数を使って非アクティブ化したいというときは、if文を使ってactiveSelfメソッドで条件指定してあげることで、実現することができます。

まとめ

このページでは、Unityで使われるSetActive関数について、どんな仕様や特徴なのか、また使い方や注意点までをまとめていきましたが、いかがでしたでしょうか?

SetActive関数とは、オブジェクトのアクティブ状態を切り替えることができるメソッドです。

SetActive関数の引数にbool型を入れることで、そのオブジェクトのアクティブ状態のオンオフが行われます。

ただし、非アクティブのオブジェクトはスクリプトの処理も行われなくなるため、SetActive関数を繰り返す場合は、別のスクリプトから処理を行う方が良いでしょう。

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

コメント