Español Valencià
Instrucciones
🌹

Instrucciones

FASE 1 - FUNCIONAMIENTO DE LAS VIDAS ⏰ 15' aprox

💡

Esta página contiene las instrucciones específicas de la Primera Fase de la sexta sesión para desarrollar el juego del Puente de las Flores.

Para hacer que nuestro contador de vidas funcione, vamos a crear un nuevo script, al que llamaremos GestorVidas.

En este script hacemos que el mensaje inicial vaya aumentando de tamaño y desaparezca a los 3 segundos. También creamos el método PerderVida, al que llamaremos en el script MoverPeaton cuando un ladrón llega al destino.

using System.Collections.Generic;
using System.Linq;
using TMPro;
using UnityEngine;
using UnityEngine.UI;
public class GestorVidas : MonoBehaviour
{
    public List<Image> imagenVida; // Lista de las imágenes de las vidas
    private int vidas; // Número inicial de vidas
    public TextMeshProUGUI mensajeInicio; //Mensaje inicial
    
    
    //Inicializamos el número de vidas
    //Buscamos las imágenes de las vidas en la escena y las añadimos a la lista
    void Start()
    {
        vidas = imagenVida.Count;
        
        if (imagenVida.Count == 0)
        {
            foreach (Transform child in transform)
            {
                Image macetaImage = child.GetComponent<Image>();
                if (macetaImage != null)
                {
                    imagenVida.Add(macetaImage);
                }
            }
        }
        
        Invoke("OcultarMensaje", 3f);
    }

    void Update()
    {
        //Expandimos el mensaje inicial antes de que desaparezca
        if (mensajeInicio.isActiveAndEnabled)
        {
            mensajeInicio.transform.localScale = new Vector3(
                mensajeInicio.transform.localScale.x + 0.02f,
                mensajeInicio.transform.localScale.y + 0.02f,
                mensajeInicio.transform.localScale.z + 0.02f);
        }
    }

    //Método para que desaparezca el mensaje inicial utilizado en el método Start
    private void OcultarMensaje()
    {
        mensajeInicio.gameObject.SetActive(false);
    }

    //Método para perder una vida que utilizamos en el script MoverPeaton
    public void PerderVida()
    {
        if (vidas > 0)
        {
            vidas--;
            imagenVida[9 - vidas].gameObject.SetActive(false);
        }
    }
}

También tendremos que modificar el script MoverPeaton, para llamar al método PerderVida del script anterior cada vez que destruimos un ladrón, es decir, cuando llega al destino.

⚠️
Igual que antes, si los nombres de los prefabs de nuestros ladrones no comienzan con “Indicador…”, tendremos que modificar las líneas 55 y 82, en las que comprobamos que el prefab es de peatón si su nombre no empieza por “Indicador” y lo contrario

if (!transform.name.StartsWith("Indicador"))

if (transform.name.StartsWith("Indicador"))

using UnityEngine;

public class MoverPeaton : MonoBehaviour
{

    private float speed; // Velocidad del personaje
    private Vector3 destination; //Destino del personaje
    public float minSpeed = 2.5f;
    public float maxSpeed = 3f;
    private bool ladron;
    public GameObject ladronPrefab;  //Prefab del peaton con el tiesto y el indicador
    private float distanciaTotal; //Distancia total entre el peaton y el destino
    private float distanciaRobo;  //Distancia a la que el peaton se convierte en ladron
    private GestorVidas gestorVidas; //Script para eliminar vidas en el HUD
    
    // Asignamos una velocidad aleatoria al personaje y lo orientamos hacia su destino
    // Si el peaton es ladron, calculamos la distancia en la que roba el tiesto
    void Start()
    {
        speed = Random.Range(minSpeed, maxSpeed);
        if (destination != Vector3.zero)
        {
            transform.rotation = Quaternion.LookRotation(destination - transform.position);
        }
        distanciaRobo = 1 - Random.Range(0.2f, 0.55f);
        distanciaTotal = Vector3.Distance(destination, transform.position);
        gestorVidas = FindObjectOfType<GestorVidas>();
    }

    //Método que utilizamos en GeneraPeaton para asignar el destino al peaton
    public void SetDestination(Vector3 dest)
    {
        destination = dest;
    }
    
    //Método que utilizamos en LadronInteraction para obtener el destino del peaton
    public Vector3 GetDestination()
    {
        return destination;
    }
    
    //Método que utilizamos en GeneraPeaton para asignar el indicador al peaton
    public void SetLadron()
    {
        ladron = true;
    }
        
    //Movemos el peatón hacia su destino y lo destruimos cuando llega
    void Update()
    {
        // Comprobamos si es ladrón
        if (ladron)
        {
            // Comprobamos que tiene el prefab de peaton y no de ladrón
            if (!transform.name.StartsWith("Indicador"))
            {
                //Cuando llegamos a la distancia en la que se roba la maceta cambiamos nuestro prefab de peaton por el de ladrón
                //Asignamos destino al prefab del ladrón y eliminamos el peaton original
                if (Vector3.Distance(transform.position, destination) < distanciaTotal * distanciaRobo)
                {
                    if (ladronPrefab != null)
                    {
                        GameObject nuevoLadron = Instantiate(ladronPrefab, transform.position, transform.rotation);
                        MoverPeaton moverLadron = nuevoLadron.GetComponent<MoverPeaton>();
                        if (moverLadron != null)
                        {
                            moverLadron.SetDestination(destination); 
                        }
                        Destroy(gameObject);
                    }
                }
            }
        }
        
        //Movemos el peaton hacia su destino y lo destruimos cuando llega
        if (Vector3.Distance(transform.position, destination) > 0.1f)
        {
            transform.position = Vector3.MoveTowards(transform.position, destination, speed * Time.deltaTime);
        }
        else
        {
            if (transform.name.StartsWith("Indicador"))
            {
                if (gestorVidas != null)
                {
                    gestorVidas.PerderVida();
                }
            }
            Destroy(gameObject);
        }
    }
}

Añadimos el script a nuestro objeto Contador, y después, en el inspector, le asignamos como variables nuestro mensaje inicial y las imágenes de las vidas, quedando de esta manera:

image

Pulsamos al Play para comprobar que funciona.

Posiblemente notaremos que pasa demasiado tiempo desde que un ladrón abandona la calle hasta que perdemos una vida.

Esto lo podemos solucionar ajustando las posiciones (Z) de los destinos de los peatones, ya que se pierde una vida cuando los ladrones llegan al destino y no cuando desaparecen de la pantalla.

En nuestro caso, hemos movido los destinos de la derecha a la posición en Z: 57.5 (antes 60), y los de la izquierda a Z: 2.5 (antes 0)