メインコンテンツまでスキップ

ExecuteInEditModeについて

[ExecuteInEditMode]の解説

[ExecuteInEditMode] は、Unity のスクリプトで使用される属性で、以下の目的に利用されます:


主な機能

  1. エディター上でスクリプトを実行可能にする

    • 通常、スクリプトのライフサイクルメソッド(UpdateStart など)は、ゲームを再生したときにのみ実行されます。
    • しかし、この属性を使用すると、Unity エディターの「停止状態」でもライフサイクルメソッドが呼び出されます。
  2. 編集モード中にリアルタイムで動作

    • スクリプトの動作をエディター上で即座に確認できます。
    • 例えば、ゲームオブジェクトのプロパティを調整したり、エフェクトをプレビューする際に便利です。

使用例

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);
}
}
  • 効果:
    • エディター上で常にスフィアが表示され、gizmoColorradius を調整すると即座に反映されます。

注意点

  1. 実行中の動作との混同

    • エディターでの変更が実行中の状態に影響を及ぼす可能性があります。
    • 例えば、Transform を更新するスクリプトを使用すると、実行中に意図しない変更が加わる場合があります。
  2. パフォーマンス

    • 編集モード中でもメソッド(特に Update)が呼び出されるため、不要な処理が多いとエディターが遅くなる可能性があります。
  3. 保存されないデータ

    • 編集モード中に変更したデータは、一部がシーンデータに保存されません(例えば OnValidate を使用した場合は保存されます)。

代替としての[ExecuteAlways]

  • Unity 2019.1 以降では、[ExecuteInEditMode] の代替として [ExecuteAlways] を使用できます。
  • 違い:
    • [ExecuteInEditMode]: エディター上での動作に限定。
    • [ExecuteAlways]: エディターと実行時の両方で動作。

おすすめの使用ケース

  • プロシージャル生成やレイアウト調整(例: 自動的にオブジェクトを配置)。
  • エディターでのデバッグやビジュアル確認。
  • 特定のエディター用カスタム挙動(実行中ではなくエディターでのみ必要なもの)。

まとめ

  • [ExecuteInEditMode] を使用すると、エディター内でスクリプトをリアルタイムに動作させることができます。
  • 便利ですが、パフォーマンスや意図しない動作に注意して使用することが重要です。
  • 必要があれば、OnValidate[ExecuteAlways] と組み合わせるのも良い選択肢です。