Unityエディタ拡張機能でまとめて色変えする機能を作る

Unity
スポンサーリンク

こんにちは!
最近Unityゲーム開発に取り組んでいて、オブジェクトに対して一括で処理したいときがありました。
そんなときに使えるエディタ拡張機能を作ってみたのでご紹介したいと思います。

 

エディタ拡張ついて

普段Unityで開発をする場合にオブジェクトをまとめるために空オブジェクトに色々なオブジェクトぶら下げてフォルダように使っていたりします。

そして今回はそのぶら下がっている子孫「SpriteRenderer」に対して一括で色変えをしたいと思うことがあったのでエディタ拡張機能を追加してみました。

 

拡張機能の仕様

メニューの項目を追加

機能としてはメニューに項目「Sprite色の全設定」を追加。

専用ウィンドウを作成

メニューが選ばれたら専用ウィンドウを作成。

選択中のオブジェクト+子孫のSpriteRendererに色を適用

適用ボタンを押すと選択中のオブジェクト+子孫のSpriteRendererを検索して色を一括設定します。

 

 

ソースコードの内容

C#での拡張機能のクラスを記述しました。
基本的にはコピペで動くと思います。

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEditor;

public class EditorWindowAllSpriteRendererColorChange : EditorWindow
{
    public Color SetColor = Color.white;

    [MenuItem("Editor/Sprite色の全設定")]
    private static void Create()
    {
        // 生成
        GetWindow("Sprite色の全設定");
    }

    void OnGUI()
	{
		GUILayout.Label( "選択中のオブジェクト以下のSpriteRendererの色を一括設定" );

        SetColor = EditorGUILayout.ColorField("Set Color", SetColor);

        if( GUILayout.Button( "適用" ) )
        {
            if(Selection.gameObjects.Length <= 0){
                Debug.Log("GameObjectを選択していません");
            }
            else
            {
                foreach(var go in Selection.gameObjects )
                {
                    ApplyColor( SetColor, go );
                }
                Debug.Log(Selection.activeGameObject.name + "色を適用しました。");
            }
        }
    }

    // 再帰的に全設定
    private void ApplyColor( Color color, GameObject go )
    {
        SpriteRenderer spriteRenderer = go.GetComponent();
        if(spriteRenderer != null){
            Undo.RecordObject(spriteRenderer, "Change Color");
            spriteRenderer.color = new Color(color.r, color.g, color.b, color.a);
        }

        foreach ( Transform child in go.transform )
        {
            ApplyColor( color, child.gameObject );
        }
    }
}

 

Undo機能に注意!

Unityでは「編集を元に戻す」って便利な機能がありますよね。
実はこれ、自分でエディタを拡張する場合には対応を入れる必要があります
これを知らなかったので値がおかしくなったり、戻しても戻らなかったり少々手こずりました…^^;

なのでこれから拡張機能を利用される方はその点を注意してください。

基本的には下記のようにプログラムで書き換える前に「Undo.RecordObject」オブジェクトを呼び出してあげます。

Undo.RecordObject(spriteRenderer, "Change Color");
spriteRenderer.color = new Color(color.r, color.g, color.b, color.a);

※Undo.RecordObjectの引数は変更するコンポーネント、何でも良いですがわかりやすく名前をつけます

 

開発ゲームについてのPR

今回のエディタ拡張機能をするきっかけとなったゲームを現在絶賛開発中です。
YouTubeで開発ブログもしていますのでご興味のある方はぜひ見てみてくださいね。

 

最後に

今回は詳細なコーディングについては触れていませんでしたが、シンプルに同じ機能使いたい人やカスタマイズして一括変更を実現したい人に向けて記事を書きました。

こちらの情報がお役に立てば幸いです。
ではここまでお読みいただきありがとうございました。

コメント

タイトルとURLをコピーしました