FASE 4 - AJUSTAR SCRIPTS ⏰ 10' aprox
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.
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.