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.
Aufgabe
Schwer- Füge in
GameManagerpublic TMP_Text bestText;(die Szene weist ihm BestText oben rechts zu) undprivate int best;hinzu. - Lade in
Start()bestmit dem SchlüsselBestScore; wenn nichts gespeichert ist, verwende 0, und zeige den Wert alsBest: 0an. - Wenn
scoreinGameOver()bestübertrifft, mache ihn zum neuen Bestwert, speichere ihn unterBestScoreund 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)];
}
}
Diese Lektion enthält ein kurzes Quiz. Starte die Lektion, um es zu beantworten und deinen Fortschritt zu speichern.