空のGameObjectを作成せずにスクリプトを実行する方法

2024年9月12日

Unityでシーンがロードされた直後に、空のGameObjectを作成することなくスクリプトを実行する方法を説明します。この方法では、特定の処理をGameObjectに依存せずに実行できるため、プロジェクトの管理がしやすくなる反面、スクリプトの実行タイミングや動作に注意が必要です。

背景

通常、Unityでシーン内の処理を制御する場合、GameObjectにスクリプトをアタッチして管理します。しかし、静的な処理を必要とする場面では、GameObjectを作成せずにスクリプトを実行した方が効率的です。そのために、[RuntimeInitializeOnLoadMethod]属性を使用します。この属性は、シーンがロードされたタイミングでスクリプトを自動的に実行する機能を持っています。

使用例

サンプルコード

以下のコードは、シーンがロードされた直後に実行され、Debug.Logで「ゲーム開始!」と出力します。

using UnityEngine;

public static class ExampleScript
{
    [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]
    public static void DoSomething()
    {
        Debug.Log("ゲーム開始!");
    }
}

コードの説明

  1. public static class ExampleScript:
    クラスを静的に定義することで、このクラスのインスタンス化をせずに直接メソッドを呼び出せます。
  2. [RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.AfterSceneLoad)]:
    この属性を使用すると、シーンが完全にロードされた後に指定されたメソッドが自動で呼び出されます。AfterSceneLoadはシーンロード後に実行することを意味しています。
  3. public static void DoSomething():
    このメソッドはシーンがロードされた後に呼び出され、Unityのコンソールに「ゲーム開始!」というメッセージを出力します。

実行の流れ

  1. ゲームが開始され、シーンがロードされます。
  2. RuntimeInitializeOnLoadMethodによって、DoSomethingメソッドが自動的に呼び出されます。
  3. Unityのコンソールに「ゲーム開始!」というログが出力されます。

ビルド時の動作

このコードはビルド後も同様に動作します。[RuntimeInitializeOnLoadMethod]属性はビルドされたゲームでも有効であり、Unityエディタ内と同様にシーンロード後にスクリプトが自動実行されます。

注意事項

  • このスクリプトはシーン内にGameObjectを必要としませんが、どのスクリプトがいつ実行されるかが不明瞭になりやすいため、プロジェクトが大きくなると管理が難しくなる可能性があります。
  • Debug.Logはエディタやデバッグビルドでのみ確認できることが多いため、リリースビルド時には別の手法でログを確認することが必要です。

まとめ

[RuntimeInitializeOnLoadMethod]属性を使うことで、GameObjectを使用せずにシーンロード時の処理を簡単に実行できます。この方法は特定の処理を迅速に行う際に非常に有効ですが、プロジェクト全体でのスクリプトの実行タイミングには注意が必要です。

Unity,小技

Posted by hidepon