Menu
CoddyTech

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.

challenge icon

Sfida

Difficile
  1. In GameManager, aggiungi public TMP_Text bestText; (nella scena è assegnato a BestText, in alto a destra) e private int best;.
  2. In Start(), carica best dalla chiave BestScore, usando 0 se non è stato salvato nulla, e visualizzalo come Best: 0.
  3. In GameOver(), quando score supera best, impostalo come record, salvalo con la chiave BestScore e 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)];
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco in Unity: Snake 3D