Menu
CoddyTech

Hazlo tuyo

Lección 14 de 14 del curso Juego de Unity: Snake 3D de Coddy.

Solo queda una característica: una puntuación máxima que se conserve al cerrar el juego. PlayerPrefs la guarda: léela con un valor predeterminado en Start() y guárdala al terminar la partida si la puntuación la supera. En un juego de carreras, la mejor vuelta se guarda al revés, ya que un tiempo menor es mejor:

if (lapTime < bestLap)
{
    bestLap = lapTime;
    PlayerPrefs.SetFloat("BestLap", bestLap);
}

Después, puedes ajustar el juego a tu gusto. Los números de Snake determinan cómo se siente: tick 0.25 da un comienzo tranquilo y 0.1 uno rápido; speedUp 0.01 acelera antes a la serpiente, y minTick 0.05 hace que el final de la partida sea frenético. El Inspector de este jugador es de solo lectura, y la escena del recorrido deja estos tres campos con los valores de tu código, así que cámbialos donde están declarados y pulsa Play. En tu propio proyecto de Unity, cámbialos en el componente Snake del Inspector: un nuevo valor predeterminado en el código no se aplica a un componente que ya está en una escena.

challenge icon

Desafío

Difícil
  1. En GameManager, agrega public TMP_Text bestText; (la escena lo establece en BestText, arriba a la derecha) y private int best;.
  2. En Start(), carga best desde la clave BestScore, con 0 si no hay nada guardado, y muéstralo como Best: 0.
  3. En GameOver(), cuando score supere a best, conviértelo en el mejor resultado, guárdalo con la clave BestScore y muéstralo.

Pulsa Play y luego pulsa Check. Después juega y ajusta tick, speedUp y minTick hasta que el juego te parezca adecuado.

Pruébalo tú mismo

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 iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: Snake 3D