i-school - 2Dまるばつゲーム(三目並べ) 手順6
 ゲーム画面にある Grid をクリック(タップ)した際の処理を作成していきます。

 いきなりすべての処理を作ることは難しいため、まずは、GridController スクリプトと GameManager スクリプトとの間に繋がりを作り、
Grid をクリックした際に、Grid の通し番号の情報を GameManager スクリプト側に届けるようにしていきます。


<実装動画>
動画ファイルへのリンク

 以下の内容で順番に実装を進めていきます。

手順6 ークラス同士の繋がりの作成ー
11.GridController スクリプトと GameManager スクリプトを修正し、メソッドの引数を使って情報をやりとりできるようにする



 新しい学習内容は、以下の通りです。

 ・Button.onClick.AddListener メソッド



11.GridController スクリプトと GameManager スクリプトを修正し、メソッドの引数を使って情報をやりとりできるようにする

1.設計


 スクリプトは独立しているため、複数のスクリプトを作成した場合、それらに繋がりはありません。
そのため、他方のスクリプトに設定されている変数の値の情報は、もう片方のスクリプトが利用できるようにするためには、クラス同士の繋がりを作る必要があります。

 クラス同士のつながりは、宣言フィールドなどでクラスを型として宣言し、その情報を取得することで繋がりを作ることが出来ます。
ですが、宣言フィールドに用意する変数は数が多くなるほど管理は煩雑になり、メモリを圧迫する原因の1つとなります。

 こういったケースに備えて、スクリプトにはメソッドと引数の機能が用意されています。
作成したメソッドを public 修飾子として定義しておくことにより、そのメソッドは、外部のクラスからでも呼び出し命令を受ける事が出来ます。
その際、引数の設定を行っておくことで、メソッドの実行時に外部のクラスにある情報を受け取る窓口として利用することが出来ます。
引数の情報はメソッド内でのみ利用できるスコープを持つ変数となりますので、メソッドの処理が終了するとともに自動的に削除されます。

 今回はこのメソッドの引数の機能を利用し、引数に外部のクラスから情報を受け取って処理を行う設計を行います。


2.GameManager スクリプトを修正する


 まずは最初に、処理を記述したメソッドを先に作成します。
名前はクリックした際の処理であるとわかるように OnClickGrid にしておきます。

 Grid 側は、その OnClickGrid メソッドを登録して実行することになりますので、登録先がなければ、処理の繋ぎようがないためです。

 今回は単純に、Grid をクリックしたら、GameManager スクリプトに用意した OnClickGrid メソッドを実行し、
OnClickGrid メソッド内にある Debug.Log メソッドが実行されるという内容です。

 2つのスクリプト同士に関連性、繋がりを作るために OnClickGrid メソッドを利用します。

 OnClickGrid メソッドには引数も設定しておきます。
メソッドに引数の設定がある場合、それを実行する側(命令する側)である GridController スクリプト側で
実行の際に引数に対応する情報の値を指定する必要があります。指定できないと、メソッドは実行できません。

 この引数の機能を利用して、GridController スクリプト側が管理している Grid の通し番号である GridNo 変数の情報を
メソッドの引数を窓口として送信して受け取れるようにします。


GameManager.cs

 <= クリックすると開きます。



3.GridController スクリプトを修正する


 続いて、GridController スクリプトを修正して、ボタンをクリックした際の処理として
GameManager スクリプトに準備した OnClickGrid メソッドを登録して、実行出来るようにします。

 ボタンにメソッドを登録することで、そのボタンには押された際の役割が与えられます。
インスペクターから登録することもできますが、アサイン忘れなどを防止するため、スクリプトからメソッドを登録するようにします。

 ボタンを制御するためには、Button 型の変数を用意して、その変数に対して処理を実行します。
また、ボタンにメソッドを登録するための処理が Button 型に Unity 側から用意されていますので、そちらを活用します。


GridController.cs

 <= クリックすると開きます。



4.<Button.onClick.AddListener メソッド>


 Button コンポーネントには OnClick というイベントを登録する場所があります。ここにゲームオブジェクトのアサインを行うことで、
アサインしたゲームオブジェクトにアタッチされているスクリプトに宣言されている public 修飾子のメソッドを登録することができます。


インスペクター画像



 この処理をスクリプトから制御して追加して行う処理が、onClick.AddListenerメソッドです。引数のない場合と引数のある場合で書式が変化します。

 利点は、private 修飾子のメソッドでも登録できること、''スクリプトから登録しているので、
Unity内の上記の画像のButton部分への登録作業や、確認をする必要がなくなる(アサイン漏れ防止)こと''、などがあります。

 引数のないメソッドを登録する場合、引数にはそのままメソッド名を記述します。メソッドの()を書くとエラーになるので、メソッド名のみを記述します。

 今回のように引数のあるメソッドを登録する場合には、ラムダ式の記述を利用します。その場合には、メソッドの () を書かないとエラーになります。
登録の際の書式は統一されており、() => の部分までは共通処理です。そのため、単純に登録するメソッドの指定部分だけを変えることで登録できます。

  // ボタンをクリック(タップ)した際に実行するメソッドを登録する
  btnGrid.onClick.AddListener(() => gameManager.OnClickGrid(gridNo));
 
 コメントにもあるように、この処理はボタンにメソッドを登録するだけですので、ここの部分でメソッド自体の実行を行っている訳ではありません
あくまでも、対象となるボタンを押したときに実行されるメソッドを登録している処理になります

 詳細については公式のリファレンスを参考にしてください。またネットには記事が多くありますので調べてみましょう。

参考サイト

Unity公式スクリプトリファレンス
Button.on.Click.AddListener
https://docs.unity3d.com/ja/2018.4/ScriptReference...


5.ゲームを実行して動作を確認する


 処理が完成しましたので、最初から今回学習した内容を振り返り、処理の内容の理解を深めてください。

 ゲームを実行して、Grid をクリックしてみてください。
GridController スクリプトから GameManager スクリプトの OnClickGrid メソッドが実行されていれば、
Console ビューに GridController スクリプトに管理されている GridNo 変数の値が表示されます。

 異なる Grid をクリックし、その都度、Console ビューに表示される GridNo の値が変化することを確認してください。

 各 GridController スクリプトによって実行されるメソッドはどれも共通していて GameManager スクリプトの OnClickGrid メソッドですが、
OnClickGrid メソッドの引数に渡される情報が GridController スクリプトに管理されている GridNo 変数になるので、
同じメソッドを実行していても、引数によって異なる値が OnClickGrid メソッド側に届いていることが分かります。

 この動作が非常に重要です。
このメソッドの引数の機能を利用することによって、クリックされた Grid の番号を把握することが可能になります。


Console ビュー画像



<実装動画>
動画ファイルへのリンク



 以上でこの手順は完成です。

 スクリプト同士の繋がり、メソッドの引数の使い方はとても大切な処理になります。
特に今後スクリプトの数やメソッドの数が増えていきますので、しっかりと処理の内容を把握していってください。

 次は 手順7 −プレイヤーの〇印を配置する− です。