自分らしく仕上げよう
Coddyの「Unityゲーム:3Dスネーク」コースのレッスン 14/14。
残る機能は、ゲームを終了しても保持されるベストスコアです。PlayerPrefsで保持します。Start()でデフォルト値を指定して読み込み、ゲームオーバー時にスコアが記録を上回っていたら保存します。レースゲームでは、タイムが短いほど良いため、ベストラップは逆の方法で記録します。
if (lapTime < bestLap)
{
bestLap = lapTime;
PlayerPrefs.SetFloat("BestLap", bestLap);
}これで、ゲームを自由に調整できます。Snakeの数値でゲームの感触が決まります。tickを0.25にすると穏やかなスタート、0.1にすると速いスタートになり、speedUpを0.01にするとヘビがより早く加速し、minTickを0.05にすると終盤が慌ただしくなります。このプレイヤーのInspectorは読み取り専用で、コースのシーンではこれら3つのフィールドにコード内の値が設定されているため、宣言されている場所で値を変更してからPlayを押してください。自分のUnityプロジェクトでは、InspectorでSnakeコンポーネントの値を変更してください。コード内でデフォルト値を変更しても、シーン内にすでにあるコンポーネントには反映されません。
チャレンジ
難しいゲーム間で最高スコアを保持してから、ゲームを調整しましょう。
GameManagerに、public TMP_Text bestText;とprivate int best;を追加します。Start()で、best = PlayerPrefs.GetInt("BestScore", 0);を実行し、"Best: " + bestを表示します。GameOver()で、スコアが最高スコアを上回ったら、最高スコアを更新し、BestScoreという名前で保存して表示します。- Snakeで
tick、speedUp、minTickが宣言されている箇所で、それらの値を調整します。
「プレイ」を押して、最高スコアを記録したあと、もう一度プレイします。最高スコアは右上に表示されたままです。その後、「確認」を押します。
自分で試してみよう
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
using TMPro;
public class GameManager : MonoBehaviour
{
public static GameManager Instance;
public Snake snake;
public GameObject foodPrefab;
public TMP_Text scoreText;
public GameObject gameOverPanel;
public Button playAgainButton;
private Transform food;
private int score;
void Awake()
{
Instance = this;
}
void Start()
{
scoreText.text = "Score: 0";
playAgainButton.onClick.AddListener(PlayAgain);
food = Instantiate(foodPrefab).transform;
MoveFood();
}
public bool IsFood(Vector3 cell)
{
return cell == food.position;
}
public void Eat()
{
score++;
scoreText.text = "Score: " + score;
MoveFood();
}
public void GameOver()
{
gameOverPanel.SetActive(true);
}
void PlayAgain()
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
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プレイグラウンド