int 型の point 変数を宣言し、得点という情報をこのスクリプトに持たせます。
public 修飾子で宣言しておくことで、インスペクターから任意の得点の設定を可能にしておくと便利です。
int 型を利用しているのは、得点を管理している PlayerController スクリプトにある score 変数の型が int 型であるためです。
新しい情報を用意する場合には、その変数がどの部分で利用されるのかを考えて、必要な形で設計をします。
重要な変更点として、OnTriggerEnter メソッド内に処理を修正し、現在のキャラが侵入したら、そのゲームオブジェクトのタグによって判定を行う処理から、
侵入したゲームオブジェクトにアタッチされている指定されたスクリプト(ここでは PlayerController)を取得できるかを判定する処理に変更します。
得点の情報を管理しているのは、Penguin ゲームオブジェクトではなく、そこにアタッチされている PlayerController が管理を行っています。
そのため、例えばタグによってゲームオブジェクトの判別が出来たとしても、その後に再度、そのタグによって判別されたゲームオブジェクトに対して、
指定されたスクリプト(PlayerController)を取得することができるかを判定する必要があります。
つまり、
タグによる処理の場合、そのあとの処理につなげていく際に、再度、判定の処理を行うことになるため、重複判定をすることになります。
それは
無駄な処理になってしまうため、今回はタグの処理を止め、代わりに、スクリプトを取得できるかを判定し、
スクリプトを取得できた場合にのみ、次の処理へとつながるようなロジックを作って処理を組み上げています。
これには新しい TryGetComponent メソッドを活用しています。
この処理に変更することにより、現在用意しているタグによる判定処理の代わりにもなりますので、タグの判定部分を削除することが出来ます。
PlayerController が取得出来た場合には変数に代入して、PlayerController スクリプトを参照したり、命令を出せるようにします。
そして、public 修飾子で宣言している PlayerController スクリプトの AddScore メソッドを実行(呼び出)します。
AddScore メソッドを実行するには int 型の引数を用意する必要がありますので、今回宣言を追加した int 型の point 変数を渡します。
この処理によって、スコアの加算処理とともに、どの値を加算するのか、という情報も一緒に PlayerController 側に届くようになります。
Circle.cs
<= クリックすると開きます。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Circle : MonoBehaviour
{
////* 変数の宣言を追加 *////
public int point; // サークルにキャラが侵入した際に獲得できる得点値。インスペクターより設定する
////* ここまで *////
private void OnTriggerEnter(Collider col) {
////* ここから処理を削除 *////
//if (col.gameObject.tag == "Player") { // この処理を削除するか、コメントアウトします
// TODO キャラが侵入した際の処理を書く。実際に処理を書きこんでいるので、この部分はコメントアウトするか、削除してもらって構いません
//Debug.Log("キャラ侵入"); // <= 確認が終了した Debug.Log はコメントアウトするか、削除してもらって構いません
////* ここから処理を追加 *////
// col.gameObject(つまり、Penguin ゲームオブジェクト)に対して、TryGetComponent メソッドを実行し、PlayerController クラスの情報を取得できるか判定する
// PlayerController スクリプトがアタッチされているゲームオブジェクトは Penguin ゲームオブジェクトしかない。
// よってこの判定処理を行うことにより、タグを使わずに Penguin のゲームオブジェクトであるか判定できる。
// また、PlayerController スクリプトを取得できた場合のみ、if 文内の処理が実行されるため、処理を安全に実行していくことにも一役買っている
if (col.gameObject.TryGetComponent(out PlayerController player)) {
// PlayerController クラスが取得出来ている場合、player 変数を通じて PlayerController クラスに記述されている public 修飾子の AddScore メソッドを呼び出す命令をする
// 引数には point 変数の値を渡す
player.AddScore(point);
}
Destroy(gameObject, 0.5f);
//} // if 文を1つ削除しているので、この } も削除するか、コメントアウトします。
////* ここまで *////
}
}
スクリプトの修正が終了したら、セーブして、Circle ゲームオブジェクトのインスペクターを確認します。
新しく public 修飾子で宣言した変数が表示されていれば問題ありません。
point 変数の初期値は 0 ですので、任意の値を設定してください。この値がサークルを通過した際に獲得できる得点になります。
Circle ゲームオブジェクト インスペクター画像(初期値時)