皆様ライツアウトはご存じでしょうか。
ボタンを押すと上下左右のボタンも点灯・消灯が切り替わるパズルゲームです。
今回はこのライツアウトを本当に簡単にですが作ってみました。
とりあえず全体のコードを貼り付けます。
簡単に説明を。
//ボタンの色を変える void Start() { //buttonを入れた親オブジェクトを取得 GameObject area = GameObject.FindGameObjectWithTag("area"); //buttonを入れるlist buttons = new List<GameObject>(); //listに1個ずつボタンを加える for (int i = 0; i < area.transform.childCount; i++) { //Getchild(0),Getchild(1)…とGameObjectをリスト化 buttons.Add(area.transform.GetChild(i).gameObject); } //ボタンの消灯・転倒を判断するbool,ボタンと同じ数だけほしいのでListの数を取得する.Countを使う lightOn = new bool[buttons.Count]; //ボタンの点灯消灯bool初期化と、それぞれのボタンのゲームオブジェクトに,クリックしたときに行う自前のメソッドをaddlistnerで取り付け for (int i = 0; i < buttons.Count; i++) { //すべてのボタンを消灯 lightOn[i] = false; buttons[i].AddComponent<Button>(); //引数付きAddListenerについてのやり方 var count = i; buttons[i].GetComponent<Button>().onClick.AddListener(() => Push_Button(count)); // ローカル変数を引数にする } }
startでやりたかったことはライツアウトのボタンの部分。 まず3x3の9マスのボタンをグリッドレイアウトの機能で整列しておきます。 スクリプトのほうで、1番目のボタンから9番目のボタンまで 各ボタンに必要な機能を与えることが目的です。 (左上の1番目のボタンを押すと上の2番目のボタンも反応するなど) そこでFindGameObjectWithTagでbuttonの元になるimageを入れた親オブジェクトを取得し、 その子オブジェクトであるimageをGetchild(i)で1番目から順番にList buttonsに加えていきます。 これで以下のように画像をリスト化しました この順番に番号を振る方法はこちらの記事を参考にしています。
ここから1番目の画像にはAddComponentButton()でボタンのコンポーネントをアタッチ、 onClick.AddListener(=> Push_Button(count))でボタンをクリック時に自作メソッドPush_Buttonを行うようにしています。 var count =iとすることで1番目のボタンbuttons[0]をクリックしたときにPush_button(0)、i番目のボタンbuttons[i-1]をクリックしたときにPush_button(i-1)を行います。 ここでPush_buttonは
public void Push_Button(int num) { //押したボタンのIDを確認 buttonID = num;//引数の数値を代入 //各々のbuttonを押したときのruleでboolを変えてclearしたかチェック buttonrule(); }
であり,i番目のボタンを押したときはPush_button(i-1)となり、buttonID=i-1を返すようになっています。 buttonruleで各々のIDを押したときの反応を記載することでライツアウトのような反応をすることができます。 以下一例
//ライツアウトの部分 public void buttonrule() { //3*3の場合それぞれのボタンを押したときの条件 if(buttonID==0) { lightOn[0] = !lightOn[0]; lightOn[1] = !lightOn[1]; //Onbutton[2] = !Onbutton[2]; lightOn[3] = !lightOn[3]; /* Onbutton[4] = !Onbutton[4]; Onbutton[5] = !Onbutton[5]; Onbutton[6] = !Onbutton[6]; Onbutton[7] = !Onbutton[7]; Onbutton[8] = !Onbutton[8]; */ }
ボタンを押したときにIDを取得する方法はこちらの記事を参考にしました。
ライツアウトのクリア判定にはlightOnという名前のboolを使用しました。 各ボタンごとに対応したboolにして、すべてのboolがtrueになればすべて点灯状態となりクリアとします。 上のbuttonruleでほかのボタンのboolの影響を記述することでゲームになっているわけです。 またゲームにするには視覚的に点灯消灯がわかる必要があるため、boolの状態でボタンの色が変わるようにします。
//ボタンの色を変える void buttoncolor() { //boolがfalseかtrueかで色変え for (int i = 0; i < buttons.Count; i++) { //i番目のボタンが消灯の場合 if (!lightOn[i]) { //消灯時の色にして消灯していることが分かるようにする buttons[i].GetComponent<Image>().color = new Color32(150, 150, 150, 125); } //i番目のボタンが点灯の場合 else { //点灯時の色 buttons[i].GetComponent<Image>().color = new Color32(255, 255, 255, 255); } } }
new Color32で消灯時点灯時の色を変更します。 これでライツアウトの簡単な説明になります。
こちらでunityでの作成風景を載せています