手球・数球スクリプトを記述しよう
このページでは、ゲームの手球・数球スクリプトを記述していきます。制作手順1-1で書きましたように、ゲームの進行については基本は監督スクリプト任せなので、ここで説明するのは、監督スクリプトの補助的な役割を持つスクリプトになります。
要するに、監督スクリプトから本スクリプト中のメソッドを呼び出したり、何かこちらでイベントが起こった際に情報を監督スクリプトに送る、といった具合に活用していきます。ですので、各メソッドと、監督スクリプトとの関連性もしっかり理解しつつ、スクリプトを書いていきましょう!
手球スクリプトを書こう
手球スクリプトのお仕事を書き出すと以下のようになります。
・ポケットと衝突したらオブジェクト消滅、それを監督スクリプトに伝達
・監督スクリプトより、手球発射の指令が下されたら、力を加えて発射
以上の2点になります。そこまで難しいスクリプトではありませんので、落ち着いて一つ一つスクリプト化していきましょう。
ポケットと衝突したらオブジェクト消滅、それを監督スクリプトに伝達
「監督スクリプトに伝達」というのは制作手順2-5で紹介しました監督スクリプト中のdelplayerballメソッドを呼び出すことを意味します。ポケットのオブジェクトに"hole"とタグ付けすれば、以下のようなスクリプトでOKです。
1 2 3 4 5 6 7 8 |
void OnCollisionEnter(Collision collision) { //衝突判定 if (collision.gameObject.tag == "hole") { Destroy(this.gameObject); this.GameDirector.GetComponent<GameDirector>().delplayerball(); //その後GameDirectorによりplayerball再生成 } } |
監督スクリプトより、手球発射の指令が下されたら、力を加えて発射
このメソッドは、実は制作手順2-2、2-4で既に呼び出されており、自ターン・CPUターンで手球を打つパワーと向きが決まった後に実際に手球に力を加えて発射するメソッドになります。中身はこんな具合でしょうか。
1 2 3 4 5 6 7 |
private float speed = 20.0f; //100%パワーで打った時の力 public void start_shot(int shotpower, int shotangle){ //power、angleが決まったら力を加えて発射(角度はラジアンに修正) float anglerad = (float)shotangle * Mathf.PI / 180.0f; Vector2 anglevec = new Vector2(-Mathf.Cos(anglerad),Mathf.Sin(anglerad)); this.GetComponent<Rigidbody>().AddForce(anglevec * this.speed * shotpower / 100.0f,ForceMode.VelocityChange); } |
sin、cos(三角関数)は慣れてないと混乱するかもしれませんが、斜めのベクトル(今回は力の矢印)の大きさと向き(角度)が分かっている場合、右図のような関係になります。使いこなせると非常に強力な武器になりますので、この機会にしっかり理解しておきましょう!
数球スクリプトを書こう
次に、数球スクリプトのお仕事を書き出すと以下のようになります。
・ポケットと衝突したらオブジェクト消滅、自身の番号を監督スクリプトに伝達
・手球と衝突したら、自身の番号を監督スクリプトに伝達
以上の2点になります。一つ一つスクリプト化していきましょう。
ポケットと衝突したらオブジェクト消滅、自身の番号を監督スクリプトに伝達
先程手球の方でも似たような話が出て来ましたが、数球が「監督スクリプトに伝達」するのは、制作手順2-5で紹介しました監督スクリプト中のdelballlistメソッドを呼び出すことになります。ということで、以下のようなスクリプトでOKです。
1 2 3 4 5 6 7 8 9 |
public int ballnum; //各数球ごとに値が異なるので、それぞれInspectorウィンドウ上で定義 void OnCollisionEnter(Collision collision) { //衝突判定 if (collision.gameObject.tag == "hole") { //タグ"hole"と衝突すると消滅 Destroy(this.gameObject); this.GameDirector.GetComponent<GameDirector>().delballlist(this.ballnum); } } |
手球と衝突したら、自身の番号を監督スクリプトに伝達
似たような話ばかりですが、これが最後です。今回、数球が「監督スクリプトに伝達」するのは、制作手順2-5で紹介しました監督スクリプト中のaddcollideballlistメソッドを呼び出すことになります。ということで、先程のif文の後に以下のようなスクリプトを続けて書いていきます。
1 2 3 4 5 6 7 8 9 10 11 |
void OnCollisionEnter(Collision collision) { //衝突判定 if (collision.gameObject.tag == "hole") { //タグ"hole"と衝突すると消滅 //先程書いたので省略 } else if (collision.gameObject.tag == "playerball") { //タグ"playerball"と衝突すると番号情報をGameDirectorへ this.GameDirector.GetComponent<GameDirector>().addcollideballlist(this.ballnum); } } |
最後に
今回は、手球と数球のスクリプトを書いていきました。そこまで複雑なスクリプトではありませんが、監督スクリプトと関連している話ばかりなので、各スクリプト文が、監督スクリプトとどのように関連付いているのか、そこをしっかり理解して下さい。