Menu
CoddyTech

Mach es zu deinem

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
  1. Füge in GameManager public TMP_Text bestText; (die Szene weist ihm BestText oben rechts zu) und private int best; hinzu.
  2. Lade in Start() best mit dem Schlüssel BestScore; wenn nichts gespeichert ist, verwende 0, und zeige den Wert als Best: 0 an.
  3. Wenn score in GameOver() best übertrifft, mache ihn zum neuen Bestwert, speichere ihn unter BestScore und zeige ihn an.

Drücke Play und dann Check. Spiele anschließend und passe tick, speedUp und minTick an, bis sich das Spiel für dich richtig anfühlt.

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