Menu
CoddyTech

もう一度プレイ

Coddyの「Unityゲーム:3Dスネーク」コースのレッスン 12/14。

スネークが死ぬと、「ゲームオーバー」パネルが表示され、「もう一度プレイ」ボタンが現れます。このパネルはHUD内にあり、最初は非表示になっています。SetActive(true)で表示されます。スネークは自分が死んだことを認識し、画面はGameManagerが管理しているため、Die()はGameManagerのpublicなGameOver()を呼び出します。

「もう一度プレイ」を押すと、シーンを再度読み込んで最初からやり直します。各オブジェクトはシーンの初期状態に戻ります。スネークは最初のセルに2つのセグメントを持って配置され、スコアは0になり、パネルは非表示になります。レースゲームの「リトライ」ボタンも同じように設定します。

void Start()
{
    retryButton.onClick.AddListener(Retry);
}

void Retry()
{
    SceneManager.LoadScene("Track1");
}

名前で読み込むと、ボタンは1つのシーンに固定されます。SceneManager.GetActiveScene().buildIndexは現在実行中のシーンを示すため、そのシーンを読み込めば、ボタンがあるシーンを再起動できます。新しいシーンには新しいGameManagerがあり、そのAwake()が再びInstanceを設定するため、新しいスネークは新しいGameManagerとやり取りします。

challenge icon

チャレンジ

中級

HUD には GameOverPanel が非表示の状態であり、PlayAgainButton も用意されています。また、シーンでは両方が GameManager に設定されています。

  1. GameManager に using UnityEngine.UI;、using UnityEngine.SceneManagement;、public GameObject gameOverPanel;、および public Button playAgainButton; を追加します。
  2. パネルを表示する public void GameOver() を記述します。
  3. アクティブなシーンを再度読み込む void PlayAgain() を記述し、Start() でボタンからこのメソッドを呼び出すようにします。
  4. Snake の Die() で GameOver() を呼び出します。

Play を押して、衝突したらもう一度プレイし、その後 Check を押します。

自分で試してみよう

using System.Collections.Generic;
using UnityEngine;
using TMPro;

public class GameManager : MonoBehaviour
{
    public static GameManager Instance;

    public Snake snake;
    public GameObject foodPrefab;
    public TMP_Text scoreText;
    private Transform food;
    private int score;

    void Awake()
    {
        Instance = this;
    }

    void Start()
    {
        scoreText.text = "Score: 0";
        food = Instantiate(foodPrefab).transform;
        MoveFood();
    }

    public bool IsFood(Vector3 cell)
    {
        return cell == food.position;
    }

    public void Eat()
    {
        score++;
        scoreText.text = "Score: " + score;
        MoveFood();
    }

    void MoveFood()
    {
        List<Vector3> free = new List<Vector3>();
        for (int x = -snake.edge; x <= snake.edge; x++)
        {
            for (int z = -snake.edge; z <= snake.edge; z++)
            {
                Vector3 cell = new Vector3(x, 0f, z);
                if (!snake.Occupies(cell))
                {
                    free.Add(cell);
                }
            }
        }
        food.position = free[Random.Range(0, free.Count)];
    }
}
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Unityゲーム:3Dスネークのすべてのレッスン