LoginSignup
1
1

More than 5 years have passed since last update.

【Unity】カラーパレットをコードから使いたい

Posted at

Unity のカラーパレット

Unity で Text や Image の色を選択するときに、カラーパレットを作成・利用することができます。
(公式ドキュメントではカラープリセットライブラリと呼ばれています)
(ちなみに拡張子は .colors です)

プリセットライブラリ - Unity マニュアル

このカラーパレットは、
User Preferences フォルダまたは Assets/Editor フォルダに配置され、
エディタ上で作業する分には問題なく使えますが、
実行時にコードからこのパレットを直接参照する、ということができません。
試しに Editor フォルダ上のものを Resources フォルダに移動させて Resources.Load() で…とやってみようとしましたが、
怒られました。

そこで、カラーパレットの情報を ScriptableObject にコピーして保持すればよいのでは? と考えました。

カラーパレット保存用クラス

ColorPallet.cs
using UnityEngine;
using System;
using System.Collections.Generic;

public class ColorPallet : ScriptableObject {
    [Serializable]
    public class Pallet
    {
        public string name;
        public Color color;
    }

    public List<Pallet> list = new List<Pallet>();

    //---------------------------------------------------
    // パレットから色を取得
    //---------------------------------------------------
    public Color Get(string name)
    {
        var data = list.Find(x => x.name == name);
        if (data != null)
        {
            return data.color;
        }
        return Color.white;
    }
}

色とそれに対応する文字列を格納すると想定し、
その文字列で色を取得できるようにしてみました。

ScriptableObject 作成用クラス

↓このファイルは Editor フォルダに置いてください。

ColorPalletCreator.cs
using UnityEditor;
using UnityEngine;

public static class ColorPalletCreator {
    const string DST_PATH = "Assets/ScriptableObjects/ColorPallet.asset";
    const string ORG_PATH = "Assets/Editor/ColorPallet.colors";

    //---------------------------------------------------
    // ScriptableObject 作成
    //---------------------------------------------------
    [MenuItem("Tool/Create ColorPallet")]
    static void Create()
    {
        ColorPallet asset = AssetDatabase.LoadAssetAtPath<ColorPallet>(DST_PATH);
        if (asset == null)
        {
            asset = ScriptableObject.CreateInstance<ColorPallet>();
            AssetDatabase.CreateAsset(asset, DST_PATH);
        }

        var presetObj = AssetDatabase.LoadAssetAtPath<UnityEngine.Object>(ORG_PATH);
        var so = new SerializedObject(presetObj);
        var property = so.FindProperty("m_Presets");
        for (int ii = 0; ii < property.arraySize; ++ii)
        {
            // カラーパレットからデータを取得
            var element = property.GetArrayElementAtIndex(ii);
            var data = new ColorPallet.Pallet()
            {
                name = "Color_" + ii,
                color = element.FindPropertyRelative("m_Color").colorValue
            };

            // ScriptableObject にデータを格納
            asset.list.Add(data);
        }
    }
}

これで Unity のメニューバーから Tool > Create ColorPallet を選択すると、
Editor フォルダ内のカラーパレット ColorPallet.colors を元にして ScriptableObjects フォルダに ScriptableObject の ColorPallet.asset を作成します。

あとはこの ScriptableObject にコードからアクセスすればパレットの色を使える、という感じです。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1