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

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

ただいまの
回答率

90.86%

  • C#

    6244questions

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

  • Unity

    3368questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1127questions

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

  • Unity2D

    687questions

  • button

    71questions

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

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

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 1,982

Minnie

score 4

前提・実現したいこと

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

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

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

どなたか丁寧におしえていた

試したコード

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

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class CheckButton : MonoBehaviour {

    public void OnClick(){

        gameObject.GetComponent<Image>().color = Color.red;
    }
    }

補足情報

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

こんな感じでどうでしょうか?今回の件には関係ないですが何度もアクセスするapiはキャッシュしていた方がいいのでキャッシュのコードも含めました。

using UnityEngine;
using UnityEngine.UI;

public class CheckButton : MonoBehaviour
{
    //ボタンをキャッシュする変数
    Button btn;
    bool btnChangeFlag = true;

    //ここでカラーを設定
    static readonly Color btnColor1 = Color.red;
    static readonly Color btnColor2 = Color.blue;

    void Awake()
    {
        //何度もアクセスするのでこの変数にキャッシュ
        btn = gameObject.GetComponent<Button>();
        btn.image.color = btnColor1;
    }

    void Start()
    {
        btn.onClick.AddListener( OnClick );
    }

    public void OnClick()
    {
        btnChangeFlag = !btnChangeFlag;
        btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
    }
}

インスペクタ上でカラーを設定したい場合のコード

Unityがデフォルトで用意しているカラーは使いづらいのでインスペクタ上でカラー設定できるようにするとよりイメージに近いボタンができると思います。

using UnityEngine;
using UnityEngine.UI;

public class CheckButton : MonoBehaviour
{
    //ここでカラーを設定
    [SerializeField]
    Color btnColor1 = Color.red;
    [SerializeField]
    Color btnColor2 = Color.blue;

    //ボタンをキャッシュする変数
    Button btn;
    bool btnChangeFlag = true;

    void Awake()
    {
        //何度もアクセスするのでこの変数にキャッシュ
        btn = gameObject.GetComponent<Button>();
        btn.image.color = btnColor1;
    }

    void Start()
    {
        btn.onClick.AddListener(OnClick);
    }

    public void OnClick()
    {
        btnChangeFlag = !btnChangeFlag;
        btn.image.color = btnChangeFlag ? btnColor1 : btnColor2;
    }
}

(おまけ) 保守の話

今回のスクリプトを使うボタンが2、3箇所でしたら問題ありませんが、数十箇所で使用する場合変更するのが面倒だったり変更漏れが出てしまう可能性もありますのでカラーを一箇所で管理する方法も検討してみてください。

[インスペクタ上でカラー設定する場合]
uiManager的なシングルトンクラスを作っておいてそこから参照するのが楽かもしれません。

[コードでカラー設定する場合]
staticなクラスをひとつ作ってそこで管理すると楽かもしれません。

(おまけ) パフォーマンスの話

ゲームの規模にもよりますが、ひとつの機能毎にMonoBehaviourを継承したクラスを使うのは避けた方が良いかもしれません。ボタンがあるということは必ず何かの処理があると思うのでその中に今回のような処理を書くのが個人的にはおすすめです。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 13:14

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

    キャンセル

  • 2017/09/12 13:17

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

    キャンセル

  • 2017/09/12 13:21

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

    キャンセル

  • 2017/09/12 13:27

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

    キャンセル

  • 2017/09/12 13:32

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

    キャンセル

  • 2017/09/12 13:33

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

    キャンセル

  • 2017/09/12 13:34

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

    キャンセル

  • 2017/09/12 13:39

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

    キャンセル

  • 2017/09/12 13:41

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

    キャンセル

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

  • ただいまの回答率 90.86%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • C#

    6244questions

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

  • Unity

    3368questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

  • Unity3D

    1127questions

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

  • Unity2D

    687questions

  • button

    71questions

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