Hazlo tuyo
Lección 14 de 14 del curso Juego de Unity: Serpiente 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.
Desafío
DifícilConserva la mejor puntuación entre partidas y después ajusta el juego.
- En
GameManager, añadepublic TMP_Text bestText;yprivate int best; - En
Start(), usabest = PlayerPrefs.GetInt("BestScore", 0);y muestra"Best: " + best. - En
GameOver(), cuando la puntuación supere la mejor, actualiza best, guárdala con el nombreBestScorey muéstrala. - Ajusta
tick,speedUpyminTickdonde se declaran en Snake.
Pulsa «Jugar», establece una mejor puntuación y vuelve a jugar: la mejor puntuación se mantiene arriba a la derecha. Después, pulsa «Comprobar».
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)];
}
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.
Todas las lecciones de Juego de Unity: Serpiente 3D
Practica por tu cuenta: Playground de Unity