Español Valencià
Instrucciones
🌹

Instrucciones

FASE 4 - AJUSTAR SCRIPTS ⏰ 10' aprox

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

Como último paso para que los peatones roben tiestos, hay que modificar el script GeneraPeaton para que algunos de los peatones que generamos sean ladrones, y el script MoverPeaton para cambiar los prefabs de los peatones que sean ladrones durante su recorrido.

Cambiamos el código de GeneraPeaton por el siguiente, en el que simplemente decidimos si es ladrón con una probabilidad del 15%, y en ese caso, le pasamos la variable al script MoverPeaton.

using UnityEngine;

public class GeneraPeaton : MonoBehaviour
{
    public GameObject[] peatonPrefabs; // Prefab del peaton
    private Transform spawnPoint; // Punto de generación
    public Transform destinationPoint; // Punto de destino
    private float spawnInterval; // Intervalo entre generación
    public float minSpawnInterval = 8f;
    public float maxSpawnInterval = 12f;
    private float probabilidadLadron = .15f; //Probabilidad de que el peaton sea ladron
    private bool esLadron; // Si el peaton es ladron

    //Definimos un intervalo de generación aleatorio y llamamos a la función SpawnPeaton
    //Decidimos si es ladron con una probabilidad del 15%
    void Start()
    {
        esLadron = Random.value < probabilidadLadron;
        spawnPoint = transform;
        SpawnPeaton();
    }

    //Reseteamos el intervalo de generación, generamos un peatón y le asignamos el destino
    //Si es ladrón, le asignamos el indicador al script MoverPeaton y reseteamos la variable esLadron para el siguiente peaton
    void SpawnPeaton()
    {
        spawnInterval = Random.Range(minSpawnInterval, maxSpawnInterval);
        int randomIndex = Random.Range(0, peatonPrefabs.Length);
        GameObject peaton = Instantiate(peatonPrefabs[randomIndex], spawnPoint.position, spawnPoint.rotation);
        peaton.GetComponent<MoverPeaton>().SetDestination(destinationPoint.position); 
        if (esLadron)
        {
            peaton.GetComponent<MoverPeaton>().SetLadron();
        }
        esLadron = Random.value < probabilidadLadron;
        
        Invoke("SpawnPeaton", spawnInterval);
    }
}

En el script MoverPeaton, vamos a añadir la variable ladronPrefab, que es el prefab de ladrón que hemos creado antes, y asignaremos en el inspector.

Calculamos también la distancia a la que roba el tiesto y cambiamos el prefab. Creamos también el método SetLadron, que utilizamos en GeneraPeaton.

Por último, en el Update, si es ladrón y llega a la distancia en la que roba el tiesto, sustituimos el prefab de peatón por el de ladrón.

⚠️
Si los nombres de los prefabs de los ladrones que hemos creado anteriormente no comienzan con “Indicador_…”, este script no funcionará.

Tendremos que modificar la línea 55, en la que comprobamos que el prefab es de peatón si su nombre no empieza por “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
    
    // 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);
    }

    //Método que utilizamos en GeneraPeaton para asignar el destino al peaton
    public void SetDestination(Vector3 dest)
    {
        destination = dest;
    }
    
    //Método que utilizaremos 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 peaton 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 el 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
        {
            Destroy(gameObject);
        }
    }
}

Como último paso, en Unity, vamos a la carpeta PolygonCity > Prefabs > Characters.

Abrimos el prefab de cada peatón (no el ladrón), y en el Inspector, vamos al componente del script MoverPeaton y asignamos a cada uno el prefab del ladrón que le corresponde.

Pulsamos al Play para comprobar el funcionamiento, y algunos peatones deberían convertirse en ladrones durante su recorrido.

Es posible que tarden en robar, a si que deberíamos esperar a que pasen dos o tres tandas de peatones para asegurarnos.