本記事のUnity バージョン:2022.3.4f1
はじめに
Unityでのゲーム開発やエディタツールの作成において、エディタ上でスクリプトを実行できることは非常に便利です。通常は再生モードにしなければ動かないスクリプトも、ExecuteAlways
属性を使えばエディタ上で常に実行可能になります。本記事では、ExecuteAlways
の基本的な使い方から、注意すべき点までを詳しく解説します。エディタ作業を効率化し、開発をよりスムーズに進めたい方は、ぜひ参考にしてください!
基本の考え方
通常、Unityのスクリプト(MonoBehaviour
)はゲームを再生しているときだけ実行されます。つまり、「再生モード」ではスクリプトが動作しますが、エディターでシーンを編集している「編集モード」ではスクリプトは動かないのが普通です。
ExecuteAlwaysとは?
[ExecuteAlways]
をスクリプトに追加すると、そのスクリプトは 再生モードでも編集モードでも 常に動作するようになります。例えば、エディターで何かオブジェクトを動かしたりしたときも、スクリプトが自動的に処理を行います。
使用方法
基本的な使い方
ExecuteAlways
の使い方はとてもシンプルです。スクリプトに[ExecuteAlways]
を追加するだけで、再生モード外でもスクリプトが動作します。次に、基本的な使い方のサンプルコードを見てみましょう。
サンプルコード
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways]
public class TestExecuteAlways : MonoBehaviour
{
private void Awake()
{
Debug.Log("Awake関数実行");
}
void Start()
{
Debug.Log("Start関数実行");
}
void Update()
{
Debug.Log("Update関数実行");
}
}
このコードでは、[ExecuteAlways]
属性がクラスに付与されているため、Awake(),Start(),Update()メソッドが再生モード外でも実行されます。つまり、ゲームが再生されていない状態でも、ログが表示されます。
実際に適当なゲームオブジェクトにこのスクリプトを追加してみると、それぞれの関数が実行されるようになりました。
ただし、Update関数はマイフレーム実行されるわけではなく、エディタ上で何かを編集したときに実行されます。
Update関数を常に実行させ続けるには
エディタ上でUpdateを毎フレーム実行させ続けることもできます。詳しくはこちらを参考にしてください。
編集モード中だけ実行させるには
ただし、ExecuteAlwaysを使うときは注意が必要です。再生モードと編集モードは役割が違うため、スクリプトの動作が混ざらないようにしなければいけません。例えば、プレハブモードで編集しているときに、本来ゲームの動作で使う処理が誤って実行されると、プレハブが変わってしまうかもしれません。
そのため、Application.IsPlaying
という機能を使って、「今はゲームが動いているのか、それともエディターで編集しているのか」を確認し、それに応じた動作をさせることが大切です。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways]
public class TestExecuteAlways : MonoBehaviour
{
void Update()
{
if (Application.IsPlaying(gameObject))
{
Debug.Log("再生モードでの処理実行");
}
else
{
Debug.Log("編集モードでの処理実行");
}
}
}
編集モード時は以下のログだけが現れます。
再生モードに入るとこのように再生モードでの処理が実行されます。
パフォーマンスへの影響
ExecuteAlways
を使う際には、パフォーマンスに気をつける必要があります。再生モード外でもスクリプトが実行されるため、特に重い処理を行う場合には、エディタの動作が遅くなる可能性があります。
まとめ
ExecuteAlwaysは、Unityのエディタ上でスクリプトを常に実行できる強力なツールです。これにより、再生モードに頼ることなく、スクリプトの動作を確認したりエディタツールを開発したりすることができ、開発効率が向上します。しかし、パフォーマンスに注意しつつ、適切な場面で使用することが重要です。
ポイント
[ExecuteAlways]
属性を使うと、スクリプトが再生中でも編集中でも実行される。- ただし、再生モードと編集モードを区別してスクリプトを動作させないと、予期しない変更が起こることがある。
Application.IsPlaying
を使ってゲームが再生中か確認し、それに応じた動作をさせることが大切。