Unity エディターでの Undo 操作の登録を便利するツールを公開しました

はじめに

Unity エディターにおいて、Undo 操作の登録を簡単に行うことができるようになるツールを公開しました! 🚀

github.com

Unity Undo Extensions の使いどころ

Unity での開発では、エディター拡張を書いてメニューにオリジナルの項目を追加したり、Inspector にボタンを置いたりして、特定の操作を効率的に行えるようにするということをよくやると思います。

このとき、これらの拡張から普通に GameObject.AddComponent のようなメソッドを実行すると、Undo 操作が登録されず、Ctrl + Z などで取り消すことができません。また、オブジェクトが Dirty としてマーク*1されることもないため、Ctrl + S などで保存をすることもできません。

Undo や保存ができるようにするには、 Undo.AddComponent のような専用のメソッドを実行する必要がありますが、これらは UnityEditor 名前空間内にあるため、ビルドするとエラーになってしまいます。

これらを加味すると、以下のようなコードにすることが考えられます。

// 自身に SpriteRenderer をアタッチする
// エディター上かつ非再生時のみ、Undo 版のメソッドを使用する

using UnityEngine;
#if UNITY_EDITOR
using UnityEditor;
#endif

public class ExampleMonoBehaviour : MonoBehaviour
{
    public void ExampleButton()
    {
#if UNITY_EDITOR
        if (!EditorApplication.isPlaying)
        {
            Undo.AddComponent<SpriteRenderer>(gameObject);
        }
#endif

        gameObject.AddComponent<SpriteRenderer>();
    }
}

このようにすることで、ビルドエラーを回避しつつ Undo 登録ができるようになります……が、かなりコードが煩雑になってしまい、毎回これを書くのは結構しんどい。

そこで、Unity Undo Extensions の出番です。このパッケージを導入することで、以下のように書くことができるようになります。

using GigaCreation.Tools.UndoExtensions;
using UnityEngine;

public class ExampleMonoBehaviour : MonoBehaviour
{
    public void ExampleButton()
    {
        gameObject.AddComponentAsUndoable<SpriteRenderer>();
    }
}

AddComponentAsUndoable を使用することで、一行で書くことができるようになりました!

使い方

現在のバージョン (2.0.0) では、以下の 3 つの拡張メソッドが含まれています。

  • AddComponentAsUndoable
  • DestroyAsUndoable
  • DoActionAsUndoable

それぞれ、以下のように使用します。

using GigaCreation.Tools.UndoExtensions;
using UnityEngine;

public class ExampleMonoBehaviour : MonoBehaviour
{
    public int Counter;

    public void Example01()
    {
        // GameObject にコンポーネントをアタッチする
        // エディター上かつ非再生時のみ、Undo 操作の登録および Dirty マークを行う
        gameObject.AddComponentAsUndoable<SpriteRenderer>();
    }

    public void Example02()
    {
        if (TryGetComponent(out SpriteRenderer spriteRenderer))
        {
            // オブジェクトを破棄する
            // エディター上かつ非再生時のみ、Undo 操作の登録および Dirty マークを行う
            spriteRenderer.DestroyAsUndoable();
        }
    }

    public void Example03()
    {
        // 任意のアクションを実行する
        // エディター上かつ非再生時のみ、Undo 操作の登録および Dirty マークを行う
        this.DoActionAsUndoable("Increment Counter", x =>
        {
            x.Counter++;
        });
    }
}

DoActionAsUndoable の第 1 引数の文字列は、Undo History ウィンドウで表示されるタイトル名です。お好きな文字列で大丈夫です。

API リファレンス

英語にはなりますが、API リファレンスもございます

インストール方法

Package Manager を使用する方法

導入したい Unity プロジェクトで Package Manager を開き、「+」ボタンを押して「Add package from git URL...」を選択、以下の URL を入力して「Add」ボタンを押すとインストールできます。

https://github.com/gigacreation/UnityUndoExtensions.git?path=Assets/UndoExtensions

手動でインストールする方法

GitHub のリポジトリからソースコードをダウンロードし、その中の Assets/MissingFinder/ ディレクトリを導入したい Unity プロジェクトにコピーします。

*1:シーン名に「*」マークが付いている状態

The coloring of this site is Dracula PRO🧛🏻‍♂️
This website uses the FontAwesome icons licensed under CC BY 4.0.

2020 GIGA CREATION