1つのスクリプトでゲームを動かす
CoddyのUnityジャーニー「本格的なゲームを作る」セクションの一部。レッスン 12/60。
スコアをプレイヤーのスクリプトに、ライフを体力スクリプトに、ゲームオーバーの判定を3つ目のスクリプトに置くと、各スクリプトで他のスクリプトの数値が必要になるため、新しいルールを追加するたびに複数のファイルを変更することになります。Unityのゲームでは通常、これらの数値を専用の空のGameObjectにある1つのスクリプト、GameManagerにまとめます。GameManagerがスコア、ライフ、ゲームを終了するルールを管理します。他のスクリプトは、publicメソッドを呼び出して起きたことを報告するだけです。このPK戦では、ゴールネットがゴールのたびに報告します。
public class GameManager : MonoBehaviour
{
private int goals;
private int shotsLeft = 5;
public void ShotTaken(bool scored)
{
if (shotsLeft == 0) return;
shotsLeft--;
if (scored) goals++;
Debug.Log("Goals: " + goals + ", shots left: " + shotsLeft);
if (shotsLeft == 0) Debug.Log("Full time: " + goals + " goals");
}
}// Net.cs、ゴールのトリガーに設定
public GameManager game;
void OnTriggerEnter(Collider other)
{
if (other.CompareTag("Ball")) game.ShotTaken(true);
}ゴールネットは、残りのシュート数やゲームがいつ終了するかを把握していません。ゴールを報告し、その意味を判断するのはGameManagerです。キーパーのスクリプトは、game.ShotTaken(false)を使ってセーブを報告します。シュート数を3回にする場合、1つのスクリプトにある数値を1か所変更するだけです。ShotTakenの冒頭にあるチェックにより、試合終了後に転がり込んだボールが得点に数えられるのを防ぎます。
InspectorでGameManagerオブジェクトをgameフィールドにドラッグすると、Unityがそのオブジェクトに付いているGameManagerスクリプトを見つけます。また、HUDを管理する場所もGameManagerです。スコアのテキストとゲームオーバーのパネルをGameManagerが保持すれば、数値を変更するメソッドと同じメソッドで画面も更新でき、他のスクリプトがUIに触れる必要はありません。
チャレンジ
簡単GameManagerにスコアとライフを管理させましょう。
AddScore(int points):gameOverでない場合、scoreに加算し、scoreTextにScore: 6を表示します。LoseLife():livesを1減らし、Lives: 2を表示します。0になったら、gameOverを設定し、gameOverPanelを表示して、player.enabled = falseに設定します。GemとBombで、other.CompareTag("Player")のとき、game.AddScore(points)またはgame.LoseLife()を呼び出し、その後Destroy(gameObject)を実行します。
「プレイ」を押して、爆弾に3回当たってください。その後、「確認」を押します。
自分で試してみよう
using UnityEngine;
using TMPro;
public class GameManager : MonoBehaviour
{
public TMP_Text scoreText;
public TMP_Text livesText;
public GameObject gameOverPanel;
public Player player;
private int score;
private int lives = 3;
private bool gameOver;
public void AddScore(int points)
{
// ゲームオーバーでなければ、ポイントを加算して新しいスコアを表示する
}
public void LoseLife()
{
// ライフを1つ減らして表示する。ライフが0になるとゲームオーバーになる
}
}
本格的なゲームを作るのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド