【Unity】DefaultExcutionOrderでスクリプトの実行順を制御する
はじめに
こんにちは、まつさこ です。
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