//Metodo que se manda llamar cada frame public override void UpdateState(AgenteEstatico agent) { //Si se detecto al agente if (agent.targetDetected) { agent.TransitionToState(agent.attackState); //Hacer la transicion al estado de atacar } else { //Sino, realizar el comportamiento de rotar //Esta linea es la que permite rotar de forma suave al agente, llendo de su rotación actual hacia el angulo indicado en el //arreglo, se le añade la variable de velocidad para la rotación agent.transform.rotation = Quaternion.Slerp(agent.transform.rotation, Quaternion.Euler(agent.angles[agent.angleIndex]), Time.deltaTime * agent.speedRotation); //Debug.Log(agent.transform.eulerAngles.y); //Mensaje en consola para ver los angulos //Si el agente llego a la rotación que se encuentra en el arreglo if (agent.transform.eulerAngles.y >= (agent.angles[agent.angleIndex].y - 1)) { agent.angleIndex = (agent.angleIndex + 1) % agent.angles.Length; //Pasar al siguiente angulo, recorriendo el arreglo de angulos, va a recorre siempre de 0 - el tamaño del arreglo agent.TransitionToState(agent.idleState); //Una vez llegado ahí queremos que espere un momento antes de rotar, por eso se hace la transición al estado Idle } } }
public override void EnterState(AgenteEstatico agent) { //Código para cuando entra al estado de atacar Debug.Log("Estado de Atacar"); agent.agentStatus = AgentState.Attacking; //agent.FireBullet(); nextFire = Time.time + rateFire; }
public override void UpdateState(AgenteEstatico agent) { //necesario preguntar si se ha detectado al jugador //agent.StopAllCoroutines();//Esto detiene la corutina de Wait que esta en este código //Si es verdad, cambiar al estado de atacar if (agent.targetDetected) { agent.StopAllCoroutines(); agent.TransitionToState(agent.attackState); } }
public override void UpdateState(AgenteEstatico agent) { if (agent.targetDetected) { var lookRotation = Quaternion.LookRotation(agent.tarjetObj.transform.position - agent.transform.position); agent.transform.rotation = Quaternion.Slerp(agent.transform.rotation, lookRotation, agent.speedRotation * Time.deltaTime); if (nextFire < Time.time) { agent.Firebullet(); nextFire = Time.time + rateFire; } } else { agent.TransitionToState(agent.idleState); } }
public override void UpdateState(AgenteEstatico agent) { if (agent.targetDetected) //Si el target sigue detectado { //Primero hacia que dirección esta el target, hacemos una resta entre las posiciones para obtenerla y guardarla en lookRotation var lookRotation = Quaternion.LookRotation(agent.targetObj.transform.position - agent.transform.position); //Realizaremos una rotación suave a lo largo de la ejecucion, apuntando siempre al target en base a la dirección guardada de lookrotation agent.transform.rotation = Quaternion.Slerp(agent.transform.rotation, lookRotation, agent.speedRotation * Time.deltaTime); //Controlamos los disparos, si el tiempo acumulado es menor a Time.time, puede disparar // Time.time es una varible de la librería de Unity, es el tiempo que esta transcurriendo en el juego if (nextFire < Time.time) { agent.FireBullet(); //Se manda llamar el metodo de disparar nextFire = Time.time + rateFire; //acumulamos el tiempo, para cuando toque disparar nuevamente } } else { agent.TransitionToState(agent.idleState); } }
//Metodo de inicio en el estado Idle public override void EnterState(AgenteEstatico agent) { Debug.Log("Entro a estado Idle"); agent.agentStatus = AgentState.Idle; //Se cambia la variable para saber el estado en que esta el agente agent.Coroutine(Wait(agent)); //Se llama la corutina para iniciar la espera de x segundos }
public override void UpdateState(AgenteEstatico agent) { }
//Corutina, nos permite hacer una "pausa" antes de ejecutar cierto código IEnumerator Wait(AgenteEstatico agent) { yield return(new WaitForSeconds(agent.timeIdle)); //Espera x segundos, depende del valor de la variable timeIdle agent.TransitionToState(agent.rotateState); //Cambia al estado de rotación }
public abstract void UpdateState(AgenteEstatico agent);
public abstract void EnterState(AgenteEstatico agent);
//Metodo que se manda llamar cuando se entra al estado de Idle public override void EnterState(AgenteEstatico agent) { Debug.Log("Entro a estado rotar"); //Mensaje en consola de Unity agent.agentStatus = AgentState.OnMovement; //Se cambia la variable para indicar el estado en que se encuentra el agente }
public override void UpdateState(AgenteEstatico agent) { //necesario preguntar si se ha detectado al jugador //agent.StopAllCoroutines();//Esto detiene la corutina de Wait que esta en este código //Si es verdad, cambiar al estado de atacar }
public override void EnterState(AgenteEstatico agent) { //Código para cuando entra al estado de atacar }
public override void UpdateState(AgenteEstatico agent) { //Código para cuando no se detecta al jugador }