Menu
CoddyTech

Gestalte es nach deinen Vorstellungen

Lektion 14 von 14 im Kurs Unity-Spiel: 3D-Snake von Coddy.

Eine Funktion fehlt noch: ein Bestwert, der auch nach dem Schließen des Spiels erhalten bleibt. PlayerPrefs speichert ihn: Lies ihn in Start() mit einem Standardwert aus und speichere ihn bei Spielende, wenn der Punktestand den Bestwert übertrifft. Ein Rennspiel speichert seine beste Rundenzeit andersherum, da eine niedrigere Zeit besser ist:

if (lapTime < bestLap)
{
    bestLap = lapTime;
    PlayerPrefs.SetFloat("BestLap", bestLap);
}

Jetzt kannst du das Spiel nach deinen Wünschen anpassen. Die Werte von Snake bestimmen das Spielgefühl: tick mit 0.25 sorgt für einen ruhigen Start, 0.1 für einen schnellen; speedUp mit 0.01 beschleunigt die Schlange früher, und minTick mit 0.05 sorgt für ein hektisches Endspiel. Im Inspector dieses Spielers kannst du die Werte nur lesen, und in der Szene des Kurses bleiben diese drei Felder auf den Werten aus deinem Code. Ändere sie also dort, wo sie deklariert sind, und drücke auf Play. Ändere sie in deinem eigenen Unity-Projekt auf der Snake-Komponente im Inspector: Ein neuer Standardwert im Code wird nicht auf eine Komponente übertragen, die bereits in einer Szene vorhanden ist.

challenge icon

Aufgabe

Schwer

Behalte den Bestwert zwischen den Spielen bei und passe dann das Spiel an.

  1. Füge in GameManager public TMP_Text bestText; und private int best; hinzu.
  2. Weise in Start() best = PlayerPrefs.GetInt("BestScore", 0); zu und zeige "Best: " + best an.
  3. Setze in GameOver() den Bestwert, wenn der Punktestand ihn übertrifft, speichere ihn unter BestScore und zeige ihn an.
  4. Passe tick, speedUp und minTick dort an, wo sie in Snake deklariert sind.

Drücke „Spielen“, stelle einen Bestwert auf und spiele noch einmal: Der Bestwert bleibt oben rechts. Drücke dann „Prüfen“.

Probier es selbst

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 iconTeste dich selbst

Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.

Alle Lektionen in Unity-Spiel: 3D-Snake

Übe selbstständig: Unity-Playground