📏

【Unity】DefaultExcutionOrderでスクリプトの実行順を制御する

2023/03/28に公開

はじめに

こんにちは、まつさこ です。

Unityでは、スクリプトの実行順を制御することで、ゲーム開発における柔軟性が向上します。この記事では、DefaultExecutionOrderを用いてスクリプトの実行順序を制御する方法について説明します。また、ProjectSettingsのScriptExecutionOrder設定との違いや共通点についても言及します。

開発環境

筆者の開発環境は以下です。

  • Unity 2021.3.5f1
  • Rider 2022.2.3

DefaultExecutionOrderが有効的な場面

DefaultExecutionOrderは、特定のスクリプトが他のスクリプトよりも先に実行されることを保証するための属性(Attribute)です。これは、他のスクリプトが依存している値や機能を持つスクリプトに対して有効です。以下のような場面で効果的に使用できます。

  • 初期化処理が他のスクリプトに影響を与える場合
  • シングルトンパターンを利用したマネージャークラスが存在し、他のスクリプトがそのインスタンスを利用する場合
  • 他のスクリプトが参照するデータを持つスクリプトがあり、そのデータが更新される前に参照されることを防ぐ場合

ProjectSettingsのScriptExecutionOrder設定との違い、共通点

DefaultExecutionOrderとProjectSettingsのScriptExecutionOrder設定は、どちらもスクリプトの実行順を制御する方法ですが、いくつかの違いがあります。

  • DefaultExecutionOrderはスクリプト内で直接指定するため、プロジェクト内のどのシーンでも同じ実行順が保証されます。
  • ScriptExecutionOrder設定は、ProjectSettings内で一元的に管理するため、複数のスクリプトの実行順を一覧で確認できます。

共通点としては、どちらも実行順序に数字を割り当てることで制御し、小さい数字ほど先に実行されることが保証されます。

実装例

C#コードを使って、DefaultExecutionOrderの使い方を示します。

using UnityEngine;

[DefaultExecutionOrder(-100)]
public class ManagerScript : MonoBehaviour
{
    public static ManagerScript Instance { get; private set; }

    private void Awake()
    {
        if (Instance == null)
        {
            Instance = this;
        }
        else
        {
           
            Destroy(gameObject);
        }
    }
}

[DefaultExecutionOrder(0)]
public class NormalScript : MonoBehaviour
{
    private ManagerScript _managerScript;

    private void Start()
    {
        _managerScript = ManagerScript.Instance;
        // Do something with _managerScript
    }
}

この例では、シングルトンクラスである ManagerScript が他のスクリプトよりも先に実行されることを保証するために、
DefaultExecutionOrder(-100) を設定しています。また、NormalScript はデフォルトの実行順序(0)で実行されます。これにより、NormalScript 内で ManagerScript のインスタンスを正常に取得できます。

まとめ

この記事では、DefaultExecutionOrderを用いてUnityのスクリプトの実行順序を制御する方法を説明しました。また、ProjectSettingsのScriptExecutionOrder設定との違いや共通点についても触れました。
この知識を活用し、スムーズなUnityゲーム開発を進めましょう!

読んでくださりありがとうございました🤗

Discussion