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

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

ただいまの
回答率

88.22%

unityでbuttonを使って隣り合うbuttonの色変えをしたい

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 849

dasonumaso

score 11

現状できていること

現在buttonを使った処理の練習をしています。現在ButtonにC#を用いた下記のButtonchangerスクリプトをアタッチしておりButtonを押すごとに押したButton自身の色を水色(初期の色)→緑→黄色→オレンジ→赤というように変更するところまではできています。

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

public class Buttonchanger : MonoBehaviour
{
    public int count=0;
    //ここでカラーを設定
    [SerializeField]
    Color btnColor1 = Color.cyan;
    [SerializeField]
    Color btnColor2 = Color.green;

    [SerializeField]
    Color btnColor3 = Color.yellow;

    //inspector上で指定するのでwhiteに仮置き
    [SerializeField]
    Color btnColor4 = Color.white;

    [SerializeField]
    Color btnColor5 = Color.red;


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


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

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

    public void OnClick()
    {
        count+=1;
        if (count == 1)
        {//greenに変更
            btn.image.color = btnColor2;
            Debug.Log("押されて緑になりました");
        }


        if (count == 2)
        {//黄色に変更
            btn.image.color = btnColor3;
            Debug.Log("押されて黄色になりました");

        }

        if (count == 3)
        {//オレンジに変更
            btn.image.color = btnColor4;
            Debug.Log("押されてオレンジになりました");
        }

        if (count == 4)
        {//赤に変更
            btn.image.color = btnColor5;
            Debug.Log("押されて赤になりました");


        }
    }



}

実現したいこと

このButtonを複数個用意して塗り替えパズルのようなものを作りたいと思っています。
このButtonを6×6マス配置して、適当なButtonを一回押したときは押したButtonだけcountを+1して色が緑に、同じButtonをもう一度押して緑から黄色にするとき、今度はそのButtonだけじゃなく両隣のButtonのcountを+1して自身は黄色に両隣は緑に、さらに黄色の時にもう一度おしたときは左右に加えて上下のButtonのcountを+1して色を変え、自身はオレンジに、オレンジの時にButtonを押したときは上下左右にくわえて斜め方向、つまり押すボタンの周りすべての色を一段階変える。といった処理をしたいと思っています。とても分かりにくい説明になってしまい申し訳ないのですが実現のための解決法やアドバイスを簡単な解説も踏まえて教えていただけたらありがたいです。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 2

checkベストアンサー

+1

ボタンの名前に規則性をもたせて、ボタン名から「隣のボタン」を取得するという方法はどうでしょうか。
this.nameでクリックされたオブジェクト名を取得し、そこから「隣のボタンの名前」を求めてからGameObject.Find(オブジェクト名)で指定した名前のゲームオブジェクトを取得すれば、隣のbuttonを操作することができます。

話を単純にするために、以下のようにボタンを3つだけ置いた場合の例を書くと、以下のようになります。

[Button01][Button02][Button03]
public void OnClick()
{
    string buttonNumberStr = this.name.substring(6, 2);                      // クリックされたボタン名の中から、ボタン番号("01"などの2桁分)を切り出す
    int nextButtonNumber = Convert.ToInt32(buttonNumberStr) + 1;             // 隣のボタン番号を算出する
    string nextButtonName = string.Format("Button{0:00}", nextButtonNumber); // 隣のボタン名を組み立てる
    GameObject nextButton = GameObject.Find(nextButtonName);                 // 隣のボタン取得

    nextButton.GetComponent<Button>().image.color = Color.red;               // 隣のボタンの色を操作
}

あとは細かい条件によって行いたい処理を分けていけばいいと思います。
また左右だけでなく上下にもボタンを並べてそれを取得したい場合は、以下例のようなボタン名で配置すればよいでしょう。

[Button01_01][Button01_02][Button01_03]
[Button02_01][Button02_02][Button02_03]
[Button03_01][Button03_02][Button03_03]

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2019/06/13 16:52

    わかりやすく教えていただきありがとうございます。ひとまず上記のように設定してとなりのButtonの色を変えることには成功しました。上記のスクリプトで隣のButtonのButtonchangerスクリプトを呼び出してその中のcountを+1すれば実現できそうなのですが、そうしたい場合どう書けばいいか教えていただけませんか?

    キャンセル

  • 2019/06/14 12:59

    そのボタンにアタッチされているButtonchangerコンポーネントはButtonコンポーネントと同様に`var changer = ボタンGameObject.GetComponent<Buttonchanger>();`で取れます。
    あとは`changer.count += 1;`でcountを1増加できます。ただ、当然count変数を+1するだけでは表示は何も変わりませんので`changer.OnClick();`のように色を変えるところまでまとめて処理をしているメソッドを呼び出すのが良いと思います。

    キャンセル

+1

とりあえず思い付いたもの2案。


方法1:「左右位置にあるButtonchanger」という参照を持つ。
public Buttonchanger[] leftRights;という変数を作っておき、左右に位置するボタンに付いているButtonchangerコンポーネントをインスペクターから追加。
+1したい時はforeach (item in leftRights) { item.OnClick(); }などとする。

上下や斜めについても同様に「上下位置にあるButtonchanger」「斜め位置にあるButtonchanger」の配列を作り、条件分岐しつつ同じ要領で+1用メソッドを呼ぶ。


方法2:「管理用スクリプト」を作る。
ゲーム内に1つだけ存在するスクリプト(仮にGameControllerとする)を作って、そこで管理する。
そこにpublic Buttonchanger[] buttons;という配列を作り、インスペクターから各ボタンに付いているButtonchangerコンポーネントを順番に入れる。

ボタンが押された時にGameControllerの適当なメソッドを呼び出し、
「今押されたGameController」と「それが何番目であるか」を取得。
(ボタン押下時に自身のIDを渡す、Buttonchangerを引数として渡してArray.IndexOfで求める、など)

更に必要に応じて上下左右斜めのボタンを求める。
(配列なので0スタートとして、今押されたボタンが「8」だとすると、左右は「7・9」、上下は「2・14」斜めは「1・3・13・15」だと計算+端の場合の条件分岐のみで求められる)

あとは求めたボタンの色変えメソッドを呼ぶ。

(「全ての色が赤になったらクリア」みたいな全ボタンに対する判定があるなら、buttons配列がそのまま使えるのでこっちの方がオススメ)

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

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