[RESOLVIDO] Erro de Logica com IA
2 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] Erro de Logica com IA
Galera estou tendo um problema com codigo abaixo que é o seguinte, tenho 3 portões os inimigos vao para o portão mais proximo e ataca ele até destruir destruindo o portão ele passar atacar a porta e depois o player...
o problema é que quando destruo o porta 01 automaticamente os inimigos passam pela 02 e 03 sem destrui-la ou vice versa,
pra ser mais claro tenho inimigo no portão dois e na portao um, quando os inimigos da portao um destrui-la somente eles passaram ataca o proximo alvo, porem todos estao indo atacar..
como resolvo isto onde esta meu erro????
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[RequireComponent(typeof(NavMeshAgent))]
[RequireComponent(typeof(AudioSource))]
public class inimigo : MonoBehaviour
{
private NavMeshAgent navMesh;
public AudioClip DanoSom;
public AudioClip BatendoPorta;
AudioSource audioSource;
Transform player;
Transform Padre;
Transform porta;
Transform madeirasObjec;
public Transform efeitoSangue;
public Animator zumbiAnim;
public float distoPlayer;
public float distaPorta;
public float timeAtacck = 0.5f;
public int attackDemaga = 3;
int atackMadeira = 1;
float timer;
public float tempoMadeira;
int lifePersonagem;
int lifeMadeira;
// bool atacaPorta;
bool atacaPlayer;
bool PlayerVivo;
public int startingHealth = 10;
public int currentHealth;
bool isDead;
public int damagePerShot = 10;
//public bool PortaOrPlayer;
public Transform DestinoZumbi;
public float minDistance = 15;
//public GameObject [] portoesExterno;
public Transform[] Portoes;
// public float Menor;
// public GameObject instanciador;
public float[] DistaPortoes = new float[3];
public bool ZumbiEsperto;
bool PegarPlayer;
void Awake() {
currentHealth = startingHealth;
}
void Start() {
this.GetComponent<NavMeshAgent>().enabled = false;
StartCoroutine(Example());
player = GameObject.FindWithTag("Player").transform;
porta = GameObject.FindWithTag("PortaPraCima").transform;
DestinoZumbi = GameObject.FindWithTag("DestinoZumbi").transform;
Portoes[0] = GameObject.FindWithTag("portao1").transform;
Portoes[1] = GameObject.FindWithTag("portao2").transform;
Portoes[2] = GameObject.FindWithTag("portao3").transform;
audioSource = GetComponent<AudioSource>();
madeirasObjec = GameObject.FindWithTag("madeira").transform;
navMesh = GetComponent<NavMeshAgent>();
lifePersonagem = player.GetComponent<movePersonagem>().lifeAtual;
PlayerVivo = player.GetComponent<movePersonagem>().isDead;
}
IEnumerator Example()
{
yield return new WaitForSeconds(2);
this.GetComponent<NavMeshAgent>().enabled = true;
}
void Update() {
timer += Time.deltaTime;
tempoMadeira += Time.deltaTime;
zumbiAnim.SetBool("andando", true);
/*
*/
for (int i = 0; i < Portoes.Length; i++) {
DistaPortoes = Vector3.Distance(this.transform.position, Portoes.position);
if (DistaPortoes[i] <= minDistance) {
if (Portoes[i].GetComponent 0) {
navMesh.SetDestination(Portoes[i].position);
}
}
if (DistaPortoes[i] <= 5f) {
zumbiAnim.SetBool("Atack", true);
zumbiAnim.SetBool("andando", false);
if (tempoMadeira > 3 && Portoes[i].GetComponent<madeiras>().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
Portoes[i].GetComponent<madeiras>().DanoMadeira(atackMadeira);
}
}
if (Portoes[i].GetComponent<madeiras>().LifeMadeiraAtual <= 0) {
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
PegarPlayer = true;
}
if ((PlayerVivo == false) && (PegarPlayer)) {
distoPlayer = Vector3.Distance(transform.position, player.position);
if (timer >= timeAtacck && (distoPlayer <= 3f)) {
attack();
}
if ((ZumbiEsperto) && (distoPlayer <= 2.3f)) {
player.GetComponent }
if ((player.position.y <= 14f) || (transform.position.y >= 14)) {
navMesh.SetDestination(player.position);
}
else {
navMesh.SetDestination(porta.position);
}
}
}
distaPorta = Vector3.Distance(transform.position, porta.position);
if (distaPorta <= 4.5f) {
zumbiAnim.SetBool("Atack", true);
zumbiAnim.SetBool("andando", false);
audioSource.PlayOneShot(BatendoPorta, 0.7F);
if (tempoMadeira > 3 && madeirasObjec.GetComponent<madeiras>().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
madeirasObjec.GetComponent<madeiras>().DanoMadeira(atackMadeira);
}
}
if ((madeirasObjec.GetComponent<madeiras>().LifeMadeiraAtual <= 0) && (distaPorta <= 4f)) {
navMesh.Warp(DestinoZumbi.position);
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
}
}
void attack() {
timer = 0;
if (lifePersonagem > 0) {
zumbiAnim.SetBool("andando", false);
zumbiAnim.SetBool("Atack", true);
player.GetComponent<movePersonagem>().TakeDano(attackDemaga);
}
}
public void TakeDamage(int amount) {
if (isDead)
return;
currentHealth -= amount;
[i]// Debug.Log("Acertou");
zumbiAnim.SetBool("Atack", false);
zumbiAnim.SetBool("andando", false);
zumbiAnim.SetTrigger("dano");
Instantiate(efeitoSangue, transform.position, transform.rotation);
if (currentHealth <= 0) {
Death();
}
}
void Death() {
isDead = true;
StartCoroutine("MorreuZumbi");
this.GetComponent }
IEnumerator MorreuZumbi() {
yield return new WaitForSeconds(2);
zumbiAnim.SetBool("morreu", true);
Destroy(this.gameObject, 0.3f);
}
void OnCollisionEnter(Collision hit)
{
if (hit.transform.tag == "bala")
{
TakeDamage(damagePerShot);
audioSource.PlayOneShot(DanoSom, 0.7F);
zumbiAnim.SetBool("andando", false);
//Destroy(gameObject);
}
}
void OnTriggerEnter(Collider hit)
{
if (hit.transform.tag == "Sensor1")
{
Debug.Log("ColidiuComInimigo");
}
}
}[/i][/i][/i][/i][/i][/i][/i][/i]
o problema é que quando destruo o porta 01 automaticamente os inimigos passam pela 02 e 03 sem destrui-la ou vice versa,
pra ser mais claro tenho inimigo no portão dois e na portao um, quando os inimigos da portao um destrui-la somente eles passaram ataca o proximo alvo, porem todos estao indo atacar..
como resolvo isto onde esta meu erro????
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.AI;
using UnityEngine.SceneManagement;
using UnityEngine.UI;
[RequireComponent(typeof(NavMeshAgent))]
[RequireComponent(typeof(AudioSource))]
public class inimigo : MonoBehaviour
{
private NavMeshAgent navMesh;
public AudioClip DanoSom;
public AudioClip BatendoPorta;
AudioSource audioSource;
Transform player;
Transform Padre;
Transform porta;
Transform madeirasObjec;
public Transform efeitoSangue;
public Animator zumbiAnim;
public float distoPlayer;
public float distaPorta;
public float timeAtacck = 0.5f;
public int attackDemaga = 3;
int atackMadeira = 1;
float timer;
public float tempoMadeira;
int lifePersonagem;
int lifeMadeira;
// bool atacaPorta;
bool atacaPlayer;
bool PlayerVivo;
public int startingHealth = 10;
public int currentHealth;
bool isDead;
public int damagePerShot = 10;
//public bool PortaOrPlayer;
public Transform DestinoZumbi;
public float minDistance = 15;
//public GameObject [] portoesExterno;
public Transform[] Portoes;
// public float Menor;
// public GameObject instanciador;
public float[] DistaPortoes = new float[3];
public bool ZumbiEsperto;
bool PegarPlayer;
void Awake() {
currentHealth = startingHealth;
}
void Start() {
this.GetComponent<NavMeshAgent>().enabled = false;
StartCoroutine(Example());
player = GameObject.FindWithTag("Player").transform;
porta = GameObject.FindWithTag("PortaPraCima").transform;
DestinoZumbi = GameObject.FindWithTag("DestinoZumbi").transform;
Portoes[0] = GameObject.FindWithTag("portao1").transform;
Portoes[1] = GameObject.FindWithTag("portao2").transform;
Portoes[2] = GameObject.FindWithTag("portao3").transform;
audioSource = GetComponent<AudioSource>();
madeirasObjec = GameObject.FindWithTag("madeira").transform;
navMesh = GetComponent<NavMeshAgent>();
lifePersonagem = player.GetComponent<movePersonagem>().lifeAtual;
PlayerVivo = player.GetComponent<movePersonagem>().isDead;
}
IEnumerator Example()
{
yield return new WaitForSeconds(2);
this.GetComponent<NavMeshAgent>().enabled = true;
}
void Update() {
timer += Time.deltaTime;
tempoMadeira += Time.deltaTime;
zumbiAnim.SetBool("andando", true);
/*
*/
for (int i = 0; i < Portoes.Length; i++) {
DistaPortoes = Vector3.Distance(this.transform.position, Portoes.position);
if (DistaPortoes[i] <= minDistance) {
if (Portoes[i].GetComponent
navMesh.SetDestination(Portoes[i].position);
}
}
if (DistaPortoes[i] <= 5f) {
zumbiAnim.SetBool("Atack", true);
zumbiAnim.SetBool("andando", false);
if (tempoMadeira > 3 && Portoes[i].GetComponent<madeiras>().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
Portoes[i].GetComponent<madeiras>().DanoMadeira(atackMadeira);
}
}
if (Portoes[i].GetComponent<madeiras>().LifeMadeiraAtual <= 0) {
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
PegarPlayer = true;
}
if ((PlayerVivo == false) && (PegarPlayer)) {
distoPlayer = Vector3.Distance(transform.position, player.position);
if (timer >= timeAtacck && (distoPlayer <= 3f)) {
attack();
}
if ((ZumbiEsperto) && (distoPlayer <= 2.3f)) {
player.GetComponent
if ((player.position.y <= 14f) || (transform.position.y >= 14)) {
navMesh.SetDestination(player.position);
}
else {
navMesh.SetDestination(porta.position);
}
}
}
distaPorta = Vector3.Distance(transform.position, porta.position);
if (distaPorta <= 4.5f) {
zumbiAnim.SetBool("Atack", true);
zumbiAnim.SetBool("andando", false);
audioSource.PlayOneShot(BatendoPorta, 0.7F);
if (tempoMadeira > 3 && madeirasObjec.GetComponent<madeiras>().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
madeirasObjec.GetComponent<madeiras>().DanoMadeira(atackMadeira);
}
}
if ((madeirasObjec.GetComponent<madeiras>().LifeMadeiraAtual <= 0) && (distaPorta <= 4f)) {
navMesh.Warp(DestinoZumbi.position);
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
}
}
void attack() {
timer = 0;
if (lifePersonagem > 0) {
zumbiAnim.SetBool("andando", false);
zumbiAnim.SetBool("Atack", true);
player.GetComponent<movePersonagem>().TakeDano(attackDemaga);
}
}
public void TakeDamage(int amount) {
if (isDead)
return;
currentHealth -= amount;
[i]//
zumbiAnim.SetBool("Atack", false);
zumbiAnim.SetBool("andando", false);
zumbiAnim.SetTrigger("dano");
Instantiate(efeitoSangue, transform.position, transform.rotation);
if (currentHealth <= 0) {
Death();
}
}
void Death() {
isDead = true;
StartCoroutine("MorreuZumbi");
this.GetComponent
IEnumerator MorreuZumbi() {
yield return new WaitForSeconds(2);
zumbiAnim.SetBool("morreu", true);
Destroy(this.gameObject, 0.3f);
}
void OnCollisionEnter(Collision hit)
{
if (hit.transform.tag == "bala")
{
TakeDamage(damagePerShot);
audioSource.PlayOneShot(DanoSom, 0.7F);
zumbiAnim.SetBool("andando", false);
//Destroy(gameObject);
}
}
void OnTriggerEnter(Collider hit)
{
if (hit.transform.tag == "Sensor1")
{
Debug.Log("ColidiuComInimigo");
}
}
}[/i][/i][/i][/i][/i][/i][/i][/i]
Última edição por dstaroski em Qua Dez 06, 2017 8:54 pm, editado 1 vez(es) (Motivo da edição : Resolvido)
Re: [RESOLVIDO] Erro de Logica com IA
Olá, use o botão script para melhor visualização do código, na próxima vez... Bem, pelo que vejo, creio que seja nessa parte:
Conforme ele detecta que uma porta está com life == 0, ele manda pegar o player... Crie um inteiro, que incrementa conforme a porta for destruída e quando chegar na quantidade total que deve ser, você passa o método para pegar o player dai. E sugiro que crie um bool para quando tu for destruir, ele ative para passar apenas a função uma vez a cada destruição... Ex:
- Código:
if (DistaPortoes[i] <= 5f) {
zumbiAnim.SetBool("Atack", true);
zumbiAnim.SetBool("andando", false);
if (tempoMadeira > 3 && Portoes[i].GetComponent().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
Portoes[i].GetComponent().DanoMadeira(atackMadeira);
}
}
if (Portoes[i].GetComponent().LifeMadeiraAtual <= 0) {
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
PegarPlayer = true;
}
Conforme ele detecta que uma porta está com life == 0, ele manda pegar o player... Crie um inteiro, que incrementa conforme a porta for destruída e quando chegar na quantidade total que deve ser, você passa o método para pegar o player dai. E sugiro que crie um bool para quando tu for destruir, ele ative para passar apenas a função uma vez a cada destruição... Ex:
- Código:
public int ammountDestroyed = 0;
[...]
//Todo o resto do código
[...]
if (Portoes[i].GetComponent().LifeMadeiraAtual <= 0 && !Portoes[i].GetComponent().destroyed)
{
Portoes[i].GetComponent().destroyed = true;
ammountDestroyed++;
if(ammountDestroyed == 3)
{
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
PegarPlayer = true;
}
}
Re: [RESOLVIDO] Erro de Logica com IA
Entendi chegando em casa farei o teste....
não sabia deste lance do Script.. foi malws...
vlw pela dica!
não sabia deste lance do Script.. foi malws...
vlw pela dica!
Re: [RESOLVIDO] Erro de Logica com IA
pelo que entendi do codigo somente apos portões destruídos ele atacara o player,
este destroyed é o que? uma boleana que fala se o portão ta destruido ou nao?
imagine um triangulo e cada ponta tem portão o player esta no meio os inimigos virão de todos os portões após destruir o portao de uma porta os inimigo que estao naquela porta devem ir diretamente para o player..
sem o navMesh eu consigo fazer isto pq o portão nao destroi enquanto o life nao chegar a zero...
porem com navMesh ta dando este b.o.zinho ai quando destroy qualquer portão todos inimigos independente da posição ataca o player
este destroyed é o que? uma boleana que fala se o portão ta destruido ou nao?
imagine um triangulo e cada ponta tem portão o player esta no meio os inimigos virão de todos os portões após destruir o portao de uma porta os inimigo que estao naquela porta devem ir diretamente para o player..
sem o navMesh eu consigo fazer isto pq o portão nao destroi enquanto o life nao chegar a zero...
porem com navMesh ta dando este b.o.zinho ai quando destroy qualquer portão todos inimigos independente da posição ataca o player
Re: [RESOLVIDO] Erro de Logica com IA
Ata, desculpe-me, eu entendi de uma forma errada... No caso, tu queria um sistema de "lanes"? Como se cada portão fosse uma lane e quando destruído o portão, os que estiverem na lane vão e atacam o player? Caso seja, tu terá que no caso, em vez de criar o boolean, crie um enumerator ou um inteiro, e nos portões declarar o mesmo... Dai quando destruir, passar essa informações apenas para os inimigos de acordo com o portão... Como é algo mais complexo, agora não consigo te ajudar, mas caso não consiga posso lhe ajudar amanhã...
Re: [RESOLVIDO] Erro de Logica com IA
eh exatamente isto, aparentemente se um portão é destruído todos outros inimigos passar atacar o player.. nao era pra ser assim, to quebrando a cabeça aqui tentando fazer sem tirar o NavMesh; se conseguir elaborar algo ficaria muito agradecido!recagonlei escreveu:Ata, desculpe-me, eu entendi de uma forma errada... No caso, tu queria um sistema de "lanes"? Como se cada portão fosse uma lane e quando destruído o portão, os que estiverem na lane vão e atacam o player? Caso seja, tu terá que no caso, em vez de criar o boolean, crie um enumerator ou um inteiro, e nos portões declarar o mesmo... Dai quando destruir, passar essa informações apenas para os inimigos de acordo com o portão... Como é algo mais complexo, agora não consigo te ajudar, mas caso não consiga posso lhe ajudar amanhã...
Re: [RESOLVIDO] Erro de Logica com IA
Na verdade, o conceito é bem simples... Eu sugiro, que pelo menos para testes, você adicione um int no inimigo e no portão como eu disse... Quando spawnar para tal portão, tu modifica o inteiro para casar com ele... Dai tu coloca naquele método que eu mostrei, para detectar se é o portão que te pertence para avançar, dai e sugiro que deixa a variável destroyed também, pois senão vai ficar atualizando o valor toda a hora, mesmo que seja algo já alterado, é uma questão de otimização ex:
Dai só criar a variável m_myNumber no script do portão e cada um coloque o valor de acord(0, 1 e 2) e na hora que spawnar a orda para o portão 1, por exemplo, você acessa o script do inimigo e altera o m_myGate para 1... Veja se dessa forma, funcionará!
- Código:
public int m_myGate = 0;
[...]
//Todo o resto do código
[...]
if (Portoes[i].GetComponent().LifeMadeiraAtual <= 0 && !Portoes[i].GetComponent().destroyed)
Portoes[i].GetComponent().destroyed = true;
else if(!PegarPlayer && Portoes[i].GetComponent().m_myNumber == m_myGate){
zumbiAnim.SetBool("andando", true);
zumbiAnim.SetBool("Atack", false);
PegarPlayer = true;
}
Dai só criar a variável m_myNumber no script do portão e cada um coloque o valor de acord(0, 1 e 2) e na hora que spawnar a orda para o portão 1, por exemplo, você acessa o script do inimigo e altera o m_myGate para 1... Veja se dessa forma, funcionará!
Re: [RESOLVIDO] Erro de Logica com IA
- Código:
for (int i = 0; i < Portoes.Length; i++){
DistaPortoes[i] = Vector3.Distance(this.transform.position, Portoes[i].position);
if (DistaPortoes[i] <= minDistance) {
meuNumero = i;
if (DistaPortoes [i] <= 5f) {
zumbiAnim.SetBool ("Atack", true);
zumbiAnim.SetBool ("andando", false);
if (tempoMadeira > 3 && Portoes [i].GetComponent<madeiras> ().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
Portoes [i].GetComponent<madeiras> ().DanoMadeira (atackMadeira);
}
}
}
// float distanciaPadre = Vector3.Distance(transform.position, Padre.position);
if (meuNumero == 0) {
navMesh.SetDestination (Portoes [0].position);
if (Portoes [0].GetComponent<madeiras> ().PortaoExiste == true) {
PegarPlayer = false;
} else {
PegarPlayer = true;
}
}
if (meuNumero == 1) {
navMesh.SetDestination (Portoes [1].position);
if (Portoes [1].GetComponent<madeiras> ().PortaoExiste == true) {
PegarPlayer = false;
} else {
PegarPlayer = true;
}
}
if (meuNumero == 2) {
navMesh.SetDestination (Portoes [2].position);
if (Portoes [2].GetComponent<madeiras> ().PortaoExiste == true) {
PegarPlayer = false;
} else {
PegarPlayer = true;
}
}
meu amigo, o código ficou deste jeito deu certinho vlw pela dica
Re: [RESOLVIDO] Erro de Logica com IA
Parabéns por ter conseguido velho, muito bom... Mas acho que uma otimizada seria se pasasse um for, tipo assim:
Talvez assim fique melhor, não?.. E valores do tipo bool, não precisam ser exatamente comparados com o operador ==, pode ser usado a exclamação(!) para detectar falso ou sem ela, para detectar true... Não sei se funcionará bem, pois não tenho como testar agora, mas pode ser que fique melhor! Abraços!
- Código:
for (int i = 0; i < Portoes.Length; i++){
DistaPortoes[i] = Vector3.Distance(this.transform.position, Portoes[i].position);
if (DistaPortoes[i] <= minDistance) {
meuNumero = i;
if (DistaPortoes [i] <= 5f) {
zumbiAnim.SetBool ("Atack", true);
zumbiAnim.SetBool ("andando", false);
if (tempoMadeira > 3 && Portoes [i].GetComponent<madeiras> ().LifeMadeiraAtual > 0) {
tempoMadeira = 0;
Portoes [i].GetComponent<madeiras> ().DanoMadeira (atackMadeira);
}
}
}
// float distanciaPadre = Vector3.Distance(transform.position, Padre.position);
if (meuNumero == i) {
navMesh.SetDestination (Portoes [i].position);
if (!Portoes [k].GetComponent<madeiras> ().PortaoExiste && !PegarPlayer) {
PegarPlayer = true;
}
}
}
Talvez assim fique melhor, não?.. E valores do tipo bool, não precisam ser exatamente comparados com o operador ==, pode ser usado a exclamação(!) para detectar falso ou sem ela, para detectar true... Não sei se funcionará bem, pois não tenho como testar agora, mas pode ser que fique melhor! Abraços!
Re: [RESOLVIDO] Erro de Logica com IA
vou testar e te falo... vlw Amigo... precisando dar uma otimizada em todos scripts vlw
Tópicos semelhantes
» [RESOLVIDO] erro de dll's
» [RESOLVIDO] Erro Material C#
» [RESOLVIDO] Erro Som.
» [RESOLVIDO] Erro no Baú
» [RESOLVIDO] Erro
» [RESOLVIDO] Erro Material C#
» [RESOLVIDO] Erro Som.
» [RESOLVIDO] Erro no Baú
» [RESOLVIDO] Erro
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos