Categories: Unity

Unity:スクリプトコンポーネントを有効、無効化と実行される関数について

今回は、[Inspector]ウィンドウでスクリプコンポーネントのチェックボックスをオフにして無効化した場合でも関数が実行される。ということがあったので調べてみることにしました。

スクリプトの関数はコンポーネントを無効化しても実行されるのか?

スクリプトコンポーネントをオブジェクトにアタッチした際に、チェックボックスが表示される場合と無い場合があります。まずはそのあたりから調べてみることにしました。

公式リファレンスを調べてみる

Unity公式リファレンス: Version5.4 のMonoBehaviour – Unity スクリプトリファレンス には次のように書かれています。

注意: MonoBehaviour を無効化するチェックボックス(エディター上)により Start()、Awake()、Update()、FixedUpdate()、および OnGUI() が実行されなくなります。 もし、これらのいずれも存在しない場合はチェックボックス自体が表示されません。

関数ごとにスクリプトを作成

公式リファレンスに書かれていた関数(Start()、Awake()、Update()、FixedUpdate()、OnGUI() )を使ったスクリプトを作成。それから比較のために、イベント系関数(OnCollisionEnter()、OnTriggerEnter())のスクリプトも追加しました。

作成したスクリプトを新しいシーンのカメラに割り当てて[Inspector]ウィンドウを確認してみました。
“Script_Awake”コンポーネントにチェックボックスがありませんね。

Unity公式リファレンス: 2017.3 を確認

使用しているUnityのバージョンが2017.3なのでUnity公式リファレンス: 2017.3 を確認してみました。
MonoBehaviour – Unity スクリプトリファレンス
説明文が英語のままですが、チェックボックスが表示される関数が下記のように変更されています。

Start()、Update()、FixedUpdate()、LateUpdate()、OnGUI()、OnDisable()、OnEnable()

というわけで公式リファレンス: Version5.4と2017.3 を比較すると、Awake() が無くなり、LateUpdate()、OnDisable()、OnEnable() が追加されています。念のため実際にスクリプトを作成して確認してみました。追加したスクリプトコンポーネントにはちゃんとチェックボックスが表示されています。

Awake()関数とStart()関数を使用したスクリプトファイルの場合

コンポーネントにチェックボックスが表示されないAwake()関数と、チェックボックスが表示されるStart()関数の両方を使用したスクリプトを作成して確認してみました。

ゲーム再生時にAwake()関数が実行されるか確認するためにコンソール画面にメッセージを表示する処理を書きました。スクリプトは下記の通りです。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Script_Awake_Start : MonoBehaviour
{
    void Awake()
    {
        print("Awake()関数が実行された!");
    }

    void Start()
    {
        print("Start()関数が実行された!");
    }
}

動作確認

新しくシーンを作成してカメラオブジェクトにスクリプト”Script_Awake_Start”をアタッチ。

コンポーネントにチェックが入った状態でゲームを再生すると[Console]ウィンドウに次のようにメッセージが表示されます。

次にコンポーネントのチェックを外して無効化してからゲームを再生します。

[Console]ウィンドウにはAwake()関数の処理だけが実行されて次のようにメッセージが表示されます。

まとめると

というわけで、ここまでの流れで分かったのは次の通りです。

Start()、Update()、FixedUpdate()、LateUpdate()、OnGUI()、OnDisable()、OnEnable()関数が含まれるスクリプトは[Inspector]ウィンドウのコンポーネントパネルに無効化するチェックボックスが表示される。

コンポーネントを無効化してもスクリプトに書かれている他の関数は実行される。

…ということですね。大事なことはちゃんと公式リファレンスに書いてあるというお話でした。

参考サイト

今回の記事を書くにあたり、下記のブログを参考にさせていただきました!
Unity SetActiveとenabledどっちを使うべきかの考察 – 渋谷ほととぎす通信

今日の一言

画像素材:フリー写真素材ぱくたそ

corevale