こんな感じでどうでしょうか?今回の件には関係ないですが何度もアクセスするapiはキャッシュしていた方がいいのでキャッシュのコードも含めました。
C#
1using UnityEngine;
2using UnityEngine.UI;
3
4public class CheckButton : MonoBehaviour
5{
6 //ボタンをキャッシュする変数
7 Button btn;
8 bool btnChangeFlag = true;
9
10 //ここでカラーを設定
11 static readonly Color btnColor1 = Color.red;
12 static readonly Color btnColor2 = Color.blue;
13
14 void Awake()
15 {
16 //何度もアクセスするのでこの変数にキャッシュ
17 btn = gameObject.GetComponent<Button>();
18 btn.image.color = btnColor1;
19 }
20
21 void Start()
22 {
23 btn.onClick.AddListener( OnClick );
24 }
25
26 public void OnClick()
27 {
28 btnChangeFlag = !btnChangeFlag;
29 btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
30 }
31}
###インスペクタ上でカラーを設定したい場合のコード
Unityがデフォルトで用意しているカラーは使いづらいのでインスペクタ上でカラー設定できるようにするとよりイメージに近いボタンができると思います。
C#
1using UnityEngine;
2using UnityEngine.UI;
3
4public class CheckButton : MonoBehaviour
5{
6 //ここでカラーを設定
7 [SerializeField]
8 Color btnColor1 = Color.red;
9 [SerializeField]
10 Color btnColor2 = Color.blue;
11
12 //ボタンをキャッシュする変数
13 Button btn;
14 bool btnChangeFlag = true;
15
16 void Awake()
17 {
18 //何度もアクセスするのでこの変数にキャッシュ
19 btn = gameObject.GetComponent<Button>();
20 btn.image.color = btnColor1;
21 }
22
23 void Start()
24 {
25 btn.onClick.AddListener(OnClick);
26 }
27
28 public void OnClick()
29 {
30 btnChangeFlag = !btnChangeFlag;
31 btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
32 }
33}
###(おまけ) 保守の話
今回のスクリプトを使うボタンが2、3箇所でしたら問題ありませんが、数十箇所で使用する場合変更するのが面倒だったり変更漏れが出てしまう可能性もありますのでカラーを一箇所で管理する方法も検討してみてください。
[インスペクタ上でカラー設定する場合]
uiManager的なシングルトンクラスを作っておいてそこから参照するのが楽かもしれません。
[コードでカラー設定する場合]
staticなクラスをひとつ作ってそこで管理すると楽かもしれません。
###(おまけ) パフォーマンスの話
ゲームの規模にもよりますが、ひとつの機能毎にMonoBehaviourを継承したクラスを使うのは避けた方が良いかもしれません。ボタンがあるということは必ず何かの処理があると思うのでその中に今回のような処理を書くのが個人的にはおすすめです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/09/12 04:14
2017/09/12 04:17
2017/09/12 04:21
2017/09/12 04:27
2017/09/12 04:32
2017/09/12 04:33
2017/09/12 04:34
2017/09/12 04:39
2017/09/12 04:41