ExecuteInEditModeについて
[ExecuteInEditMode]の解説
[ExecuteInEditMode] は、Unity のスクリプトで使用される属性で、以下の目的に利用されます:
主な機能
-
エディター上でスクリプトを実行可能にする
- 通常、スクリプトのライフサイクルメソッド(
Update、Startなど)は、ゲームを再生したときにのみ実行されます。 - しかし、この属性を使用すると、Unity エディターの「停止状態」でもライフサイクルメソッドが呼び出されます。
- 通常、スクリプトのライフサイクルメソッド(
-
編集モード中にリアルタイムで動作
- スクリプトの動作をエディター上で即座に確認できます。
- 例えば、ゲームオブジェ クトのプロパティを調整したり、エフェクトをプレビューする際に便利です。
使用例
1. エディターでリアルタイム調整
以下の例は、エディターでオブジェクトの位置をリアルタイムで更新するスクリプトです:
using UnityEngine;
[ExecuteInEditMode]
public class PositionUpdater : MonoBehaviour
{
public Vector3 offset;
private void Update()
{
transform.position += offset * Time.deltaTime;
}
}
- 効果:
- 「ゲーム再生」中でなくても、
offsetを変更するたびにオブジェクトが動きます。
- 「ゲーム再生」中でなくても、
2. 見た目のデバッグ
例えば、エディターで Gizmos を使ってオブジェクトの範囲やエフェクトを確認する場合:
using UnityEngine;
[ExecuteInEditMode]
public class DrawGizmos : MonoBehaviour
{
public Color gizmoColor = Color.red;
public float radius = 1.0f;
private void OnDrawGizmos()
{
Gizmos.color = gizmoColor;
Gizmos.DrawSphere(transform.position, radius);
}
}
- 効果:
- エディター上で常にスフィアが表示され、
gizmoColorやradiusを調整すると即座に反映されます。
- エディター上で常にスフィアが表示され、
注意点
-
実行中の動作との混同
- エディターでの変更が実行中の状態に影響を及ぼす可能性があります。
- 例えば、Transform を更新するスクリプトを使用すると、実行中に意図しない変更が加わる場合があります。
-
パフォーマンス
- 編集モード中でもメソッド(特に
Update)が呼び出されるため、不要な処理が多いとエディターが遅くなる可能性があります。
- 編集モード中でもメソッド(特に
-
保存されないデータ
- 編集モード中に変更したデータは、一部がシーンデータに保存されません(例えば
OnValidateを使用した場合は保存されます)。
- 編集モード中に変更したデータは、一部がシーンデータに保存されません(例えば
代替としての[ExecuteAlways]
- Unity 2019.1 以降では、
[ExecuteInEditMode]の 代替として[ExecuteAlways]を使用できます。 - 違い:
[ExecuteInEditMode]: エディター上での動作に限定。[ExecuteAlways]: エディターと実行時の両方で動作。
おすすめの使用ケース
- プロシージャル生成やレイアウト調整(例: 自動的にオブジェクトを配置)。
- エディターでのデバッグやビジュアル確認。
- 特定のエディター用カスタム挙動(実行中ではなくエディターでのみ必要なもの)。
まとめ
[ExecuteInEditMode]を使用すると、エディター内でスクリプトをリアルタイムに動作させることができます。- 便利ですが、パフォーマンスや意図しない動作に注意して使用することが重要です。
- 必要があれば、
OnValidateや[ExecuteAlways]と組み合わせるのも良い選択肢です。