このページでは、ゲームの監督スクリプトを記述していきます。制作手順1-1で書きましたように、ワガハイ式ビリヤードもゲームの進行については基本全て監督スクリプト任せになります。少しだけ手球・数球のスクリプトも使用しますが、あくまで補助的な感じで、メインは監督スクリプトになります!
まず、監督スクリプトの主なお仕事を書き出すと以下のようになります。
・ゲーム開始直後、数球オブジェクトを初期配置に並べる
・自分のターンにて、パワーや方向などを調節し、手球を発射
・CPUが(とあるルールにのっとり)パワーや方向などを調節し、手球を発射
・発射後、手球や数球の状況によって、次の番が自分かCPUかを決定する
細かいことを言うとまだまだあるんですが、主な所はこんな感じです。これらを順番に実装していきましょう!
まずはゲーム開始時の挙動として、数球オブジェクトを初期位置に並べるスクリプトを書いていきます。これらはStartメソッド内に書いていきますね。
ナインボールでは、1~9の数字が書かれた数球は右図のように、正三角形状に配置されます。なお、1と9の球については右図の位置(1:最前方、9:中央)で固定となっており、他の2~8の球については、ランダムに配置されます(2の球を最後方に固定配置する、という流儀もあるようですが、今回は1と9だけ位置固定しました)。
球オブジェクトは中心点の座標で位置を指定します。今回、球の直径d=0.5fなので、球が間を空けずにきっちり並べた場合、隣同士(図中では1と8とか、5と6とか、3と8とか、…)の中心間距離=d(0.5f)になります。
また、正三角形上状に配置しましたので、例えば図中1と3は真横方向に√3 / 2 × dだけ離れています(1辺dの正三角形の高さは√3 / 2 × d、です、幾何学って奴ですねー)。
よって、今回はStartメソッド中に以下のようなスクリプトを書いて、数球の初期配置スクリプトを作成しました。
public GameObject[] number_balls; float diam = 0.5f; //球の直径 void Start () { //数球の初期配置 float eps = Random.Range(0, 0.01f) +0.03f; //数球間の隙間(ランダム) float pos1x = -3.8f; float diam2 = diam + eps; float deltax = diam2 * Mathf.Sqrt(3.0f) / 2.0f; //ball1の位置座標(数球の基準位置) Vector3 startpos1 = new Vector3(pos1x, 0f, 0f); //ball9の位置座標 Vector3 startpos9 = new Vector3(pos1x - 2.0f * deltax, 0f, 0f); //ball2~8の候補位置座標 Vector3[] startpos = new Vector3[]{ new Vector3(pos1x-deltax,0.5f*diam2,0f), new Vector3(pos1x-deltax,-0.5f*diam2,0f), new Vector3(pos1x-2.0f*deltax,diam2,0f), new Vector3(pos1x-2.0f*deltax,-diam2,0f), new Vector3(pos1x-3.0f*deltax,0.5f*diam2,0f), new Vector3(pos1x-3.0f*deltax,-0.5f*diam2,0f), new Vector3(pos1x-4.0f*deltax,0f,0f) }; //ball1とball9は位置固定 this.number_balls[0].transform.position = startpos1; this.number_balls[8].transform.position = startpos9; //ball2~ball8はランダム:トランプシャッフルと同様の方法でランダムに List<int> numlist = new List<int> { 0, 1, 2, 3, 4, 5, 6 }; for (int i = 0; i < numlist.Count; i++){ //list[i]とlist[randomnum]を順番入れ替え int temp = numlist[i]; int randomnum = Random.Range(0, numlist.Count); numlist[i] = numlist[randomnum]; numlist[randomnum] = temp; } for (int i = 0; i < numlist.Count; i++){ this.number_balls[i+1].transform.position = startpos[numlist[i]]; } }
今回、数球のオブジェクトはnumber_balls[i=0~8]にて定義しますが、1の球はi=0、2の球はi=1、…と配列の番号は実際の球の番号と1ずれていることにご注意下さい。次回以降も、スクリプトを書いていく際も同様にご注意を(気を付ける頻度は意外と高めです!)。
先程、中心間距離はdとか√3 / 2 × dとか書きましたが、それは球が間を空けずにきっちり並べた場合の話でして、今回はd=0.5fの代わりにd'=0.5f+epsという値が入っており実際には球同士は大体0.03f位のランダムな距離の隙間を空けてあります。要するに同じ向きから同じ強さで一発目のショットを打ったとしても、数球の散らばり具合が毎回変わるように、ランダム幅の隙間を空けました。これも一応ゲームをお楽しみ頂く一工夫になります。
また、2~8の球をランダムにどこに配置するか、についてはトランプ7ならべ制作手順2-1で紹介しました、山札シャッフルの方法を再利用しています。
少し疑問に思われた方もいらっしゃるかもしれませんので、一応補足です。今回、Startメソッド内で初期配置に並べるオブジェクトは数球のみになります。今回のゲームでは、各オブジェクトの登場の仕方に応じて、以下のように分類分けしています。
①スクリプト適用前から配置済(配置にランダム性が無い):ビリヤード台、手球
②スクリプトを用いて配置するが、ゲーム中、最初に配置する&位置にランダム性があるため、オブジェクト配置はStartメソッド内に記述:数球(1~9の球)
③スクリプトを用いて配置するが、ゲーム中、定期的に何度も配置する必要があるため、オブジェクト配置はUpdateメソッド内に記述:キュー、上矢印君、赤○強調表示君、など
あくまで私ワガハイの考え方になります(人によって、この辺りの分類分けは変わると思います)が、今回スクリプトを書いていく上では、一応↑のようなコンセプトの下、オブジェクトを整理したので、Startメソッド内で配置するオブジェクトは数球のみにしました。
<追加補足:混乱する恐れがあるので、余裕のある方のみご覧下さいm(_ _)m>
本当は、↓のような4番目のグループが存在します(所属が他と重複していますが、スクリプトを書く上では特に問題ありません)。
④スクリプトを用いて配置するが、ゲーム中、特殊な状況下でのみ追加配置する必要があるため、オブジェクト配置はUpdateメソッド内に記述:手球、9の球
今回、数球の初期配置についてスクリプト化しました。後半の補足の話は、次回以降で随時スクリプトに書いていく話になりますので、混乱された場合は、「フーン」で流して下さい。余裕があれば、全てスクリプトが完成した後、もう一度このページに帰って来て頂き、補足を再読頂ければ、きっと補足説明の意味がよく分かると思います。
次回は、自分のターンにて、パワーや方向などを調節し、手球を発射する手続きを書いていきます。よろしくお願いします!!