ボウリングをゲームとして成り立たせるために、まずは倒したピンの本数を取得し、その結果を表示したいと思います。
倒したピンの取得方法は様々あると思いますが、私はコライダのis Trigger機能を使ってピンの状態を取得しようと思います。
とりあえず、今回でボウリングの一通りの機能が完成となります。
コライダーで倒したピンを取得しその結果を表示する【Unity・ボウリング】
まずは、空のオブジェクトを作成します。名前は「HitCheck」としています。
続いて、HitCheckにBoxColliderをアタッチして「is Trigger」にチェックを入れます。
コライダーのサイズを調整して、ピンの上の方が全てコライダーの中に収まるようにします。
ピンがボールによって倒されたら、このコライダーの範囲から抜けるので、この現象を活かして倒れているピンの数を把握するようにします。
ピンの数を取得するスクリプトを作成する
新規スクリプト「HitCheck」を作ります。
count変数を作ってピンの本数を変化させます。初期状態はOnTriggerEnterメソッドによってcountが10となり10本というわけです。
ピンをプレハブ化する
先ほど作ったスクリプトでピンに対して「Pin」というタグをつけているので、シーン上に配置している全てのピンに対して新規タグ「Pin」を作成して設定します。
また、ジェネレータースクリプトによるピンの生成は、1個ずつ生成するのではなく、ピンをまとめた空のオブジェクトごとプレハブにしたいと思います。
SetPinPositionの中に空のオブジェクトを作り「Pinpos」とします。
その中に、全てのピンを入れてプレハブ化します。シーン上のPinposは不要なので消しておきます。
結果表示用テキストを作る
「ストライク!」「スペア!」などと結果を表示するためのテキストを1つ作成します。
「UI」→「Text」から名前を「ResultText」にします。
私は、画面の中央部に表示するようにしました。
ジェネレータースクリプトを作成する。
ピンを生成するジェネレータスクリプト「Generator」を作ります。
ゲーム開始時と、ボールを投球した後にリセット用のメソッドを呼び出してピンを生成します。
保存したら「SetPinPosition」にアタッチして、先ほど作成したプレハブをインスペクタから設定しします。
Throwスクリプトを修正する
以前から作成していたThrowスクリプトを少し修正します。
Managerスクリプトを修正する
同じように、今度はManagerスクリプトを修正してきます。
先ほどのThrowスクリプトより、ボールを投球したらBallflagChangeメソッドを呼び出します。
ボールオブジェクトを取得して、ボールがレーン上で止まるか、レーンから落下したらコルーチンを呼び出して結果を表示するようにします。
スクリプトを保存したらResultTextをインスペクタから設定してゲームを実行してみます。
メーターがかなり少ない状態でボールを投球すると、ボールが止まるまで結構時間がかかってしまい次の投球までの待ち時間が長くなってしまうので、気になる場合はボールのRigidbodyの「Drag」の値を増やすと良いと思います。
または、次の投球に切り替わる条件を変えるとかですかね。単純に投球後10秒経過したら強制的に次のゲームにするとか。
かなり調整する箇所はたくさんありますので、色々試行錯誤してボウリング作りを楽しんでもらえたらなと思います。