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.
Aufgabe
SchwerBehalte den Bestwert zwischen den Spielen bei und passe dann das Spiel an.
- Füge in
GameManagerpublic TMP_Text bestText;undprivate int best;hinzu. - Weise in
Start()best = PlayerPrefs.GetInt("BestScore", 0);zu und zeige"Best: " + bestan. - Setze in
GameOver()den Bestwert, wenn der Punktestand ihn übertrifft, speichere ihn unterBestScoreund zeige ihn an. - Passe
tick,speedUpundminTickdort 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)];
}
}
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