もう一度プレイ
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とやり取りします。
チャレンジ
中級死亡するとゲームオーバーパネルが表示され、「もう一度プレイ」を押すと新しいゲームが始まります。
GameManagerに、using UnityEngine.UI;、using UnityEngine.SceneManagement;、public GameObject gameOverPanel;、public Button playAgainButton;を追加します。public void GameOver()でパネルを表示し、void PlayAgain()でアクティブなシーンを再度読み込みます。また、Start()でplayAgainButton.onClickに処理を追加します。SnakeのDie()からGameManager.Instance.GameOver()を呼び出します。
「プレイ」を押し、衝突したあとに「もう一度プレイ」をクリックすると、新しいゲームが始まります。その後、「確認」を押します。
自分で試してみよう
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)];
}
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Unityゲーム:3Dスネークのすべてのレッスン
自分で練習してみよう: Unityプレイグラウンド