Rendilo tuo
Lezione 14 di 14 del corso Gioco in Unity: Snake 3D di Coddy.
Manca una funzione: un punteggio massimo che persiste anche dopo aver chiuso il gioco. PlayerPrefs lo conserva: leggilo con un valore predefinito in Start() e salvalo a fine partita quando il punteggio lo supera. In un gioco di corse, il giro migliore si gestisce al contrario, perché un tempo più basso è migliore:
if (lapTime < bestLap)
{
bestLap = lapTime;
PlayerPrefs.SetFloat("BestLap", bestLap);
}A questo punto puoi personalizzare il gioco come vuoi. I numeri di Snake ne determinano il ritmo: tick 0.25 offre un inizio tranquillo e 0.1 uno veloce, speedUp 0.01 aumenta la velocità del serpente prima e minTick 0.05 rende il finale frenetico. L'Inspector di questo progetto è di sola lettura e la scena del corso lascia questi tre campi ai valori presenti nel tuo codice, quindi modificali dove sono dichiarati e premi Play. Nel tuo progetto Unity, modificali sul componente Snake nell'Inspector: un nuovo valore predefinito nel codice non viene applicato a un componente già presente in una scena.
Sfida
Difficile- In
GameManager, aggiungipublic TMP_Text bestText;(nella scena è assegnato a BestText, in alto a destra) eprivate int best;. - In
Start(), caricabestdalla chiaveBestScore, usando 0 se non è stato salvato nulla, e visualizzalo comeBest: 0. - In
GameOver(), quandoscoresuperabest, impostalo come record, salvalo con la chiaveBestScoree visualizzalo.
Premi Play, poi premi Check. Poi gioca e regola tick, speedUp e minTick finché il gioco non ti sembra giusto.
Provalo tu
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)];
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.