[TUTORIAL] Inteligência artificial, inimigo e AIPoints
+31
SauloeArthur
francisco barroso
ninjagamergabriel
FuncaoFF
DGDark
NKKF
BrazaTattoo
ixgames
Callyde Jr
Unidade3d5
bsoll4
Diego Felix
GetulioGamerbr
arnaldojunior
AndyShow
alemaopessoa
artplayer
dinho
Guisao666
JohnnyKills
iahGod
gagasilva
cosmoplay
Orixinals
Chilinger
Jhonny_Ayllet
Lucas Garcia Frade
Rafael Pirani
Alan Porfirio
Dionilson
MarcosSchultz
35 participantes
Página 2 de 2
Página 2 de 2 • 1, 2
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Olhei todo o código e comecei a entender o problema, movi os aipoints de posição e o problema mudou para algo mais concreto.
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
System.Collections.Generic.List`1[UnityEngine.Transform].get_Item (Int32 index) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:633)
AIPOINTS.Update () (at Assets/AIPOINTS.cs:82)
Como disse sou novo no Unity, mas acredito que estou estourando meu contador.
O que devo fazer para que isso não ocorra, até porque meu guardião só vai até o primeiro ponto.
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
System.Collections.Generic.List`1[UnityEngine.Transform].get_Item (Int32 index) (at /Users/builduser/buildslave/mono/build/mcs/class/corlib/System.Collections.Generic/List.cs:633)
AIPOINTS.Update () (at Assets/AIPOINTS.cs:82)
Como disse sou novo no Unity, mas acredito que estou estourando meu contador.
O que devo fazer para que isso não ocorra, até porque meu guardião só vai até o primeiro ponto.
arnaldojunior- Membro
- PONTOS : 3053
REPUTAÇÃO : 2
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
OBRIGADO Marcos,muito obrigado msmo por esses scripts,meu projeto so está sendo concluido pelo seu trabalhoMarcosSchultz escreveu:
Estive trabalhando neste script, e finalmente está pronto. trata-se de uma inteligência artificial simples, usando AIPoints
O inimigo se move randomicamente entre os AIPoints e se ve o player, começa a persegui-lo e s conseguir, ataca-lo também
se perder o player de vista, volta para a rotina de andar aleatoriamente pelos AIpoints.
Como usar? Primeiramente coloque a tag " Player " no seu player
agora jogue este script no seu inimigo ( o nome do script deve ser " AIPOINTS " ) ::
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(CharacterController))]
public class AIPOINTS : MonoBehaviour {
public Transform[] AIPoints; // PONTOS POR ONDE O INIMIGO PODE TRANSITAR
private List<Transform> ListaDeAiPoints = new List<Transform>(); // LISTA QUE IRA GUARDAR OS AIPoints DISPONIVEIS PARA O INIMIGO ANDAR NO MOMENTO
public float velocidadeDeMovimento = 5,DistanciaDeObservacao = 30,DistanciaDeSeguir = 20,DistanciaDeAtaque = 2; // VARIAVEIS A SEREM CONFIGURADAS
private float distanciaDoJogador,cronometroTempoNoLocal;
private int AIpoitAtual; // AIPoint ATUAL PARA ONDE O INIMIGO ESTA SE MOVENDDO
private GameObject Player;
private bool VendoOPlayer,EsperandoNoLocal,SeguindoOPlayer;
public float TempoNoLocal = 0.001f; // TEMPO QUE O INIMIGO AGUARDA NO AIPoint ATE COMEÇAR A IR PARA O PROXIMO
void Start (){
Player = GameObject.FindWithTag ("Player"); // PLAYER = OBJETO QUE CONTEM A TAG PLAYER
for (int x=0; x<AIPoints.Length; x++) { // AQUI EU FAÇO UM FOR EM TODOS OS OBJETOS DA VARIAVEL AIPoints
Vector3 de = transform.position; // A VARIAVEL " de " RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 para = AIPoints [x].transform.position; // A VARIAVEL " para " RECEBE A POSIÇAO DO AIpointAtual
if (!Physics.Linecast (de, para)) { // AQUI EU CHEGO SE O CAMINHO ENTRE O INIMIGO E O AIPOINT ESTA LIVRE, SE ESTIVER:
if(!ListaDeAiPoints.Contains( AIPoints [x] )){ // AQUI EU CHECO SE O ELEMENTO JA ESTA NA LISTA, SE NAO ESTA, FAZ ISSO ABAIXO:
ListaDeAiPoints.Add(AIPoints [x]); //ADICIONA O AIPoint[X] NA LISTA
}
}
else if (Physics.Linecast (de, para)) { // SEM TEM ALGUMA COISA ENTRE O AIPoint ATUAL E O INIMIGO
ListaDeAiPoints.Remove(AIPoints [x]) ; // REMOVE O ITEM AIPoint[X] ATUAL DA LISTA, PARA TORNA-LO INDISPONIVEL
}
}
}
void Update () {
//================================================RAYCAST ( INIMIGO ESTA VENDO O PLAYER? )=========================================================//
RaycastHit hit; // DECLARO UM RAYCAST
Vector3 deOnde = transform.position; //A VARIAVEL deOnde RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 paraOnde = Player.transform.position;//A VARIAVEL paraOnde RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 direction = paraOnde - deOnde; // O VETOR direction RECEBE A POSIÇAO CORRESPONDENTE A B-A, OU SEJA, O VETOR paraOnde - o vetor deOnde
if (Physics.Raycast (transform.position, direction, out hit, 1000) && distanciaDoJogador < DistanciaDeObservacao) { // SE RAYCAST, E SE A DISTANCIA DO PLAYER FOR MENOR DO QUE A MAXDISTANCIA
if (hit.collider.gameObject.CompareTag ("Player")) { // SE A TAG DO OBJETO QUE O RAYCAST COLIDIU FOR "PLAYER"
VendoOPlayer = true; // VARIAVEL VendoOPlayer FICA VERDADEIRA
} else { // SE NAO
VendoOPlayer = false;// VARIAVEL VendoOPlayer FICA FALSA
}
}
//===========================================LINECAST ( DEIXAR ACESSIVEL APENAS OS AIPOINTS VISIVEIS)=========================================//
if (EsperandoNoLocal == true) { // SE A VARIAVEL EsperandoNoLocal ESTIVER VERDADEIRA
for (int x=0; x<AIPoints.Length; x++) { // AQUI EU FAÇO UM FOR EM TODOS OS OBJETOS DA VARIAVEL AIPoints
Vector3 de = transform.position; // A VARIAVEL " de " RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 para = AIPoints [x].transform.position; // A VARIAVEL " para " RECEBE A POSIÇAO DO AIpointAtual
if (!Physics.Linecast (de, para)) { // AQUI EU CHEGO SE O CAMINHO ENTRE O INIMIGO E O AIPOINT ESTA LIVRE, SE ESTIVER:
Debug.DrawLine(de,para); // APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
if(!ListaDeAiPoints.Contains( AIPoints [x] )){ // AQUI EU CHECO SE O ELEMENTO JA ESTA NA LISTA, SE NAO ESTA, FAZ ISSO ABAIXO:
ListaDeAiPoints.Add(AIPoints [x]); //ADICIONA O AIPoint[X] NA LISTA
}
}
else if (Physics.Linecast (de, para)) { // SEM TEM ALGUMA COISA ENTRE O AIPoint ATUAL E O INIMIGO
Debug.DrawLine(de,para);// APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
ListaDeAiPoints.Remove(AIPoints [x]) ; // REMOVE O ITEM AIPoint[X] ATUAL DA LISTA, PARA TORNA-LO INDISPONIVEL
}
}
EsperandoNoLocal = false; // A VARIAVEL EsperandoNoLocal FICA FALSA
}
//==================================================== COMANDO PARA FAZER O INIMIGO ANDAR PELOS AIPOINTS======================================//
distanciaDoJogador = Vector3.Distance (Player.transform.position, transform.position); // MEDE A DISTANCIA ENTRE O INIMIGO E O PLAYER
if (distanciaDoJogador >= DistanciaDeObservacao || VendoOPlayer == false && EsperandoNoLocal == false) { // SE A DISTANCIA ENTRE INIMIGO E PLAYER FOR MENOR DO QUE A DISTANCIA DE OBSERVAÇAO E VAR'S....
if (AIpoitAtual < ListaDeAiPoints.Count) { // CHECAGEM PRA NAO DAR ERRO DE ARRAY
Vector3 target = ListaDeAiPoints [AIpoitAtual].transform.position;//A VARIAVEL target RECEBE A POSIÇAO DO AIpointAtual
transform.LookAt (target);//O INIMIGO OLHA NA DIREÇAO DO AIPOINT SELECIONADO ( O AIpointAtual )
transform.position = Vector3.MoveTowards (transform.position, target, velocidadeDeMovimento * Time.deltaTime); // MOVE O PALYER EM DIREÇAO AO AIpointAtual
if (transform.position == ListaDeAiPoints [AIpoitAtual].transform.position) { // SE A POSIÇAO DO PLAYER FOR IGUAL A POSIÇAO DO AIpointAtual, OU SEJA, CHEGOU NO DESTINO
cronometroTempoNoLocal+=Time.deltaTime; // COMEÇA A CONTAR O CRONOMETRO DE ESPERA NO LOCAL
EsperandoNoLocal = true; // A VARIAVEL EsperandoNoLocal FICA VERDADEIRA PARA INDICAR QUE ESTA ESPERANDO
}
if(cronometroTempoNoLocal >= TempoNoLocal){ // SE JA ESPEROU O TEMPO QUE DEVERIA ESPERAR NO LOCAL
cronometroTempoNoLocal = 0; // ZERA O CRONOMETRO PARA PODER REUTILIZAR ELE
int NumeroDeElementosDaLista2 = ListaDeAiPoints.Count; // UMA INT COM NOME NumeroDeElementosDaLista2 RECEBE O NUMERO DE ITENS QUE TEM NA LISTA
AIpoitAtual = Random.Range (0, NumeroDeElementosDaLista2); // A VARIAVEL AIpoitAtual RECEBE UM VALOR ALEATORIO ENTRE 0 E O O NUMERO DE ITENS QUE TEM NA LISTA
}
}
}
//================================================= COMANDOS PARA CHECAR DISTANCIA, OLHAR E SEGUIR================================================//
else if (distanciaDoJogador >= DistanciaDeSeguir && distanciaDoJogador < DistanciaDeObservacao && VendoOPlayer == true) { // SE ESTA PERTO PARA OLHAR MAS AINDA E LONGE PARA SEGUIR:
Olhar (); // VOID PARA O INIMIGO FICAR OLHANDO PARA O PLAYER
}else if (distanciaDoJogador <= DistanciaDeSeguir && VendoOPlayer == true) { //SE JA ESTA PERTO O SUFICIENTE PARA SEGUIR E ESTA VENDO O PLAYER
Seguir (); // VOID PARA O INIMIGO SEGUIR O PLAYER
}
//=======================================================CORRIGIR BUGS DE INDEX RANGE=============================================================//
if (AIpoitAtual >= ListaDeAiPoints.Count) { // SE O AIpoitAtual TIVER UM VALOR MAIOR DO QUE O MAXIMO DE ELEMENTOS QUE EXISTEM NA LISTA
AIpoitAtual = ListaDeAiPoints.Count -1; // A VARIAVEL AIpoitAtual RECEBE O NUMERO DE ELEMENTOS DA LISTA -1, ISSO EVITARA BUGS
}else if (AIpoitAtual <= 0) { //SE O AIpoitAtual TIVER UM VALOR MENOR DO QUE ZERO:
AIpoitAtual = 0;//AIpoitAtual RECEBERA O VALOR ZERO, ISSO EVITARA BUGS
}
//==========================================FAZER O PLAYER RECEBER DANO AO CHEGAR PERTO DO INIMIGO================================================//
if (distanciaDoJogador <= DistanciaDeAtaque) { // SE A DISTANCIA ENTRE O INIMIGO E O PLAYER FOR MENOR DO QUE A DISTANCIA DE ATAQUE
VidaPlayer.RecebendoDano = true; // A VARIAVEL RecebendoDano DO SCRIPT VidaPlayer FICA VERDADEIRA
} else if (distanciaDoJogador > DistanciaDeAtaque) { // SE A DISTANCIA ENTRE O INIMIGO E O PLAYER FOR MAIOR DO QUE A DISTANCIA DE ATAQUE
VidaPlayer.RecebendoDano = false; // A VARIAVEL RecebendoDano DO SCRIPT VidaPlayer FICA FALSA
}
//===============================================ESTAVA SEGUINDO MAS PAROU DE VER O PLAYER========================================================//
if (SeguindoOPlayer == true && VendoOPlayer == false) { // SE ESTA SEGUINDO O PLAYER MAS NAO ESTA VENDO ELE
for (int x=0; x<AIPoints.Length; x++) { // AQUI EU FAÇO UM FOR EM TODOS OS OBJETOS DA VARIAVEL AIPoints
Vector3 de = transform.position; // A VARIAVEL " de " RECEBE A POSIÇAO ATUAL DO INIMIGO
Vector3 para = AIPoints [x].transform.position; // A VARIAVEL " para " RECEBE A POSIÇAO DO AIpointAtual
if (!Physics.Linecast (de, para)) { // AQUI EU CHEGO SE O CAMINHO ENTRE O INIMIGO E O AIPOINT ESTA LIVRE, SE ESTIVER:
Debug.DrawLine(de,para); // APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
if(!ListaDeAiPoints.Contains( AIPoints [x] )){ // AQUI EU CHECO SE O ELEMENTO JA ESTA NA LISTA, SE NAO ESTA, FAZ ISSO ABAIXO:
ListaDeAiPoints.Add(AIPoints [x]); //ADICIONA O AIPoint[X] NA LISTA
}
}
else if (Physics.Linecast (de, para)) { // SEM TEM ALGUMA COISA ENTRE O AIPoint ATUAL E O INIMIGO
Debug.DrawLine(de,para);// APENAS FAÇO UM DEBUG ( OPCIONAL ) PARA VER A TRAJETORIA DAS LINHAS
ListaDeAiPoints.Remove(AIPoints [x]) ; // REMOVE O ITEM AIPoint[X] ATUAL DA LISTA, PARA TORNA-LO INDISPONIVEL
}
}
int NumeroDeElementosDaLista2 = ListaDeAiPoints.Count; // A VARIAVEL NumeroDeElementosDaLista2 RECEBE O NUMERO DE ELEMENTOS CONTIDOS NA LISTA
AIpoitAtual = Random.Range (0, NumeroDeElementosDaLista2); // A VARIAVEL AIpoitAtual RECEBE UM VALOR ALEATORIO ENTRE 0 E O O NUMERO DE ITENS QUE TEM NA LISTA
SeguindoOPlayer = false; // A VARIAVEL SeguindoOPlayer RECEBE FALSE
}
}
//================================================================= OUTRAS VOIDS=======================================================================//
void Olhar (){ // VOID QUE FAZ O INIMIGO OLHAR PARA O PLAYER
Vector3 OlharPlayer = Player.transform.position; // O VETOR OlharPlayer RECEBE A POSIÇAO DO PLAYER
transform.LookAt (OlharPlayer); // O INIMIGO PLHA EM DIREÇAO AO PLAYER
}
void Seguir (){
SeguindoOPlayer = true; // A VARIAVEL SeguindoOPlayer FICA VERDADEIRA
Vector3 SeguirPlayer = Player.transform.position; // O VETOR SeguirPlayer RECEBE A POSIÇAO DO PLAYER
transform.position = Vector3.MoveTowards (transform.position, SeguirPlayer, velocidadeDeMovimento * Time.deltaTime); // O INIMIGO SE MOVE EM DIREÇAO AO PLAYER
}
}
Depois disso, jogue este script no seu player( o nome do script deve ser " VidaPlayer " ) :
- Código:
using UnityEngine;
using System.Collections;
public class VidaPlayer : MonoBehaviour {
public static bool RecebendoDano; //VARIAVEL ESTATICA QUE INDICA SE ESTA RECEBENDO DANO OU NAO
public float tempoPorAtaque = 1.5f; // TEMPO MINIMO ENTRE CADA ATAQUE QUE O INIMIGO PODE DAR
private float cronometroDeAtaque; // CRONOMETRO QUE CONTROLA O TEMPO DOS ATAQUES
public int VidaDoPlayer = 100; // VIDA DO PERSONAGEM
public int DanoPorAtaque = 40;
void Start (){
RecebendoDano = false; // A VARIAVEL RecebendoDano RECEBE FALSO
}
void Update (){
if (RecebendoDano == true) { // SE RecebendoDano ESTA VERDADEIRO
cronometroDeAtaque += Time.deltaTime; // O CRONOMETRO COMEÇA A CONTAR
} else { // SE NAO, OU SEJA, SE RecebendoDano ESTA FALSO
cronometroDeAtaque = 0; // O CRONOMETRO RECEBE 0
}
if (cronometroDeAtaque >= tempoPorAtaque) { // SE O CRONOMETRO ULTRAPASSOU O TEMPO POR ATAQUE
cronometroDeAtaque = 0; // CRONOMETRO RECEBE 0
VidaDoPlayer = VidaDoPlayer - DanoPorAtaque; // A VIDA DO PLAYER RECEBE O VALOR DELA MESMA MENOS O DANO DO ATAQUE
}
if (VidaDoPlayer <= 0) { // SE A VIDA FOR MENOR OU IGUAL A 0
Application.Quit (); // SAI DO JOGO
}
}
}
Os dois scripts extão COMPLETAMENTE comentados para um melhor entendimento.
Agora basta configurar as variáveis dos dois scripts e jogar AIpoints( pontos por onde o inimigo irá se mover ) na variavel " AIPoints " do script do seu inimigo
Dúvidas postem ae
GetulioGamerbr- Iniciante
- PONTOS : 2950
REPUTAÇÃO : 1
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Olá, tentei usar o script do Marcos para que meu guardião vaga-se pelo labirinto, mas não deu certo. Resolvi criar vergonha na cara e criar meu próprio script, mas dessa vez para que ele perambula-se aleatoriamente, mas meu problema agora é que quando ele marca um ponto da "navmesh sphere" inacessível, ele para ao travar em uma parede. Tentei usar raycast para ele detectar objetos e refazer o calculo, mas quando ele esbarra em angulo fechado (e isto ocorre muito) o raycast não funciona. Se eu tirar meu teste de só fazer o calculo de localização do "se não" ele para de esbarrar, mas como esta no update, acredito que vã consumir muita memória.
Minha duvida portanto é:
Como testar se a algum obstaculo em um angulo de 180° ou um raycast em angulo, o que me ajudaria a melhorar o sistema de detecção do guardião, pois ele só persegue o player se este passar bem diante de seus olhos.
Agradeço pela atenção.
Minha duvida portanto é:
Como testar se a algum obstaculo em um angulo de 180° ou um raycast em angulo, o que me ajudaria a melhorar o sistema de detecção do guardião, pois ele só persegue o player se este passar bem diante de seus olhos.
Agradeço pela atenção.
- Código:
using UnityEngine;
using UnityEngine.AI;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(CharacterController))]
public class Inimigo : MonoBehaviour
{
public Transform Player;
public UnityEngine.AI.NavMeshAgent naveMesh;
private NavMeshAgent navemesh;
public Vector3 insideUnitSphere;
// Use this for initialization
void Start ()
{
navemesh = transform.GetComponent<UnityEngine.AI.NavMeshAgent>();
}
// Update is called once per frame
void Update ()
{
RaycastHit hit;
if (Physics.Raycast(transform.position,transform.forward,out hit,30))
{
if (hit.collider.gameObject.CompareTag("Player"))
{
naveMesh.destination = Player.position;
}
}
else if (naveMesh.destination == transform.position)
{
naveMesh.destination = Random.insideUnitSphere * 50;
Debug.Log(naveMesh.destination);
}
}
}
arnaldojunior- Membro
- PONTOS : 3053
REPUTAÇÃO : 2
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Poderia criar um tópico específico para esta dúvida?
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Muito bom marcos esse tópico tah me ajudando bastante, mas queria saber como faço pra por as animações do inimigo ficar parado,caminhar,atacar, morrer e etc quem puder me ajudar ja agradeço
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
estou tendo um problema:
quando o inimigo chega no AIpoint ele simplesmente gira no eixo y e entra no chao, aí fica travado la;
quando o inimigo chega no AIpoint ele simplesmente gira no eixo y e entra no chao, aí fica travado la;
bsoll4- Iniciante
- PONTOS : 2576
REPUTAÇÃO : 0
Respeito as regras :
Unidade3d5- Avançado
- PONTOS : 3031
REPUTAÇÃO : 28
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Observe se os AIpoint estaodentrodo chao?
Coloque um BoxeCollider para ver melhor.
Coloque um BoxeCollider para ver melhor.
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
blz. eu sei que este post ja é um pouco antigo. mas eu testei aqui e descobri que tem alguns bugs.
os scripts fucnionam sim, so que se tiver algum objecto entre o inimigo e AIpoint. o inimigo para e da erro. ou seja. se tiver uma parede ou um objecto que tape a visao do inimigo dos pontos. da erro..
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
linha 82:
Vector3 target = ListaDeAiPoints[AIpoitAtual].transform.position;//A VARIAVEL target RECEBE A POSIÇAO DO AIpointAtual
...
eu acho que este script foi criando em um terreno aberto sem paredes nem nada do tipo.
outro problema achado neste script. tem haver com o uso do navmesh.. a partir do momento que eu adiciono um nav mesh ao terreno e faco bake.. o inimigo quando esta a patrulhar entre os pontos. na chegada de cada ponto ele simplsmente se deita no terreno. por veses levanta se e vai ate outro ponto. outras veses so fica deitado no mesmo sitio..
nao entendo porque que o modelo 3D rotaciona.. !!
alem disso tem outro problema, os AIpoints nao podem estar a uma altura grande nem muito baixa.. se tiver uma altura grande. o player sobe em direcao ao gameobject..!!
apesar deste script ser muito bom.. gostava que voce podesse refurmalar este script para usar com navemesh... e corrigindo estes bugs. seria otimo usar num projecto!!!
os scripts fucnionam sim, so que se tiver algum objecto entre o inimigo e AIpoint. o inimigo para e da erro. ou seja. se tiver uma parede ou um objecto que tape a visao do inimigo dos pontos. da erro..
ArgumentOutOfRangeException: Argument is out of range.
Parameter name: index
linha 82:
Vector3 target = ListaDeAiPoints[AIpoitAtual].transform.position;//A VARIAVEL target RECEBE A POSIÇAO DO AIpointAtual
...
eu acho que este script foi criando em um terreno aberto sem paredes nem nada do tipo.
outro problema achado neste script. tem haver com o uso do navmesh.. a partir do momento que eu adiciono um nav mesh ao terreno e faco bake.. o inimigo quando esta a patrulhar entre os pontos. na chegada de cada ponto ele simplsmente se deita no terreno. por veses levanta se e vai ate outro ponto. outras veses so fica deitado no mesmo sitio..
nao entendo porque que o modelo 3D rotaciona.. !!
alem disso tem outro problema, os AIpoints nao podem estar a uma altura grande nem muito baixa.. se tiver uma altura grande. o player sobe em direcao ao gameobject..!!
apesar deste script ser muito bom.. gostava que voce podesse refurmalar este script para usar com navemesh... e corrigindo estes bugs. seria otimo usar num projecto!!!
ixgames- Iniciante
- PONTOS : 2495
REPUTAÇÃO : 0
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Boa noite, gostaria que o inimigo aguardasse um tempo no ai point, o script que estou utilizando nao tem a opçao. se puderem me ajudar eu agradeço muito! Segue o Script
- Código:
using UnityEngine.AI;
using System.Collections;
using UnityEngine;
public class INTELIGENCIA2 : MonoBehaviour {
public Transform Player;
private NavMeshAgent naveMesh;
public float DistanciaDoPlayer, DistanciaDoAIPoint;
public float DistanciaDePercepcao = 30,DistanciaDeSeguir = 20, DistanciaDeAtacar = 2, VelocidadeDePasseio = 3, VelocidadeDePerseguicao = 6,TempoPorAtaque = 1.5f, DanoDoInimigo = 40;
private bool VendoOPlayer;
public Transform[] DestinosAleatorios;
private int AIPointAtual;
private bool PerseguindoAlgo, contadorPerseguindoAlgo,atacandoAlgo,contadorOlhar ;
private float cronometroDaPerseguicao,cronometroAtaque, cronometroOlhar;
public bool BPassear, BOlhar, BPerseguir, BAtacar;
private Animator zumbi;
void Start (){
AIPointAtual = Random.Range (0, DestinosAleatorios.Length);
naveMesh = transform.GetComponent<NavMeshAgent> ();
zumbi = GetComponent<Animator> ();
}
void Update (){
DistanciaDoPlayer = Vector3.Distance(Player.transform.position,transform.position);
DistanciaDoAIPoint = Vector3.Distance(DestinosAleatorios[AIPointAtual].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 < DistanciaDePercepcao ){
if(hit.collider.gameObject.CompareTag("Player")){
VendoOPlayer = true;
}else{
VendoOPlayer = false;
}
}
//================ CHECHAGENS E DECISOES DO INIMIGO ================//
if(DistanciaDoPlayer > DistanciaDePercepcao && cronometroOlhar < 5){
PerseguindoAlgo = false;
BPassear = true;
Passear();
}
if (DistanciaDoPlayer <= DistanciaDePercepcao && DistanciaDoPlayer > DistanciaDeSeguir && cronometroOlhar < 5) {
if(VendoOPlayer == true){
BOlhar = true;
Olhar ();
}else{
BPassear = true;
Passear();
}
}
if (DistanciaDoPlayer <= DistanciaDeSeguir && DistanciaDoPlayer > DistanciaDeAtacar ) {
if(VendoOPlayer == true){
BPerseguir = true;
Perseguir();
PerseguindoAlgo = true;
}else{
BPassear = true;
Passear();
}
}
if (DistanciaDoPlayer <= DistanciaDeAtacar ) {
BAtacar = true;
Atacar();
}
//COMANDOS DE PASSEAR
if (DistanciaDoAIPoint <= 2) {
AIPointAtual = Random.Range (0, DestinosAleatorios.Length);
BPassear = true;
Passear();
}
//CONTADORES DE OLHAR
if (contadorOlhar == true) {
cronometroOlhar += Time.deltaTime;
}
if (cronometroOlhar >= 5 ) {
Perseguir();
}
if (cronometroOlhar >= 8 ) {
contadorOlhar = false;
cronometroOlhar = 0;
Perseguir();
}
//CONTADORES DE PERSEGUICAO
if (contadorPerseguindoAlgo == true) {
cronometroDaPerseguicao += Time.deltaTime;
}
if (cronometroDaPerseguicao >= 5 && VendoOPlayer == false) {
contadorPerseguindoAlgo = false;
cronometroDaPerseguicao = 0;
PerseguindoAlgo = false;
}
// Freio do ATAQUE
if (DistanciaDoPlayer <= DistanciaDeAtacar - 1) {
naveMesh.destination = gameObject.transform.position;
}
// CONTADOR DE ATAQUE
if (atacandoAlgo == true) {
transform.LookAt (new Vector3 (Player.transform.position.x, transform.position.y, Player.transform.position.z));
cronometroAtaque += Time.deltaTime;
}
if (cronometroAtaque >= TempoPorAtaque && DistanciaDoPlayer <= DistanciaDeAtacar) {
atacandoAlgo = true;
cronometroAtaque = 0;
//PLAYER.VIDA = PLAYER.VIDA - DanoDoInimigo;
Debug.Log ("recebeuAtaque");
} else if (cronometroAtaque >= TempoPorAtaque && DistanciaDoPlayer > DistanciaDeAtacar) {
atacandoAlgo = false;
cronometroAtaque = 0;
Debug.Log ("errou");
}
}
void Passear (){
BOlhar = false;
BPerseguir = false;
BAtacar = false;
zumbi.SetInteger("condicao", 0);
if (PerseguindoAlgo == false) {
naveMesh.acceleration = 5;
naveMesh.speed = VelocidadeDePasseio;
naveMesh.destination = DestinosAleatorios [AIPointAtual].position;
} else if (PerseguindoAlgo == true) {
contadorPerseguindoAlgo = true;
}
}
void Olhar(){
contadorOlhar = true;
BPassear = false;
zumbi.SetInteger("condicao", 1);
BPerseguir = false;
BAtacar = false;
naveMesh.speed = 0;
transform.LookAt (Player);
}
void Perseguir(){
BPassear = false;
BOlhar = false;
zumbi.SetInteger("condicao", 2);
BAtacar = false;
naveMesh.acceleration = 8;
naveMesh.speed = VelocidadeDePerseguicao;
naveMesh.destination = Player.position;
}
void Atacar (){
BPassear = false;
BOlhar = false;
BPerseguir = false;
zumbi.SetInteger("condicao", 3);
atacandoAlgo = true;
}
}
BrazaTattoo- Membro
- PONTOS : 3261
REPUTAÇÃO : 24
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Na void "Passear" mude-a para IEnumerator e coloque um:
Antes de dizer que ele irá mudar seu destino
- Código:
//Pode mudar esse "3f"
yield return new WaitForSeconds(3f);
Antes de dizer que ele irá mudar seu destino
NKKF- ProgramadorMaster
- PONTOS : 4819
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Obrigado pela dica, sou novato ainda em programaçao, vou tentar aprender sobre IEnumerator pois nunca usei nem sei como usar. eu mantenho a void Passear ?
BrazaTattoo- Membro
- PONTOS : 3261
REPUTAÇÃO : 24
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Sim, pode manter, só mudar ela para IEnumerator e adicionar para ela esperar.
NKKF- ProgramadorMaster
- PONTOS : 4819
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Marcos eu coloquei esse script, porem ele só segue quando olha pra ele e quando ele chega no AIPoint ele meio que cai e fica como se tivesse escurregado
DGDark- Iniciante
- PONTOS : 3035
REPUTAÇÃO : 3
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Ola DGDark voce esta precisando de uma AI para seu jogo?DGDark escreveu:Marcos eu coloquei esse script, porem ele só segue quando olha pra ele e quando ele chega no AIPoint ele meio que cai e fica como se tivesse escurregado
Unidade3d5- Avançado
- PONTOS : 3031
REPUTAÇÃO : 28
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Sim, estou fazendo um game de terror, e esta tentando fazer uma AI e peguei a do forúm porem aconteceu issoUnidade3d5 escreveu:Ola DGDark voce esta precisando de uma AI para seu jogo?DGDark escreveu:Marcos eu coloquei esse script, porem ele só segue quando olha pra ele e quando ele chega no AIPoint ele meio que cai e fica como se tivesse escurregado
DGDark- Iniciante
- PONTOS : 3035
REPUTAÇÃO : 3
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Se poder me ajudar agradeço desde já.
DGDark- Iniciante
- PONTOS : 3035
REPUTAÇÃO : 3
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
me chama no facebookDGDark escreveu:Se poder me ajudar agradeço desde já.
https://www.facebook.com/profile.php?id=100010490649346&ref=bookmarks
Unidade3d5- Avançado
- PONTOS : 3031
REPUTAÇÃO : 28
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Muito bom parabéns! O meu funcionou bem. Só o Sprite que desaparece quando chega no segundo ponto. Ficou muito bom.
FuncaoFF- Iniciante
- PONTOS : 2267
REPUTAÇÃO : 0
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Dionilson escreveu:Mano Brigado cara, me ajudo pakas mano vlws mesmo.
ninjagamergabriel- Iniciante
- PONTOS : 2193
REPUTAÇÃO : 0
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
NKKF escreveu:Na void "Passear" mude-a para IEnumerator e coloque um:
- Código:
//Pode mudar esse "3f"
yield return new WaitForSeconds(3f);
Antes de dizer que ele irá mudar seu destino
Cara uma void pode ser substituida por o yield return new?
francisco barroso- Programador
- PONTOS : 2614
REPUTAÇÃO : 59
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
francisco barroso escreveu:NKKF escreveu:Na void "Passear" mude-a para IEnumerator e coloque um:
- Código:
//Pode mudar esse "3f"
yield return new WaitForSeconds(3f);
Antes de dizer que ele irá mudar seu destino
Cara uma void pode ser substituida por o yield return new?
Depende da situação...
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Boa noite a todos! estou iniciando agora em programação, já consigo fazer algumas coisas com script, mais A.I ainda é muito avançado para min, o script está perfeito, já adicionei animações a cada ação do inimigo...
preciso de uma ajuda, meu cenário tem várias salas com portas, gostaria de saber se tem alguma forma mais simples de fazer o inimigo abrir e fechar a porta, pois o meu apenas está atravessando.
agradeço muito!
preciso de uma ajuda, meu cenário tem várias salas com portas, gostaria de saber se tem alguma forma mais simples de fazer o inimigo abrir e fechar a porta, pois o meu apenas está atravessando.
agradeço muito!
BrazaTattoo- Membro
- PONTOS : 3261
REPUTAÇÃO : 24
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
BrazaTattoo escreveu:Boa noite a todos! estou iniciando agora em programação, já consigo fazer algumas coisas com script, mais A.I ainda é muito avançado para min, o script está perfeito, já adicionei animações a cada ação do inimigo...
preciso de uma ajuda, meu cenário tem várias salas com portas, gostaria de saber se tem alguma forma mais simples de fazer o inimigo abrir e fechar a porta, pois o meu apenas está atravessando.
agradeço muito!
Poderia criar um tópico específico para essa sua dúvida?
A princípio, da pra elaborar algo simples, com um Vector3.Distance para detectar se o inimigo está perto da porta, e caso ele esteja, ele faz a ação de abrir a porta (caso ela esteja fechada)
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
estou com mesmo erro de index =(
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
tem um porque disso ?
ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection.
Parameter name: index
tem um porque disso ?
Portela- Membro
- PONTOS : 1736
REPUTAÇÃO : 5
Áreas de atuação : Noob/gambirreiro
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
talvez possa ser porque você está tentando acessar alguma coisa usando um índice maior do que a coleção
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
SauloeArthur escreveu:talvez possa ser porque você está tentando acessar alguma coisa usando um índice maior do que a coleção
podia me falar um pouco do "índice" e da "coleção" paraeu puder tentar ajeitar isso ! ty =)
Portela- Membro
- PONTOS : 1736
REPUTAÇÃO : 5
Áreas de atuação : Noob/gambirreiro
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
usei navmesh.. acho que foi alguma coisa com meu terreno.SauloeArthur escreveu:talvez possa ser porque você está tentando acessar alguma coisa usando um índice maior do que a coleção
Portela- Membro
- PONTOS : 1736
REPUTAÇÃO : 5
Áreas de atuação : Noob/gambirreiro
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Será que tem como fazer a Ai andar pelo cenário sem precisar de Ai Points?
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Sei não, mas acho que da pra fazer as AI aleatorias e se autodestruindo e instanciando de novo kkkglauco escreveu:Será que tem como fazer a Ai andar pelo cenário sem precisar de Ai Points?
Portela- Membro
- PONTOS : 1736
REPUTAÇÃO : 5
Áreas de atuação : Noob/gambirreiro
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Cara.Portela escreveu:Sei não, mas acho que da pra fazer as AI aleatorias e se autodestruindo e instanciando de novo kkkglauco escreveu:Será que tem como fazer a Ai andar pelo cenário sem precisar de Ai Points?
Explique-se por favor, não faz sentido.
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
glauco escreveu:Cara.Portela escreveu:Sei não, mas acho que da pra fazer as AI aleatorias e se autodestruindo e instanciando de novo kkkglauco escreveu:Será que tem como fazer a Ai andar pelo cenário sem precisar de Ai Points?
Explique-se por favor, não faz sentido.
malz to com sono, tipo.. fazer as AI Points instanciarem aleatorias e depois de Destruilas, mas isso é gambiarra concerteza o pessoal deve ter ideia melhor...
Portela- Membro
- PONTOS : 1736
REPUTAÇÃO : 5
Áreas de atuação : Noob/gambirreiro
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Usa NavMesh po !glauco escreveu:Cara.Portela escreveu:Sei não, mas acho que da pra fazer as AI aleatorias e se autodestruindo e instanciando de novo kkkglauco escreveu:Será que tem como fazer a Ai andar pelo cenário sem precisar de Ai Points?
Explique-se por favor, não faz sentido.
Portela- Membro
- PONTOS : 1736
REPUTAÇÃO : 5
Áreas de atuação : Noob/gambirreiro
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Tá, vou nem falar mais nada.Portela escreveu:Usa NavMesh po !glauco escreveu:Cara.Portela escreveu:Sei não, mas acho que da pra fazer as AI aleatorias e se autodestruindo e instanciando de novo kkkglauco escreveu:Será que tem como fazer a Ai andar pelo cenário sem precisar de Ai Points?
Explique-se por favor, não faz sentido.
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Glauco, cê poderia fazer o npc ir em uma direção aleatória até x metros, usa um raycast para ver se têm obstáculo.
NKKF- ProgramadorMaster
- PONTOS : 4819
REPUTAÇÃO : 574
Idade : 20
Áreas de atuação : Desenvolvedor na Unity, NodeJS, React, ReactJS, React Native, MongoDB e Firebase.
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Hun interessanteNKKF escreveu:Glauco, cê poderia fazer o npc ir em uma direção aleatória até x metros, usa um raycast para ver se têm obstáculo.
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Já viu isso aqui? é mais ou menos o que o NKKF falou...
https://www.schultzgames.com/t10218-inimigo-andando-de-forma-aleatoria-sem-ser-teleportando-com-sensor-de-collider-por-tag#68730
a posição é gerada de forma aleatória, um raycast testa se a posição é válida, se for, o navmesh gera o caminho até o local sorteado... já daria uma base pra uma IA sem waypoints.
https://www.schultzgames.com/t10218-inimigo-andando-de-forma-aleatoria-sem-ser-teleportando-com-sensor-de-collider-por-tag#68730
a posição é gerada de forma aleatória, um raycast testa se a posição é válida, se for, o navmesh gera o caminho até o local sorteado... já daria uma base pra uma IA sem waypoints.
Fagner- Moderador
- PONTOS : 4444
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
hmmm vou tentar aplicarFagner escreveu:Já viu isso aqui? é mais ou menos o que o NKKF falou...
https://www.schultzgames.com/t10218-inimigo-andando-de-forma-aleatoria-sem-ser-teleportando-com-sensor-de-collider-por-tag#68730
a posição é gerada de forma aleatória, um raycast testa se a posição é válida, se for, o navmesh gera o caminho até o local sorteado... já daria uma base pra uma IA sem waypoints.
Re: [TUTORIAL] Inteligência artificial, inimigo e AIPoints
Boa tarde, esse script serve para o Unity 2020
michelcreis@hotmail.com- Iniciante
- PONTOS : 1369
REPUTAÇÃO : 0
Respeito as regras :
Página 2 de 2 • 1, 2
Tópicos semelhantes
» [TUTORIAL] Inteligência Artificial
» Tutorial Inteligencia Artificial 2D[GODOT]
» [TUTORIAL] Dano baseado na distância do inimigo
» [TUTORIAL] IA inimigo (patrulha)
» [TUTORIAL] Inimigo seguir e atacar Player ao encostar
» Tutorial Inteligencia Artificial 2D[GODOT]
» [TUTORIAL] Dano baseado na distância do inimigo
» [TUTORIAL] IA inimigo (patrulha)
» [TUTORIAL] Inimigo seguir e atacar Player ao encostar
Página 2 de 2
Permissões neste sub-fórum
Não podes responder a tópicos