Menu
CoddyTech

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に触れる必要はありません。

challenge icon

チャレンジ

簡単

GameManagerにスコアとライフを管理させましょう。

  1. AddScore(int points):gameOverでない場合、scoreに加算し、scoreTextにScore: 6を表示します。
  2. LoseLife():livesを1減らし、Lives: 2を表示します。0になったら、gameOverを設定し、gameOverPanelを表示して、player.enabled = falseに設定します。
  3. 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プレイグラウンド