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

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

新規登録して質問してみよう
ただいま回答率
85.48%
button

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

Unity

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

Q&A

解決済

2回答

1126閲覧

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

dasonumaso

総合スコア11

button

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

Unity

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

0グッド

0クリップ

投稿2019/06/12 16:55

現状できていること

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

C#

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4using UnityEngine.UI; 5 6public class Buttonchanger : MonoBehaviour 7{ 8 public int count=0; 9 //ここでカラーを設定 10 [SerializeField] 11 Color btnColor1 = Color.cyan; 12 [SerializeField] 13 Color btnColor2 = Color.green; 14 15 [SerializeField] 16 Color btnColor3 = Color.yellow; 17 18 //inspector上で指定するのでwhiteに仮置き 19 [SerializeField] 20 Color btnColor4 = Color.white; 21 22 [SerializeField] 23 Color btnColor5 = Color.red; 24 25 26 //ボタンをキャッシュする変数 27 Button btn; 28 29 30 void Awake() 31 { 32 //何度もアクセスするのでこの変数にキャッシュ 33 btn = gameObject.GetComponent<Button>(); 34 btn.image.color = btnColor1; 35 } 36 37 void Start() 38 { 39 btn.onClick.AddListener(OnClick); 40 } 41 42 public void OnClick() 43 { 44 count+=1; 45 if (count == 1) 46 {//greenに変更 47 btn.image.color = btnColor2; 48 Debug.Log("押されて緑になりました"); 49 } 50 51 52 if (count == 2) 53 {//黄色に変更 54 btn.image.color = btnColor3; 55 Debug.Log("押されて黄色になりました"); 56 57 } 58 59 if (count == 3) 60 {//オレンジに変更 61 btn.image.color = btnColor4; 62 Debug.Log("押されてオレンジになりました"); 63 } 64 65 if (count == 4) 66 {//赤に変更 67 btn.image.color = btnColor5; 68 Debug.Log("押されて赤になりました"); 69 70 71 } 72 } 73 74 75 76} 77

実現したいこと

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

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

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

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

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

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

guest

回答2

0

ベストアンサー

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

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

[Button01][Button02][Button03]

C#

1public void OnClick() 2{ 3 string buttonNumberStr = this.name.substring(6, 2); // クリックされたボタン名の中から、ボタン番号("01"などの2桁分)を切り出す 4 int nextButtonNumber = Convert.ToInt32(buttonNumberStr) + 1; // 隣のボタン番号を算出する 5 string nextButtonName = string.Format("Button{0:00}", nextButtonNumber); // 隣のボタン名を組み立てる 6 GameObject nextButton = GameObject.Find(nextButtonName); // 隣のボタン取得 7 8 nextButton.GetComponent<Button>().image.color = Color.red; // 隣のボタンの色を操作 9}

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

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

投稿2019/06/13 01:20

ku__ra__ge

総合スコア4524

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

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

dasonumaso

2019/06/13 07:52

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

2019/06/14 03:59

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

0

とりあえず思い付いたもの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配列がそのまま使えるのでこっちの方がオススメ)

投稿2019/06/13 01:13

sakura_hana

総合スコア11427

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問