[TUTORIAL] IA inimigo combate "Final"
2 participantes
Página 1 de 1
[TUTORIAL] IA inimigo combate "Final"
Então esse é o fim da minha serie de IA em terceira pessoa ,no video adiante iremos finalizar o combate e fazer
a morte do nosso inimigo.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public enum EnemyStates { Parado, Patrulha, Seguir, Rodear, Lutar }
public class EnemyIA : MonoBehaviour
{
public EnemyStates myStates = EnemyStates.Patrulha;
Animator animator;
NavMeshAgent agent;
DamageInt damageInt;
//alvo
public Transform player;
//vision
[Header("visão")]
public float anguloVision = 90;
public float minDistVision = 10;
public Transform olho;
public float vTimer = 0;
public float vtAmount = 0.1f;
[Header("patrulha")]
public Transform pathDad;
public Transform[] paths;
public float minDist = 2;
int pathIndice = 0;
//animações
float vertical;
float horizontal;
//seguir
[Header("seguir")]
public float maxDist = 8;
//rodear
[Header("rodear")]
bool walkRight = false;
public float minDistRodear = 3;
public float rodearContador = 0;
public float timeToChangeDir = 10;
//combate
[Header("combate")]
public string[] atks;
public float atkDistance = 0.8f;
bool isReady = true;
public float timeToGoAtk = 4;
public float cDelayAtk = 0;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
agent = GetComponent<NavMeshAgent>();
damageInt = GetComponent<DamageInt>();
paths = pathDad.GetComponentsInChildren<Transform>();
player = GameObject.FindGameObjectWithTag("Player").transform;
olho = transform.GetChild(0);
}
// Update is called once per frame
void Update()
{
if(damageInt.hp <= 0){
bool dAnim = animator.GetCurrentAnimatorStateInfo(0).IsName("morte");
if(!dAnim)
animator.Play("morte");
SetMove(false,false,0,0);
return;
}
switch (myStates)
{
case EnemyStates.Parado:
parado();
break;
case EnemyStates.Patrulha:
patrulha();
break;
case EnemyStates.Seguir:
seguir();
break;
case EnemyStates.Rodear:
rodear();
break;
case EnemyStates.Lutar:
lutar();
break;
}
AnimUpdate();
}
void parado(){
SetMove(true,false,0,0);
VisionTimer();
}
void AnimUpdate(){
animator.SetFloat("vertical",vertical);
animator.SetFloat("horizontal",horizontal);
}
void SetMove(bool rm, bool ag, float v, float h){
animator.applyRootMotion = rm;
agent.enabled = ag;
vertical = Mathf.Lerp(vertical, v, 2 * Time.deltaTime);
horizontal = Mathf.Lerp(horizontal, h, 2 * Time.deltaTime);
}
void patrulha(){
if(pathDad == null){
myStates = EnemyStates.Parado;
return;
}
VisionTimer();
if(Ver()){
return;
}
float dis = Vector3.Distance(paths[pathIndice].position,transform.position);
if(dis <= minDist){
pathIndice = Random.Range(0,paths.Length);
}
else{
if(agent.enabled)
agent.destination = paths[pathIndice].position;
}
SetMove(false, true, 1,0);
}
void seguir(){
SetMove(false,true,2,0);
agent.destination = player.position;
float dist = Vector3.Distance(player.position,transform.position);
if(dist <= minDist){
myStates = EnemyStates.Rodear;
}
}
void rodear(){
float dist = Vector3.Distance(player.position,transform.position);
if(dist >= maxDist){
myStates = EnemyStates.Seguir;
}
Vector3 playerDir = new Vector3(player.position.x,0,player.position.z);
transform.LookAt(playerDir);
if(dist < minDistRodear){
SetMove(true,false,-1,0);
}
else{
if(walkRight){
SetMove(true,false,0,1);
rodearContador += Time.deltaTime;
if(ItsTime(rodearContador,timeToChangeDir)){
walkRight = !walkRight;
rodearContador = 0;
}
}
else{
SetMove(true,false,0,-1);
rodearContador += Time.deltaTime;
if(ItsTime(rodearContador,timeToChangeDir)){
walkRight = !walkRight;
rodearContador = 0;
}
}
}
if(ItsTime(cDelayAtk,timeToGoAtk)){
myStates = EnemyStates.Lutar;
cDelayAtk = 0;
}
else{
cDelayAtk += Time.deltaTime;
}
}
void lutar(){
float dist = Vector3.Distance(player.position,transform.position);
if(dist >= maxDist){
myStates = EnemyStates.Seguir;
}
if(dist <= atkDistance){
if(isReady){
int r = Random.Range(0,atks.Length);
animator.CrossFade(atks[r],2 * Time.deltaTime);
isReady = false;
}
SetMove(true,false, 0,0);
}
else{
SetMove(false,true,2,0);
if(agent.enabled)
agent.destination = player.position;
}
}
void StopAtk(){
myStates = EnemyStates.Rodear;
isReady = true;
}
void VisionTimer(){
if(Ver()){
vTimer += vtAmount;
SetMove(true,false,0,0);
}
else{
vTimer -= vtAmount;
}
vTimer = Mathf.Clamp(vTimer,0,1);
if(vTimer >= 1){
myStates = EnemyStates.Seguir;
}
if(vTimer <= 0 && myStates == EnemyStates.Seguir){
if(pathDad == null){
myStates = EnemyStates.Parado;
}
else{
myStates = EnemyStates.Patrulha;
}
}
}
bool Ver(){
Vector3 dir = player.position - transform.position;
float angle = Vector3.Angle(transform.forward, dir);
float dist = Vector3.Distance(player.position,transform.position);
RaycastHit hit;
if(angle < anguloVision && dist <= minDistVision){
if(Physics.Linecast(olho.position, player.position,out hit)){
if(hit.transform.tag == "Player"){
return true;
}
else{ return false; }
}
else{ return false; }
}
else{
return false;
}
}
bool ItsTime(float cValue,float maxValue){
if(cValue >= maxValue){
return true;
}
else{
return false;
}
}
void die(){
//instanciar um efeito
Destroy(this.gameObject);
}
}
Esse script é somente a base ,vcs podem acrescentar coisas para ficar mais rico combate ,como uma esquiva ou defesa pro inimigo.
Os mais pros que quiserem deixar sugestões ,estarei sempre a ouvidos pra evoluir que é sempre importante e o script parece meio rudimentar
kkkkkk.
a morte do nosso inimigo.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
public enum EnemyStates { Parado, Patrulha, Seguir, Rodear, Lutar }
public class EnemyIA : MonoBehaviour
{
public EnemyStates myStates = EnemyStates.Patrulha;
Animator animator;
NavMeshAgent agent;
DamageInt damageInt;
//alvo
public Transform player;
//vision
[Header("visão")]
public float anguloVision = 90;
public float minDistVision = 10;
public Transform olho;
public float vTimer = 0;
public float vtAmount = 0.1f;
[Header("patrulha")]
public Transform pathDad;
public Transform[] paths;
public float minDist = 2;
int pathIndice = 0;
//animações
float vertical;
float horizontal;
//seguir
[Header("seguir")]
public float maxDist = 8;
//rodear
[Header("rodear")]
bool walkRight = false;
public float minDistRodear = 3;
public float rodearContador = 0;
public float timeToChangeDir = 10;
//combate
[Header("combate")]
public string[] atks;
public float atkDistance = 0.8f;
bool isReady = true;
public float timeToGoAtk = 4;
public float cDelayAtk = 0;
// Start is called before the first frame update
void Start()
{
animator = GetComponent<Animator>();
agent = GetComponent<NavMeshAgent>();
damageInt = GetComponent<DamageInt>();
paths = pathDad.GetComponentsInChildren<Transform>();
player = GameObject.FindGameObjectWithTag("Player").transform;
olho = transform.GetChild(0);
}
// Update is called once per frame
void Update()
{
if(damageInt.hp <= 0){
bool dAnim = animator.GetCurrentAnimatorStateInfo(0).IsName("morte");
if(!dAnim)
animator.Play("morte");
SetMove(false,false,0,0);
return;
}
switch (myStates)
{
case EnemyStates.Parado:
parado();
break;
case EnemyStates.Patrulha:
patrulha();
break;
case EnemyStates.Seguir:
seguir();
break;
case EnemyStates.Rodear:
rodear();
break;
case EnemyStates.Lutar:
lutar();
break;
}
AnimUpdate();
}
void parado(){
SetMove(true,false,0,0);
VisionTimer();
}
void AnimUpdate(){
animator.SetFloat("vertical",vertical);
animator.SetFloat("horizontal",horizontal);
}
void SetMove(bool rm, bool ag, float v, float h){
animator.applyRootMotion = rm;
agent.enabled = ag;
vertical = Mathf.Lerp(vertical, v, 2 * Time.deltaTime);
horizontal = Mathf.Lerp(horizontal, h, 2 * Time.deltaTime);
}
void patrulha(){
if(pathDad == null){
myStates = EnemyStates.Parado;
return;
}
VisionTimer();
if(Ver()){
return;
}
float dis = Vector3.Distance(paths[pathIndice].position,transform.position);
if(dis <= minDist){
pathIndice = Random.Range(0,paths.Length);
}
else{
if(agent.enabled)
agent.destination = paths[pathIndice].position;
}
SetMove(false, true, 1,0);
}
void seguir(){
SetMove(false,true,2,0);
agent.destination = player.position;
float dist = Vector3.Distance(player.position,transform.position);
if(dist <= minDist){
myStates = EnemyStates.Rodear;
}
}
void rodear(){
float dist = Vector3.Distance(player.position,transform.position);
if(dist >= maxDist){
myStates = EnemyStates.Seguir;
}
Vector3 playerDir = new Vector3(player.position.x,0,player.position.z);
transform.LookAt(playerDir);
if(dist < minDistRodear){
SetMove(true,false,-1,0);
}
else{
if(walkRight){
SetMove(true,false,0,1);
rodearContador += Time.deltaTime;
if(ItsTime(rodearContador,timeToChangeDir)){
walkRight = !walkRight;
rodearContador = 0;
}
}
else{
SetMove(true,false,0,-1);
rodearContador += Time.deltaTime;
if(ItsTime(rodearContador,timeToChangeDir)){
walkRight = !walkRight;
rodearContador = 0;
}
}
}
if(ItsTime(cDelayAtk,timeToGoAtk)){
myStates = EnemyStates.Lutar;
cDelayAtk = 0;
}
else{
cDelayAtk += Time.deltaTime;
}
}
void lutar(){
float dist = Vector3.Distance(player.position,transform.position);
if(dist >= maxDist){
myStates = EnemyStates.Seguir;
}
if(dist <= atkDistance){
if(isReady){
int r = Random.Range(0,atks.Length);
animator.CrossFade(atks[r],2 * Time.deltaTime);
isReady = false;
}
SetMove(true,false, 0,0);
}
else{
SetMove(false,true,2,0);
if(agent.enabled)
agent.destination = player.position;
}
}
void StopAtk(){
myStates = EnemyStates.Rodear;
isReady = true;
}
void VisionTimer(){
if(Ver()){
vTimer += vtAmount;
SetMove(true,false,0,0);
}
else{
vTimer -= vtAmount;
}
vTimer = Mathf.Clamp(vTimer,0,1);
if(vTimer >= 1){
myStates = EnemyStates.Seguir;
}
if(vTimer <= 0 && myStates == EnemyStates.Seguir){
if(pathDad == null){
myStates = EnemyStates.Parado;
}
else{
myStates = EnemyStates.Patrulha;
}
}
}
bool Ver(){
Vector3 dir = player.position - transform.position;
float angle = Vector3.Angle(transform.forward, dir);
float dist = Vector3.Distance(player.position,transform.position);
RaycastHit hit;
if(angle < anguloVision && dist <= minDistVision){
if(Physics.Linecast(olho.position, player.position,out hit)){
if(hit.transform.tag == "Player"){
return true;
}
else{ return false; }
}
else{ return false; }
}
else{
return false;
}
}
bool ItsTime(float cValue,float maxValue){
if(cValue >= maxValue){
return true;
}
else{
return false;
}
}
void die(){
//instanciar um efeito
Destroy(this.gameObject);
}
}
Esse script é somente a base ,vcs podem acrescentar coisas para ficar mais rico combate ,como uma esquiva ou defesa pro inimigo.
Os mais pros que quiserem deixar sugestões ,estarei sempre a ouvidos pra evoluir que é sempre importante e o script parece meio rudimentar
kkkkkk.
hendrick22- MembroAvançado
- PONTOS : 2688
REPUTAÇÃO : 57
Idade : 25
Respeito as regras :
Re: [TUTORIAL] IA inimigo combate "Final"
obrigado ,essa é a intenção.RafaelSquid1 escreveu:Tutorial vai ajudar muita gente, parabéns ai \o/
hendrick22- MembroAvançado
- PONTOS : 2688
REPUTAÇÃO : 57
Idade : 25
Respeito as regras :
Tópicos semelhantes
» [TUTORIAL] IA inimigo combate rodear
» [TUTORIAL] IA inimigo (patrulha)
» [TUTORIAL] Dano baseado na distância do inimigo
» [TUTORIAL] IA inimigo (visão e seguir jogador)
» [TUTORIAL] Inteligência artificial, inimigo e AIPoints
» [TUTORIAL] IA inimigo (patrulha)
» [TUTORIAL] Dano baseado na distância do inimigo
» [TUTORIAL] IA inimigo (visão e seguir jogador)
» [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos