質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

button

HTMLで用いる<button>タグです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

18933閲覧

unity C#でクリック後のボタンの色を次にクリックされるまで変えたままにする

Minnie

総合スコア12

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

button

HTMLで用いる<button>タグです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

1クリップ

投稿2017/09/12 03:52

###前提・実現したいこと
unity超初心者なのですが、ボタンの色をクリックして変更したままにする、ということができなくて困っています。

例えば、元のボタン色青→(クリック)→赤でキープ→(もう一度クリック)→青でキープ→(クリック)→赤でキープ… といった感じです。

できるだけシンプルなやり方でやりたいです。

どなたか丁寧に教えていただけますでしょうか。

##試したコード
コンパイルは通りましたが、挙動に影響ありませんでした

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class CheckButton : MonoBehaviour { 7 8 public void OnClick(){ 9 10 gameObject.GetComponent<Image>().color = Color.red; 11 } 12 }

###補足情報
unity 2Dでbuttonに上記CheckButton.csをアタッチしている状況です。
Inspectorのonclick()を選択するところでno function となってしまっているので何かおかしいんだろうとは思うのですが…

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんな感じでどうでしょうか?今回の件には関係ないですが何度もアクセスする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:02

編集2017/09/12 05:02
IShix

総合スコア1729

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Minnie

2017/09/12 04:14

なるほど!こういった書き方にすればいいんですね、ありがとうございます ただ、スクリプト書き換えてみたところコンパイルは通ったのですが色は変わりませんでした> < やはりアタッチの仕方などGUI操作の方にも問題があるんでしょうか…
IShix

2017/09/12 04:17

ボタンには最初から色がついてますか? もしくは画像などを設定しまいますか?
Minnie

2017/09/12 04:21

GUIのInspectorのButton(Script)>>Normal Colorの部分は恐らくデフォルトの白になっています。画像は設定していませんm(_ _)m 丁寧にありがとうございます
IShix

2017/09/12 04:27

コード修正しました。一度こちらで試してみてください。 やったことはボタンイベントを追加してなかったので追加しました
IShix

2017/09/12 04:32

ボタンにクリックイベントを追加する方法は2種類あります。 エディタのインスペクタ上で設定する方法とAddListenerを使いスクリプトから設定する方法です。 今回はスクリプトから設定する方法を使いました。
Minnie

2017/09/12 04:33

無事やりたいとおりに挙動しました!ボタンイベントが必要なんですね、すごく助かりました、ありがとうございましたm(_ _)m
Minnie

2017/09/12 04:34

なるほど、インスペクタ上で設定する方法というのももし簡単でしたら教えていただけますでしょうか…? 度々すみませんm(_ _ )m
IShix

2017/09/12 04:39

Unityが用意しているカラーはデザインに合わせにくくないですか? ということでインスペクタ上でカラーを設定するコードも載せたので見てみてください。 かなり簡単なので色々応用効くと思います。
Minnie

2017/09/12 04:41

おかげさまでInspector上での切替も行うことができました。 とても見やすいコードで他にも応用できそうです、ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問