再生モード不要!Unityエディタでスクリプトを実行するExecuteAlwaysの使い方

【PR】Unityアセットストアセール開催中!

9月18日 23:59までサプライズセールが開催中です!200以上のアセットが50%オフとなっています。
クーポンコード「SEP10BER」でさらに10%オフ!
セール対象アセットはこちら

セール対象アセット例「Grasslands – Stylized Nature

本記事の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を毎フレーム実行させ続けることもできます。詳しくはこちらを参考にしてください。

UnityEditor上でGameObjectをUpdateさせる方法 - Qiita
はじめにクラスにExecuteAlways属性をつければ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を使ってゲームが再生中か確認し、それに応じた動作をさせることが大切。
タイトルとURLをコピーしました