夏が終わりましたが、今年も実に色のないものでした。
だからこそせめて、エディタ上くらいはカラフルにしたいものです。
今回はGUIStyle
を使って、エディタに色を付けていきましょう。
この記事にはUnity2018.2.8f1を使用しています。
.Netのバージョン設定には.Net4.x (4.6相当)を使用しています。
あらすじ
GUIStyle
を使って、テキストの色を変えてみる。GUIStyle.normal
とGUIStyle.focused
を設定してテキストの色を変える。new GUIStyle()
を使う場合は、各GUIの設定をしてあげないと体裁を保てない。EditorStyles
クラスに各GUIのデフォルトの設定があることがわかった。- だが、
EditorStyles
のプロパティをそのまま変更すると、他のGUIにも影響が出てしまった。 new GUIStyle()
に引数でEditorStyles
のプロパティを渡すことで解決した。
エディタを拡張する準備をしちゃうぞ!
以前、GUI.color
を使って、エディタの背景色を変えることにチャレンジしてみました。
www.urablog.xyz
今回はGUIStyle
を使って、エディタのテキストの色を変えてみようと思いますよー。
ではまずエディタを拡張する準備をしましょうか。
適当なコンポーネント用のスクリプトと、それのエディタを拡張するスクリプトを作っちゃいます。
TestComponent.cs
using UnityEngine; public class TestComponent : MonoBehaviour { } // class TestComponent
TestComponentEditor.cs
using UnityEngine; using UnityEditor; [CustomEditor(typeof(TestComponent))] public class TestComponentEditor : Editor { public override void OnInspectorGUI() { } } // class TestComponentEditor
GUIStyleを使っちゃうぞ!
準備が整ったので、さっそくGUIStyle
を使っていきましょう。
docs.unity3d.com
うーむ、プロパティがいっぱいあって何を使えばいいのかがわからない……。
今回はテキストの色を変えていきたいので、GUIStyle.normal
とGUIStyle.focused
あたりのプロパティを使えばいいのかな。
このプロパティのtextColor
の値をいじれば、色が変わってくれるはず、たぶん。
この設定したGUIStyle
の値を、試しにテキストフィールドで使ってみましょうか。
確か引数でGUIStyle
を指定できた気がする。
docs.unity3d.com
TestComponentEditor.cs
public override void OnInspectorGUI() { EditorGUILayout.TextField("ラベル 1", "テキスト 1"); GUIStyle style = new GUIStyle(); style.normal.textColor = Color.red; // 通常時の色 style.focused.textColor = Color.blue; // フォーカス時の色 EditorGUILayout.TextField("ラベル 2", "テキスト 2", style); }
よし、設定できたぞ!
結果を見てみよう。
何かしらね、コレ……。
うん、まあテキストの色が変わっているのは確認できるね。
ただ、ラベル1のテキストフィールドと比べてみて分かる通り、全然違うものになっちゃってるよね!
もはやこれをテキストフィールドと呼ぶわけにはいかないよね。
どうしてこんなことに……。
おそらくこれは、テキストの色の設定しかしていないから、こんなことになってしまったのだろう。
前述したとおり、GUIStyle
にはborder
などのたくさんのプロパティがあった。
これらのプロパティの値をテキストフィールド用の値に設定してあげねばならないのだろう。
な、なんと面倒くさい。
ざんねん!わたしのぼうけんは ここでおわってしまった!
EditorStylesを使っちゃうぞ!
諦めるのはまだ早い!
さすがにどこかに、各エディタGUIのデフォルトの値が用意されているに違いないんだ!
どこかなー、どこかなー。
ここだ!
EditorStyles
クラス!
docs.unity3d.com
このクラスには、各エディタGUIのデフォルトの値が用意されているのだ!
これを使えば、さきほどの問題は解決できるぞ。
テキストフィールドの場合は、textField
のプロパティを使えば良さそうだ。
TestComponentEditor.cs
public override void OnInspectorGUI() { EditorGUILayout.TextField("ラベル 1", "テキスト 1"); GUIStyle style = EditorStyles.textField; style.normal.textColor = Color.red; // 通常時の色 style.focused.textColor = Color.blue; // フォーカス時の色 EditorGUILayout.TextField("ラベル 2", "テキスト 2", style); }
よし、スクリプトができたぞ!
結果を見てみよう。
うん、うまく出来たようだ。
GUIStyle
を設定していないラベル1のテキストの色まで変わっていることを除けばな!
しかも、被害はこれだけじゃないんだよ。
このGameObjectのコンポーネント全体をみてみよう。
全てのテキストの色がーーーーー。
どうしてこんなことに……。
おそらくEditorStyles.textField
の値を直接書き換えているからだろう。
EditorStyles.textField
の値を書き換えてしまったことにより、この世(Unity)のテキストフィールドの理の全てが変わってしまったんだろう。
僕は何ということをしてしまったのか。
ざんねん!わたしのぼうけんは ここでおわってしまった!
組み合わせて使っちゃうぞ!
とりあえずEditorStyles
のプロパティを直接書き換えることが危険なことはわかった。
ではどうすればいいのか。
GUIStyle
のスクリプトリファレンスを見直すことで問題は解決できた。
そう、GUIStyle
のコンストラクタには、引数にGUIStyle
を指定するものがあるのだ。
docs.unity3d.com
このコンストラクタに、EditorStyles
のプロパティを指定してあげれば良いのではないだろうか。
試してみよう。
TestComponentEditor.cs
public override void OnInspectorGUI() { EditorGUILayout.TextField("ラベル 1", "テキスト 1"); GUIStyle style = new GUIStyle(EditorStyles.textField); style.normal.textColor = Color.red; // 通常時の色 style.focused.textColor = Color.blue; // フォーカス時の色 EditorGUILayout.TextField("ラベル 2", "テキスト 2", style); }
遂にできたぞ!
これが僕の望んでいた形だ!
長い旅だった気がする。
この調子でどんどんエディタを拡張していくぞー!
とりあえずこの部屋にある窓でも試しに割ってみようかな。
ざんねん!わたしのぼうけんは ここでおわってしまった!