Unity5では、UnityEngine.Color構造体とUnityEngine.Color32構造体があります。(公式) Color構造体は、floatを引数に取ります。Color32構造体はbyteで、0-255を引数に取ります。Color構造体は、0f~1.0fの値をれるもので、0f-255.0fの値を入れないように注意しましょう。
public Color (float r, float g, float b, float a);
public Color32 (byte r, byte g, byte b, byte a);
スクリプトで使う場合は、ColorかColor32か意識しましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
using UnityEngine; using System.Collections; using UnityEngine.EventSystems; using UnityEngine.UI; public class ChangingColor : MonoBehaviour, IPointerClickHandler { public GameObject helloworld; private Text textHellworld; private Outline textOutline; private Shadow textShadow; public Color testColor0 = new Color (1f, 0f, 0.5f, 1.0f); public Color testColor1 = new Color32 (255, 100, 5, 245); void Start () { textHellworld = helloworld.GetComponent<Text> (); textOutline = helloworld.GetComponent<Outline> (); // OutlineコンポーネントはShadowを継承したクラスなので、 // GetComponent<Shadow>()をすると、Outlineを取得してしまう。 // 以下のように配列で取得するか、 // または、Unityエディターで順序を変える(=私は未検証) textShadow = helloworld.GetComponents<Shadow> () [1]; textHellworld.color = testColor1; } public void OnPointerClick (PointerEventData eventData) { Debug.Log ("OnPointerClick"); if (textHellworld.color == testColor1) { textHellworld.color = testColor0; } else { textHellworld.color = testColor1; } textOutline.effectColor = new Color32 ((byte)Random.Range (0, 255), (byte)Random.Range (0, 255), (byte)Random.Range (0, 255), (byte)Random.Range (0, 255)); textShadow.effectColor = new Color32 ((byte)Random.Range (0, 255), (byte)Random.Range (0, 255), (byte)Random.Range (0, 255), (byte)Random.Range (0, 255)); } } |
上記は、GUIのTextの色を変更するC#スクリプトです。またOutlineコンポーネント、Shadowコンポーネントの記述もあり、Outlineもランダムで変更するようにしています。
ここで、注意ですが、UnityのColor構造体は、0f~1fの値の範囲チェックしないので、new Color(255f, 255f, 0f, 0f)などのようにも記述できてしまいます。他のプログラミング言語で似たようなColorクラスなどがあって、安易に0から255の値を入れてしまうと、コンパイルエラーは出ませんがColor構造体は、1以上を1とみなすだけなので、プログラマーの意図とは異なる挙動になってしまいます。
私は、ちゃんと確認せず、Colorは0から255を取ると思っていたので、この問題解決に結構苦労しました。
OutlineとShadowの関係
Outlineで、テキストに枠を付けることができます。またShadowで文字の影を作れます。OutlineはShadowを継承しています。そのため以下の画像のように、TextにOutlineコンポーネントとShadowコンポーネントを用意した場合は、GetComponent<Shadow>()で、取得しようとしたときに、Outlineコンポーネントが所得されるようです。
回避方法としては、GetComponents<Shadow>()で、Shadow[]を取得するか、Unityエディターで順番を入れ替えることです。(順番の入れ替えについては私は検証していませんが、おそらくできるでしょう。)
1 2 3 4 5 6 7 8 9 10 11 12 13 |
void Start () { textHellworld = helloworld.GetComponent<Text> (); textOutline = helloworld.GetComponent<Outline> (); // OutlineコンポーネントはShadowを継承したクラスなので、 // GetComponent<Shadow>()をすると、Outlineを取得してしまう。 // 以下のように配列で取得するか、 // または、Unityエディターで順序を変える(=私は未検証) textShadow = helloworld.GetComponents<Shadow> () [1]; textHellworld.color = testColor1; } |
このプロジェクトの配布
Unity5.4で作成
http://hajimete-program.com/games/SandboxChangeTextColor.zip