Preciso de ajuda com esse script da IA de um inimigo
Página 1 de 1
Preciso de ajuda com esse script da IA de um inimigo
Comecei a aprender a programar agora, estou fazendo um jogo para ir pegando o jeito da coisa, mas estou com algumas dificuldades.
Este script foi o schultz que postou no canal dele, apenas modifiquei alguns parâmetros, na minha cabeça isso já deveria funcionar de forma razoável, mas na prática é um caos total, o inimigo deveria usar os waypoints para passear pelo mapa, somente quando o player estiver no raio do alcance, o inimigo faz uma breve pausa para fazer uma animação de targetting e começa a perseguir o alvo, se ele estiver perto o suficiente ele ataca.Algumas vezes quando dou play funciona como deveria, mas outras vezes o inimigo fica correndo em um loop infinito sem sair do lugar, outro problema simples que ja me causou uma bela dor de cabeça é que quando subo em algum lugar alto, eu queria que o inimigo agisse como o IA Third Person Character, mas quando subo em algum lugar ele fica parado na animação de correr, sei que é algo bem simples, mas já passei algumas horas tentando resolver isso e simplesmente não tenho o conhecimento necessário, se alguém poder me dar alguma sugestão fico grato. Obs: não reparem na bagunça com os booleans de animação Hu3.
[list=linenums]
[*]using UnityEngine;
[*]using System.Collections;
[*]using UnityEngine.AI;
[*]public class IA2 : MonoBehaviour {
[*] public Transform Player;
[*] Animator anim;
[*] private NavMeshAgent nav;
[*] private float distanciaDoPlayer, distanciaDoDestino;
[*] public float DistanciaDeSeguir = 20, DistanciaDeAtacar = 2, VelocidadeDePasseio = 3, VelocidadeDePerseguicao = 6,TempoPorAtaque = 1.5f, DanoDoInimigo = 40;
[*] private bool vendoOPlayer;
[*] public Transform[] DestinosAleatorios;
[*] private float tempoDeTarget;
[*] private int destinoAtual;
[*] private bool perseguindoAlgo, tempoPerseguindoAlgo,atacandoAlgo;
[*] private float cronometroDaPerseguicao,cronometroDeAtaque;
[*] void Start (){
[*] destinoAtual = Random.Range (0, DestinosAleatorios.Length);
[*] nav = transform.GetComponent<NavMeshAgent> ();
[*] anim = GetComponent <Animator> ();
[*] }
[*] void Update (){
[*] distanciaDoPlayer = Vector3.Distance(Player.transform.position,transform.position);
[*] distanciaDoDestino = Vector3.Distance(DestinosAleatorios[destinoAtual].transform.position,transform.position);
[*] //============================== RAYCAST ===================================//
[*] RaycastHit hit;
[*] Vector3 deOnde = transform.position;
[*] Vector3 paraOnde = Player.transform.position;
[*] Vector3 direction = paraOnde - deOnde;
[*] if(Physics.Raycast (transform.position,direction,out hit,1000) && distanciaDoPlayer <= DistanciaDeSeguir ){
[*] if(hit.collider.gameObject.CompareTag("Player")){
[*] vendoOPlayer = true;
[*] }else{
[*] vendoOPlayer = false;
[*] }
[*] }
[*] //================ CHECHAGENS E DECISOES DO INIMIGO ================//
[*] if(distanciaDoPlayer > DistanciaDeSeguir){
[*] Passear();
[*] }
[*] //COMANDO DE ATACAR COM ANIMAÇÃO DE TARGET
[*] if (distanciaDoPlayer <= DistanciaDeSeguir && distanciaDoPlayer > DistanciaDeAtacar) {
[*] if (vendoOPlayer == true){
[*] PerseguirTGT ();
[*] perseguindoAlgo = true;
[*] }
[*] else{
[*] Passear();
[*]
[*] }
[*] }
[*] if (distanciaDoPlayer <= DistanciaDeAtacar) {
[*] Atacar ();
[*] }
[*] //COMANDOS DE PASSEAR
[*] if (distanciaDoDestino <= 2) {
[*] destinoAtual = Random.Range (0, DestinosAleatorios.Length);
[*] Passear();
[*] }
[*] //CONTADORES DE PERSEGUICAO
[*] if (tempoPerseguindoAlgo == true) {
[*] cronometroDaPerseguicao += Time.deltaTime;
[*] }
[*] if (cronometroDaPerseguicao >= 10 && vendoOPlayer == false) {
[*] tempoPerseguindoAlgo = false;
[*] cronometroDaPerseguicao = 0;
[*] perseguindoAlgo = false;
[*] Passear ();
[*] }
[*] // CONTADOR DE ATAQUE
[*] if (atacandoAlgo == true) {
[*] cronometroDeAtaque += Time.deltaTime;
[*] }
[*] if (cronometroDeAtaque >= TempoPorAtaque) {
[*] Controle.VidaAtual = Controle.VidaAtual - DanoDoInimigo;
[*] atacandoAlgo = false;
[*] cronometroDeAtaque = 0;
[*] anim.SetBool ("CorrerDNV" , true);
[*] anim.SetBool ("Atacar" , false);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("Correr" , false);
[*] anim.SetBool ("Andar" , false);
[*] anim.SetBool ("AndarDNV" , false);
[*] }
[*] }
[*] void Passear (){
[*] if (perseguindoAlgo == false) {
[*] nav.acceleration = 5;
[*] tempoDeTarget = 0;
[*] nav.speed = VelocidadeDePasseio;
[*] nav.destination = DestinosAleatorios [destinoAtual].position;
[*] anim.SetBool ("Andar" , true);
[*] anim.SetBool ("AndarDNV" , true);
[*] anim.SetBool ("Correr" , false);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("Atacar" , false);
[*] anim.SetBool ("CorrerDNV" , false);
[*] } else if (perseguindoAlgo == true) {
[*] tempoPerseguindoAlgo = true;
[*] }
[*] }
[*] void PerseguirTGT() {
[*] nav.speed = 0;
[*] tempoDeTarget += Time.deltaTime;
[*] anim.SetBool ("DarAgro" , true);
[*] if (tempoDeTarget >= 1.40f) {
[*] nav.acceleration = 20;
[*] nav.speed = VelocidadeDePerseguicao;
[*] nav.destination = Player.position;
[*] anim.SetBool ("Correr" , true);
[*] anim.SetBool ("CorrerDNV" , true);
[*] anim.SetBool ("Andar" , false);
[*] anim.SetBool ("Atacar" , false);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("AndarDNV" , false);
[*] }
[*] }
[*] void Atacar (){
[*] atacandoAlgo = true;
[*] anim.SetBool ("Atacar" , true);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("Correr" , false);
[*] anim.SetBool ("Andar" , false);
[*] anim.SetBool ("CorrerDNV" , false);
[*] anim.SetBool ("AndarDNV" , false);
[*] }
[*]}
[/list]
Este script foi o schultz que postou no canal dele, apenas modifiquei alguns parâmetros, na minha cabeça isso já deveria funcionar de forma razoável, mas na prática é um caos total, o inimigo deveria usar os waypoints para passear pelo mapa, somente quando o player estiver no raio do alcance, o inimigo faz uma breve pausa para fazer uma animação de targetting e começa a perseguir o alvo, se ele estiver perto o suficiente ele ataca.Algumas vezes quando dou play funciona como deveria, mas outras vezes o inimigo fica correndo em um loop infinito sem sair do lugar, outro problema simples que ja me causou uma bela dor de cabeça é que quando subo em algum lugar alto, eu queria que o inimigo agisse como o IA Third Person Character, mas quando subo em algum lugar ele fica parado na animação de correr, sei que é algo bem simples, mas já passei algumas horas tentando resolver isso e simplesmente não tenho o conhecimento necessário, se alguém poder me dar alguma sugestão fico grato. Obs: não reparem na bagunça com os booleans de animação Hu3.
[list=linenums]
[*]using UnityEngine;
[*]using System.Collections;
[*]using UnityEngine.AI;
[*]public class IA2 : MonoBehaviour {
[*] public Transform Player;
[*] Animator anim;
[*] private NavMeshAgent nav;
[*] private float distanciaDoPlayer, distanciaDoDestino;
[*] public float DistanciaDeSeguir = 20, DistanciaDeAtacar = 2, VelocidadeDePasseio = 3, VelocidadeDePerseguicao = 6,TempoPorAtaque = 1.5f, DanoDoInimigo = 40;
[*] private bool vendoOPlayer;
[*] public Transform[] DestinosAleatorios;
[*] private float tempoDeTarget;
[*] private int destinoAtual;
[*] private bool perseguindoAlgo, tempoPerseguindoAlgo,atacandoAlgo;
[*] private float cronometroDaPerseguicao,cronometroDeAtaque;
[*] void Start (){
[*] destinoAtual = Random.Range (0, DestinosAleatorios.Length);
[*] nav = transform.GetComponent<NavMeshAgent> ();
[*] anim = GetComponent <Animator> ();
[*] }
[*] void Update (){
[*] distanciaDoPlayer = Vector3.Distance(Player.transform.position,transform.position);
[*] distanciaDoDestino = Vector3.Distance(DestinosAleatorios[destinoAtual].transform.position,transform.position);
[*] //============================== RAYCAST ===================================//
[*] RaycastHit hit;
[*] Vector3 deOnde = transform.position;
[*] Vector3 paraOnde = Player.transform.position;
[*] Vector3 direction = paraOnde - deOnde;
[*] if(Physics.Raycast (transform.position,direction,out hit,1000) && distanciaDoPlayer <= DistanciaDeSeguir ){
[*] if(hit.collider.gameObject.CompareTag("Player")){
[*] vendoOPlayer = true;
[*] }else{
[*] vendoOPlayer = false;
[*] }
[*] }
[*] //================ CHECHAGENS E DECISOES DO INIMIGO ================//
[*] if(distanciaDoPlayer > DistanciaDeSeguir){
[*] Passear();
[*] }
[*] //COMANDO DE ATACAR COM ANIMAÇÃO DE TARGET
[*] if (distanciaDoPlayer <= DistanciaDeSeguir && distanciaDoPlayer > DistanciaDeAtacar) {
[*] if (vendoOPlayer == true){
[*] PerseguirTGT ();
[*] perseguindoAlgo = true;
[*] }
[*] else{
[*] Passear();
[*]
[*] }
[*] }
[*] if (distanciaDoPlayer <= DistanciaDeAtacar) {
[*] Atacar ();
[*] }
[*] //COMANDOS DE PASSEAR
[*] if (distanciaDoDestino <= 2) {
[*] destinoAtual = Random.Range (0, DestinosAleatorios.Length);
[*] Passear();
[*] }
[*] //CONTADORES DE PERSEGUICAO
[*] if (tempoPerseguindoAlgo == true) {
[*] cronometroDaPerseguicao += Time.deltaTime;
[*] }
[*] if (cronometroDaPerseguicao >= 10 && vendoOPlayer == false) {
[*] tempoPerseguindoAlgo = false;
[*] cronometroDaPerseguicao = 0;
[*] perseguindoAlgo = false;
[*] Passear ();
[*] }
[*] // CONTADOR DE ATAQUE
[*] if (atacandoAlgo == true) {
[*] cronometroDeAtaque += Time.deltaTime;
[*] }
[*] if (cronometroDeAtaque >= TempoPorAtaque) {
[*] Controle.VidaAtual = Controle.VidaAtual - DanoDoInimigo;
[*] atacandoAlgo = false;
[*] cronometroDeAtaque = 0;
[*] anim.SetBool ("CorrerDNV" , true);
[*] anim.SetBool ("Atacar" , false);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("Correr" , false);
[*] anim.SetBool ("Andar" , false);
[*] anim.SetBool ("AndarDNV" , false);
[*] }
[*] }
[*] void Passear (){
[*] if (perseguindoAlgo == false) {
[*] nav.acceleration = 5;
[*] tempoDeTarget = 0;
[*] nav.speed = VelocidadeDePasseio;
[*] nav.destination = DestinosAleatorios [destinoAtual].position;
[*] anim.SetBool ("Andar" , true);
[*] anim.SetBool ("AndarDNV" , true);
[*] anim.SetBool ("Correr" , false);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("Atacar" , false);
[*] anim.SetBool ("CorrerDNV" , false);
[*] } else if (perseguindoAlgo == true) {
[*] tempoPerseguindoAlgo = true;
[*] }
[*] }
[*] void PerseguirTGT() {
[*] nav.speed = 0;
[*] tempoDeTarget += Time.deltaTime;
[*] anim.SetBool ("DarAgro" , true);
[*] if (tempoDeTarget >= 1.40f) {
[*] nav.acceleration = 20;
[*] nav.speed = VelocidadeDePerseguicao;
[*] nav.destination = Player.position;
[*] anim.SetBool ("Correr" , true);
[*] anim.SetBool ("CorrerDNV" , true);
[*] anim.SetBool ("Andar" , false);
[*] anim.SetBool ("Atacar" , false);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("AndarDNV" , false);
[*] }
[*] }
[*] void Atacar (){
[*] atacandoAlgo = true;
[*] anim.SetBool ("Atacar" , true);
[*] anim.SetBool ("DarAgro" , false);
[*] anim.SetBool ("Correr" , false);
[*] anim.SetBool ("Andar" , false);
[*] anim.SetBool ("CorrerDNV" , false);
[*] anim.SetBool ("AndarDNV" , false);
[*] }
[*]}
[/list]
Fluttershy28- Avançado
- PONTOS : 2751
REPUTAÇÃO : 52
Idade : 27
Áreas de atuação : Modelagem, Animação, Texturização, Design
Respeito as regras :
Tópicos semelhantes
» [AJUDA]Preciso de ajuda em um script relacionado ao vídeo Sistema de escolha de personagen
» [AJUDA]Quero Ajuda poque esse script so da erro!
» Posso juntar esse Script com o de IA Inimigo do MARCOS SCHULTZ ?
» Alguém me ajuda com esse script ?
» Uma ajuda com esse script, por favor
» [AJUDA]Quero Ajuda poque esse script so da erro!
» Posso juntar esse Script com o de IA Inimigo do MARCOS SCHULTZ ?
» Alguém me ajuda com esse script ?
» Uma ajuda com esse script, por favor
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos