うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】UnityEditor 上でのみカラーピッカーを表示する

UnityGUIのカラーフィールドを使うと、エディタ上ではカラーピッカーを利用できますが、プレイモード中にはカラーピッカーが使えません。

そのため、エディタ上でテストなどで簡単にカラーピッカーを使いたい場合は、別途カラーピッカーを実装する必要があります。

それを利用できるようにしたのが以下のカラーピッカーです

#if UNITY_EDITOR

using System;
using System.Reflection;
using UnityEditor;
using UnityEngine;

public static class EditorColorPickerUtility
{
    private static Type[] _methodParameters = new Type[]
    {
        typeof(Action<Color>), 
        typeof(Color), 
        typeof(bool), 
        typeof(bool)
    };
     
     private const BindingFlags _flags = BindingFlags.Static | BindingFlags.Public;
     
    public static void Show(Color baseColor, Action<Color> changeCallback, bool showAlpha = true, bool hdr = false)
    {
        EditorApplication.delayCall += () =>
        {
            var colorPickerType = typeof(EditorWindow).Assembly.GetType("UnityEditor.ColorPicker");
            
            var parameters = new object[]
            {
                changeCallback, 
                baseColor,
                showAlpha,
                hdr
            };
 
            var showMethod = colorPickerType.GetMethod("Show", _flags, null, _methodParameters, null);
            showMethod.Invoke(null, parameters);
        };
    }
}
 
#endif

クラスが pubic じゃないためリフレクションでの利用となっていますが、ボタンをクリックした際に表示することができるようになります

ColorPickerは EditorGUIから呼び出されないとSkinが存在しないため EditorGUIから呼び出されたとみなすためにEditorApplication.delayCallを利用しています