Menu
CoddyTech

自分らしく仕上げよう

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コンポーネントの値を変更してください。コード内でデフォルト値を変更しても、シーン内にすでにあるコンポーネントには反映されません。

challenge icon

チャレンジ

難しい

ゲーム間で最高スコアを保持してから、ゲームを調整しましょう。

  1. GameManagerに、public TMP_Text bestText;とprivate int best;を追加します。
  2. Start()で、best = PlayerPrefs.GetInt("BestScore", 0);を実行し、"Best: " + bestを表示します。
  3. GameOver()で、スコアが最高スコアを上回ったら、最高スコアを更新し、BestScoreという名前で保存して表示します。
  4. 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)];
    }
}
quiz icon腕試し

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

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

自分で練習してみよう: Unityプレイグラウンド