teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

6

修正

2017/09/12 05:02

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -37,7 +37,7 @@
37
37
 
38
38
  ###インスペクタ上でカラーを設定したい場合のコード
39
39
 
40
- Unityがデフォルトで用意しているカラーは使いづらいのでインスペクタ上で設定できるようにするとよりイメージに近いかもしれせん
40
+ Unityがデフォルトで用意しているカラーは使いづらいのでインスペクタ上でカラー設定できるようにするとよりイメージに近いボタンができると思い
41
41
 
42
42
  ```C#
43
43
  using UnityEngine;

5

説明を追記

2017/09/12 05:02

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -73,4 +73,19 @@
73
73
  btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
74
74
  }
75
75
  }
76
- ```
76
+ ```
77
+
78
+
79
+ ###(おまけ) 保守の話
80
+
81
+ 今回のスクリプトを使うボタンが2、3箇所でしたら問題ありませんが、数十箇所で使用する場合変更するのが面倒だったり変更漏れが出てしまう可能性もありますのでカラーを一箇所で管理する方法も検討してみてください。
82
+
83
+ **[インスペクタ上でカラー設定する場合]**
84
+ uiManager的なシングルトンクラスを作っておいてそこから参照するのが楽かもしれません。
85
+
86
+ **[コードでカラー設定する場合]**
87
+ staticなクラスをひとつ作ってそこで管理すると楽かもしれません。
88
+
89
+
90
+ ###(おまけ) パフォーマンスの話
91
+ ゲームの規模にもよりますが、ひとつの機能毎にMonoBehaviourを継承したクラスを使うのは避けた方が良いかもしれません。ボタンがあるということは必ず何かの処理があると思うのでその中に今回のような処理を書くのが個人的にはおすすめです。

4

コードを追記

2017/09/12 04:59

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -32,4 +32,45 @@
32
32
  btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
33
33
  }
34
34
  }
35
+ ```
36
+
37
+
38
+ ###インスペクタ上でカラーを設定したい場合のコード
39
+
40
+ Unityがデフォルトで用意しているカラーは使いづらいのでインスペクタ上で設定できるようにするとよりイメージに近いかもしれません。
41
+
42
+ ```C#
43
+ using UnityEngine;
44
+ using UnityEngine.UI;
45
+
46
+ public class CheckButton : MonoBehaviour
47
+ {
48
+ //ここでカラーを設定
49
+ [SerializeField]
50
+ Color btnColor1 = Color.red;
51
+ [SerializeField]
52
+ Color btnColor2 = Color.blue;
53
+
54
+ //ボタンをキャッシュする変数
55
+ Button btn;
56
+ bool btnChangeFlag = true;
57
+
58
+ void Awake()
59
+ {
60
+ //何度もアクセスするのでこの変数にキャッシュ
61
+ btn = gameObject.GetComponent<Button>();
62
+ btn.image.color = btnColor1;
63
+ }
64
+
65
+ void Start()
66
+ {
67
+ btn.onClick.AddListener(OnClick);
68
+ }
69
+
70
+ public void OnClick()
71
+ {
72
+ btnChangeFlag = !btnChangeFlag;
73
+ btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
74
+ }
75
+ }
35
76
  ```

3

コードを修正

2017/09/12 04:37

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -18,13 +18,12 @@
18
18
  {
19
19
  //何度もアクセスするのでこの変数にキャッシュ
20
20
  btn = gameObject.GetComponent<Button>();
21
-
21
+ btn.image.color = btnColor1;
22
22
  }
23
23
 
24
24
  void Start()
25
25
  {
26
26
  btn.onClick.AddListener( OnClick );
27
- btn.image.color = btnColor1;
28
27
  }
29
28
 
30
29
  public void OnClick()

2

必要ない部分を削除

2017/09/12 04:33

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,8 +1,6 @@
1
1
  こんな感じでどうでしょうか?今回の件には関係ないですが何度もアクセスするapiはキャッシュしていた方がいいのでキャッシュのコードも含めました。
2
2
 
3
3
  ```C#
4
- using System.Collections;
5
- using System.Collections.Generic;
6
4
  using UnityEngine;
7
5
  using UnityEngine.UI;
8
6
 

1

コードを修正

2017/09/12 04:28

投稿

IShix
IShix

スコア1729

answer CHANGED
@@ -1,7 +1,5 @@
1
1
  こんな感じでどうでしょうか?今回の件には関係ないですが何度もアクセスするapiはキャッシュしていた方がいいのでキャッシュのコードも含めました。
2
2
 
3
- ※コードは未検証です。
4
-
5
3
  ```C#
6
4
  using System.Collections;
7
5
  using System.Collections.Generic;
@@ -10,20 +8,31 @@
10
8
 
11
9
  public class CheckButton : MonoBehaviour
12
10
  {
13
- //何度もアクセスするのでこの変数にキャッシュ
11
+ //ボタンをキャッシュする変数
14
- Image btnImgRender;
12
+ Button btn;
15
- bool btnChangeFlag;
13
+ bool btnChangeFlag = true;
16
14
 
15
+ //ここでカラーを設定
16
+ static readonly Color btnColor1 = Color.red;
17
+ static readonly Color btnColor2 = Color.blue;
18
+
17
- void Awake()
19
+ void Awake()
20
+ {
21
+ //何度もアクセスするのでこの変数にキャッシュ
22
+ btn = gameObject.GetComponent<Button>();
23
+
24
+ }
25
+
26
+ void Start()
18
27
  {
19
- //何度もアクセスするのでこの変数にキャッシュ
20
- btnImgRender = gameObject.GetComponent<Image>();
28
+ btn.onClick.AddListener( OnClick );
29
+ btn.image.color = btnColor1;
21
30
  }
22
31
 
23
32
  public void OnClick()
24
33
  {
25
34
  btnChangeFlag = !btnChangeFlag;
26
- btnImgRender.color = btnChangeFlag ? Color.red : Color.blue;
35
+ btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
27
36
  }
28
37
  }
29
38
  ```