#Unity のカラーパレット
Unity で Text や Image の色を選択するときに、カラーパレットを作成・利用することができます。
(公式ドキュメントではカラープリセットライブラリと呼ばれています)
(ちなみに拡張子は .colors です)
このカラーパレットは、
User Preferences フォルダまたは Assets/Editor フォルダに配置され、
エディタ上で作業する分には問題なく使えますが、
実行時にコードからこのパレットを直接参照する、ということができません。
試しに Editor フォルダ上のものを Resources フォルダに移動させて Resources.Load() で…とやってみようとしましたが、
怒られました。
そこで、カラーパレットの情報を ScriptableObject にコピーして保持すればよいのでは? と考えました。
#カラーパレット保存用クラス
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 フォルダに置いてください。
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 にコードからアクセスすればパレットの色を使える、という感じです。