SchultzGames
Para tirar dúvidas, crie um tópico especifico na área "Dúvidas em Geral" e aguarde ser respondido. Evite comentar em tópicos não relacionados a sua dúvida :D
TÓPICOS RECENTES:
Tópico:
Postado em:
Postado por:
Marcas e nomes de carros verdadeiros
[Duvida] Script de mover objeto usando o RigidBody
Character Bug - Android Unity3d
PlayerPrefs??
bloco de notas
Firewall bloqueando conexões lan do meu game
Cores nos materiais sem criar material
Animação com mão fechada
Erro com Post Processing e com canvas
Modelo importado para Unity com os Pés tortos .
[TUTORIAL] Acessar nomes de arquivos diretamente da pasta
Quero fazer um jogo plataforma 2.5d em curva (como Kirby 64), mas não sei.
[TUTORIAL] Criando um simples Multiplayer [UNITY 5]
Reproduzir animação com tecla?
[TUTORIAL] Mirar em jogo de fps igual COD, Battlefield e outros
[TUTORIAL] Ciclo de dia e noite com sync no multiplayer
[TUTORIAL] Salvar dados com playerprefs facilmente.
editor de imagem para perfil
Rotacionar player no eixo Y da camera
erro com carregamento de dados
facebook login
Quando o inimigo ataca todos os inimigos ativam a animação
[TUTORIAL] Como desenhar no Unity.
Objeto ter a mesma rotação que outro em apenas um eixo
Sistema De Marchas para Veiculos
[RESOLVIDO] Pegar o meu ping/latencia (Unet)
Alguém pode me dizer como usar as texturas,Normal map,Occlusion...
Começar em Game Design / Design
Material rosa no HDRender Pipeline como resolvo isso
Instanciate objeto lado a lado
[Duvida] movimentação de nave
[RESOLVIDO] Usando o SetActive para reativar um GameObject, ajuda!
Flamehead MMORPG Indie
erro de java
[TUTORIAL] Desenvolvendo um jogo de quebra-cabeças
[RESOLVIDO] Grafico quadriculado?
duvida com asset store
[TUTORIAL] Assinando um Apk e dicas de instalação e configurações
Como fazer um sistema para conectar objetos?
[RESOLVIDO] Unity sem som
Erro ao tentar compilar para Android
Como iniciar uma animação atraves de um clique em um objeto?
Error ao Gerar a KeyStore do Apk Android
Participe da Game Jam - Jaaj do canal Amdré Young!
[JOGO MOBILE] Defeat the Illuminatis
Alguém sabe como posso aplicar a movimentação agachado?!
Script de Spawn Aleatório
Sugestão para o Fórum - "Área Avançada"
(NavMesh) Objeto "Deslizando"
[____APOIE O FÓRUM E O CANAL E GANHE RECOMPENSAS____]
Alguém conhece algum bom tutorial para aprender Algoritmo genético em C# ?
Mudar cor de area
tela branca ao iniciar videoplayer
COMO FAÇO O SISTEMA DE CHUVA ESTILO ETS2 COM GOTAS NO PARA BRISA?
COMO FAZER SISTEMA DE BHOP ESTILO CS ? (BUNNY HOP)
A Arma mudar de posição de acordo coma movimentação
[PEDIDO] Rig Simples para esse modelo.
[TUTORIAL] Acionar a vibração do dispositivo
[TUTORIAL] CONFIGURANDO O UNITY PARA COMPILAR PARA ANDROID
Animação no movimento do mouse
[___COMO UTILIZAR O FÓRUM___] Principais botões e suas funções
[RESOLVIDO] Colisor
[TUTORIAL] Unity 5 - Wheel Collider, veículos, suspensão realista.
[RESOLVIDO] Como faço um limitador de tiros por distância?
[RESOLVIDO] Mudar a proporção
[RESOLVIDO] Vuforia bug
Objetos (itens) pegos na cena anterior não são destruídos quando volta para ela
Codigo em Python para colocar Imagens em POT (Power Of Two) e .exe
[RESOLVIDO] Error depois de copilar para Android?
[JOGO ANDROID] PLANET DEFENSE
Sistema de IAP Paypal ou parecido
[RESOLVIDO] JOGO SAINDO (ANDROID)
{Equipe} Programador que tenha interesse de participar de uma JAM.
Como fazer Sistema Dia e Noite Segui o sistema de Hora
fazer script pegar arquivo de som, porem o som sera colocado apos a build...
[RESOLVIDO] Mover Plataforma
Formação de Equipe ( Favela Killer)
[TUTORIAL] Escolher a quantos FPS (fixos) o seu jogo deverá rodar.
[Devlog] Lost in the world (1.2_beta)
AJUDA COM SCRIPT DE SISTEMA QTE
Tilesets de Floresta em Pixel Art
[RESOLVIDO] Sistema de login
(UNITY 3D) Mesh Splitter - Como separar uma Mesh em multiplos Game Objects?
Como fazer um sistema de compra de itens?
[JOGO] Tetris em Unity - Para tutorial
Modulo Xbox One
[RESOLVIDO] Pegar e Jogar armas no chão (estilo CS 1.6)
[RESOLVIDO] Como apagar parte da grama do terreno para fazer uma calçada?
[RESOLVIDO] Erro ao Copilar: Bug no personagem.
[Opinião] 2d ou 3d?
Como é feito esse efeito?
Teaser 2 do meu jogo
Shader com efeito de dissolução
[TUTORIAL] Geração de Mesh procedural (estilo Minecraft)
[RESOLVIDO] Erro no Baú
Problema ao mudar sprite entre objetos por conta do uso de joystick
Unity 3d TELA PRETA
[Duvida] Como chamar uma void criada por mim, apenas em determinados momentos.
Corcle (Mobile) - Um jogo simples com um nome estranho.
Hoje à(s) 12:16 am
Ontem à(s) 11:21 pm
Ontem à(s) 10:32 pm
Ontem à(s) 7:59 pm
Ontem à(s) 7:42 pm
Ontem à(s) 7:31 pm
Ontem à(s) 7:11 pm
Ontem à(s) 3:17 pm
Ontem à(s) 7:31 am
Ontem à(s) 1:22 am
Ter Jan 22, 2019 10:33 pm
Ter Jan 22, 2019 6:25 pm
Ter Jan 22, 2019 6:05 pm
Ter Jan 22, 2019 6:02 pm
Ter Jan 22, 2019 12:02 pm
Ter Jan 22, 2019 11:58 am
Ter Jan 22, 2019 5:48 am
Seg Jan 21, 2019 12:04 pm
Seg Jan 21, 2019 11:57 am
Seg Jan 21, 2019 10:51 am
Seg Jan 21, 2019 10:46 am
Dom Jan 20, 2019 6:32 pm
Dom Jan 20, 2019 5:33 pm
Dom Jan 20, 2019 1:46 pm
Dom Jan 20, 2019 4:26 am
Sab Jan 19, 2019 4:48 pm
Sab Jan 19, 2019 8:26 am
Sab Jan 19, 2019 3:45 am
Qui Jan 17, 2019 9:23 pm
Qui Jan 17, 2019 7:10 pm
Qui Jan 17, 2019 2:24 am
Qui Jan 17, 2019 1:48 am
Qui Jan 17, 2019 1:28 am
Qua Jan 16, 2019 6:28 pm
Qua Jan 16, 2019 11:35 am
Ter Jan 15, 2019 10:57 pm
Ter Jan 15, 2019 9:51 pm
Ter Jan 15, 2019 8:20 pm
Ter Jan 15, 2019 5:22 pm
Ter Jan 15, 2019 4:09 pm
Ter Jan 15, 2019 3:50 pm
Ter Jan 15, 2019 2:06 pm
Ter Jan 15, 2019 1:50 pm
Ter Jan 15, 2019 12:26 pm
Ter Jan 15, 2019 10:49 am
Ter Jan 15, 2019 3:27 am
Ter Jan 15, 2019 3:23 am
Ter Jan 15, 2019 3:19 am
Ter Jan 15, 2019 3:15 am
Ter Jan 15, 2019 3:13 am
Ter Jan 15, 2019 3:06 am
Ter Jan 15, 2019 3:04 am
Ter Jan 15, 2019 2:58 am
Ter Jan 15, 2019 2:47 am
Ter Jan 15, 2019 2:39 am
Seg Jan 14, 2019 6:58 pm
Seg Jan 14, 2019 5:54 pm
Seg Jan 14, 2019 2:20 pm
Seg Jan 14, 2019 7:28 am
Dom Jan 13, 2019 6:19 pm
Dom Jan 13, 2019 9:52 am
Sab Jan 12, 2019 8:10 pm
Sab Jan 12, 2019 4:08 pm
Sab Jan 12, 2019 2:41 pm
Sex Jan 11, 2019 10:28 pm
Sex Jan 11, 2019 8:41 pm
Sex Jan 11, 2019 8:31 pm
Sex Jan 11, 2019 12:11 pm
Sex Jan 11, 2019 7:33 am
Sex Jan 11, 2019 2:18 am
Qui Jan 10, 2019 1:04 pm
Qui Jan 10, 2019 12:58 pm
Qui Jan 10, 2019 12:50 pm
Qui Jan 10, 2019 9:23 am
Qua Jan 09, 2019 9:33 pm
Qua Jan 09, 2019 2:47 am
Qua Jan 09, 2019 12:17 am
Qua Jan 09, 2019 12:02 am
Ter Jan 08, 2019 10:24 pm
Ter Jan 08, 2019 5:00 pm
Ter Jan 08, 2019 3:51 pm
Seg Jan 07, 2019 10:42 pm
Seg Jan 07, 2019 10:26 am
Seg Jan 07, 2019 12:43 am
Dom Jan 06, 2019 5:16 pm
Dom Jan 06, 2019 2:22 pm
Sex Jan 04, 2019 3:15 pm
Sex Jan 04, 2019 2:29 pm
Sex Jan 04, 2019 2:25 pm
Sex Jan 04, 2019 12:38 pm
Qui Jan 03, 2019 12:35 am
Qua Jan 02, 2019 9:46 pm
Qua Jan 02, 2019 8:56 pm
Qua Jan 02, 2019 6:48 pm
Qua Jan 02, 2019 5:32 pm
Qua Jan 02, 2019 2:34 pm
Qua Jan 02, 2019 11:17 am
Seg Dez 31, 2018 6:23 pm
Seg Dez 31, 2018 5:53 pm
MRX
DuViDoSo
Frits
Nalfam
richerd
AnderGames
NKKF
Zack2
Zack2
artplayer
DuViDoSo
RGMBrasil
mafipt
heitor
dstaroski
dstaroski
rafaelllsd
Zack2
francisco barroso
Zack2
Zack2
Phph09
vitorhugo
Daniel Pires da Silva
Madness
luiz12345
glauco
Joshuaaaa
MarcosSchultz
MayLeone
MarcosSchultz
bielTuvel
Skurb
zZAndersonZz
MayLeone
heitor
MarcosSchultz
rafaelllsd
henriquegames501
Daniel Dória
dstaroski
dstaroski
Duarte
NKKF
dstaroski
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
dstaroski
BRGC
Callyde Jr
Callyde Jr
TecnoGames
dstaroski
MayLeone
NKKF
bielTuvel
Priste_Hell
Callyde Jr
Wanderli
Andeton
Callyde Jr
MateusPignatti
Callyde Jr
NoobZ
AladoAlan
francisco barroso
luiz12345
speedluk
zeca urubu
Rafal
NKKF
Diego Felix
ismarspn
Zack2
Dom3000
henriquegames501
conceptfac
guimaraf
lhm
EricKBMS
5pntozero
Daniel Dória
Madness
Patrick
AnderGames
kalango studios games
EricKBMS
francisco barroso
dstaroski
MayLeone
PauloFR

Ajustes na IA inimigo

Ir em baixo

PEDIDO Ajustes na IA inimigo

Mensagem por Gwiisk em Sab Jan 13, 2018 10:10 pm

Olá pessoas! Estou desenvolvendo um jogo de terror com visão Top-Down bem simples, porém acabei ficando preso na IA do meu inimigo, a parte de Patrulhar e Perseguir meu jogador está quase completa, estou com um problema em fazer meu inimigo perseguir meu personagem se estiver somente no campo de visão dele, por enquanto ele persegue independente da direção do meu personagem, e também estou com um problema com ele e portas, quero que se caso, ele estiver perseguindo meu jogador, e durante a perseguição ele atravessar e fechar uma porta antes que inimigo passe, que o inimigo seja capaz de, parar seu movimento, destruir e porta(caso não esteja trancada), e se o personagem ainda estiver no campo de visão continuar a perseguição, caso contrario voltar a patrulhar, estou usando NavMesh e FSM no meu inimigo.
NPCBase:
Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class NPCBaseFSM : StateMachineBehaviour {



    public GameObject NPC;

    public UnityEngine.AI.NavMeshAgent agent;

    public GameObject opponent;

    public float speed = 2.0f;

    public float rotSpeed = 1.0f;

    public float accuracy = 3.0f;



    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        NPC = animator.gameObject;

        opponent = NPC.GetComponent<KillerIA> ().GetPlayer ();

        agent = NPC.GetComponent<UnityEngine.AI.NavMeshAgent> ();

    }

}

Killer IA:


Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class KillerIA : MonoBehaviour {



    Animator anim;

    public GameObject player;

    public float hideDistance = 5;



    public GameObject GetPlayer() {

        return player;

    }

        

    // Use this for initialization

    void Start () {

        anim = GetComponent<Animator> ();

    }

    

    // Update is called once per frame

    void Update () {

        anim.SetFloat ("distance", Vector3.Distance (transform.position, player.transform.position));

        if(anim.GetFloat("distance") > hideDistance)

            anim.SetBool ("hide", GameObject.Find("Player").GetComponent<Controller>().hide);

    }

}


Patrulha:



Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class Patrol : NPCBaseFSM {



    GameObject[] waypoints;

    int currentWP;



    void Awake() {

        waypoints = GameObject.FindGameObjectsWithTag ("waypoint");

    }



     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state

    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        base.OnStateEnter (animator, stateInfo, layerIndex);

        currentWP = 0;

    }



    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        if (waypoints.Length == 0)

            return;

        if (Vector3.Distance (waypoints [currentWP].transform.position,

               NPC.transform.position) < accuracy) {

            currentWP++;

            if (currentWP >= waypoints.Length) {

                currentWP = 0;

            }

        }

        agent.SetDestination (waypoints [currentWP].transform.position);

    }



    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {



    }

}

Perseguição:

Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class Chase : NPCBaseFSM {



     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state

    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        base.OnStateEnter (animator, stateInfo, layerIndex);

    }



    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        agent.SetDestination (opponent.transform.position);

        agent.speed = 5;

    }



    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        agent.speed = 2.5f;

    }



}

Gostaria que alguém me ajudasse com esse problema, ou pelo menos pudesse me explicar como posso fazer para conseguir, obrigado pela atenção! <3

Feliz *2018*


Última edição por dstaroski em Qui Fev 08, 2018 8:03 am, editado 1 vez(es) (Razão : Alterado título conforme os padrões do fórum.)

Gwiisk
Membro
Membro

PONTOS : 1135
REPUTAÇÃO : 0
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajustes na IA inimigo

Mensagem por exodiamk em Dom Jan 14, 2018 12:00 am

MAN TENTA USA UM RAYCAST PRA CONFIRMA SE ELE ESTA VENDO OU NAO O PLAYER AQUI TA UM EXEMPLO QUE PEGUEI AQUI NO FORUMM ELE MANDA UM RAYCAST PRO PLAYER SE LOCALIZA ELE ATACA SE COLIDIR COM ALGO ELE VOLTA A PATRULHA
ABRACOS 
Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(CharacterController))]
public class ZOMBIE : 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
    }
}

exodiamk
Iniciante
Iniciante

PONTOS : 390
REPUTAÇÃO : 0
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajustes na IA inimigo

Mensagem por Gwiisk em Dom Jan 14, 2018 12:26 pm

Bem, eu alterei o script do meu inimigo, coloquei o raycast para a visão, parece estar funcionando, mas não consigo ter certeza, mas ele ainda pega meu personagem atraves da parede, tentei fazer com tags e tudo mais e fica dando erro "Object reference not set an instance of an object", então queria saber como posso resolver ou outro metodo;


Killer IA:

Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class KillerIA : MonoBehaviour {



    Animator anim;

    public GameObject player;

    public float hideDistance = 5;



    Ray thuRay;

    public Color rayColor;

    RaycastHit hit;



    public GameObject GetPlayer() {

        return player;

    }



    // Use this for initialization

    void Start () {

        anim = GetComponent<Animator> ();

    }

    

    // Update is called once per frame

    void Update () {

        Vector3 targetDir = player.transform.position - transform.position;

        float angle = Vector3.Angle (targetDir, transform.forward);



        thuRay = new Ray (transform.position, -transform.forward * 10);



        anim.SetFloat ("distance", Vector3.Distance (transform.position, player.transform.position));

        if (anim.GetFloat ("distance") > hideDistance)

            anim.SetBool ("hide", GameObject.Find ("Player").GetComponent<Controller> ().hide);



        if (angle <= 90 && Physics.Raycast (transform.position, -transform.forward, 10)) {

            Debug.Log ("Can see you");

            anim.SetBool ("canSee", true);

        } else {

            anim.SetBool ("canSee", false);

        }

    }

}

Gwiisk
Membro
Membro

PONTOS : 1135
REPUTAÇÃO : 0
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajustes na IA inimigo

Mensagem por exodiamk em Qua Fev 07, 2018 7:38 pm

mano se esse for seu script voce so colocou para velo coloque depois do Debug.Log ("Can see you");  a parte do codigo que ele ira perseguir o player
e no else coloque se ele vai anda radon ou patrulhar

exodiamk
Iniciante
Iniciante

PONTOS : 390
REPUTAÇÃO : 0
Respeito as regras :

Ver perfil do usuário

Voltar ao Topo Ir em baixo

PEDIDO Re: Ajustes na IA inimigo

Mensagem por dstaroski em Qui Fev 08, 2018 8:03 am

@Gwiisk escreveu:
Olá pessoas! Estou desenvolvendo um jogo de terror com visão Top-Down bem simples, porém acabei ficando preso na IA do meu inimigo, a parte de Patrulhar e Perseguir meu jogador está quase completa, estou com um problema em fazer meu inimigo perseguir meu personagem se estiver somente no campo de visão dele, por enquanto ele persegue independente da direção do meu personagem, e também estou com um problema com ele e portas, quero que se caso, ele estiver perseguindo meu jogador, e durante a perseguição ele atravessar e fechar uma porta antes que inimigo passe, que o inimigo seja capaz de, parar seu movimento, destruir e porta(caso não esteja trancada), e se o personagem ainda estiver no campo de visão continuar a perseguição, caso contrario voltar a patrulhar, estou usando NavMesh e FSM no meu inimigo.
NPCBase:
Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class NPCBaseFSM : StateMachineBehaviour {



    public GameObject NPC;

    public UnityEngine.AI.NavMeshAgent agent;

    public GameObject opponent;

    public float speed = 2.0f;

    public float rotSpeed = 1.0f;

    public float accuracy = 3.0f;



    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        NPC = animator.gameObject;

        opponent = NPC.GetComponent<KillerIA> ().GetPlayer ();

        agent = NPC.GetComponent<UnityEngine.AI.NavMeshAgent> ();

    }

}

Killer IA:


Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class KillerIA : MonoBehaviour {



    Animator anim;

    public GameObject player;

    public float hideDistance = 5;



    public GameObject GetPlayer() {

        return player;

    }

        

    // Use this for initialization

    void Start () {

        anim = GetComponent<Animator> ();

    }

    

    // Update is called once per frame

    void Update () {

        anim.SetFloat ("distance", Vector3.Distance (transform.position, player.transform.position));

        if(anim.GetFloat("distance") > hideDistance)

            anim.SetBool ("hide", GameObject.Find("Player").GetComponent<Controller>().hide);

    }

}


Patrulha:



Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class Patrol : NPCBaseFSM {



    GameObject[] waypoints;

    int currentWP;



    void Awake() {

        waypoints = GameObject.FindGameObjectsWithTag ("waypoint");

    }



     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state

    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        base.OnStateEnter (animator, stateInfo, layerIndex);

        currentWP = 0;

    }



    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        if (waypoints.Length == 0)

            return;

        if (Vector3.Distance (waypoints [currentWP].transform.position,

               NPC.transform.position) < accuracy) {

            currentWP++;

            if (currentWP >= waypoints.Length) {

                currentWP = 0;

            }

        }

        agent.SetDestination (waypoints [currentWP].transform.position);

    }



    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {



    }

}

Perseguição:

Código:
using System.Collections;

using System.Collections.Generic;

using UnityEngine;



public class Chase : NPCBaseFSM {



     // OnStateEnter is called when a transition starts and the state machine starts to evaluate this state

    override public void OnStateEnter(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        base.OnStateEnter (animator, stateInfo, layerIndex);

    }



    // OnStateUpdate is called on each Update frame between OnStateEnter and OnStateExit callbacks

    override public void OnStateUpdate(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        agent.SetDestination (opponent.transform.position);

        agent.speed = 5;

    }



    // OnStateExit is called when a transition ends and the state machine finishes evaluating this state

    override public void OnStateExit(Animator animator, AnimatorStateInfo stateInfo, int layerIndex) {

        agent.speed = 2.5f;

    }



}

Gostaria que alguém me ajudasse com esse problema, ou pelo menos pudesse me explicar como posso fazer para conseguir, obrigado pela atenção! <3

Feliz *2018*
Bom dia! por gentileza não ponha ajuda e tal sem seus títulos. Seja objetivo no título do tópico, descrevendo em parte seu problema. O mesmo será alterado.

Abraço!
dstaroski
dstaroski
Instrutor

Masculino PONTOS : 4030
REPUTAÇÃO : 1047
Idade : 29
Áreas de atuação : Téc. Hardware e Redes, Programação C#, Asp .NET, HTML, CSS, Unity 3D

Respeito as regras :

Ver perfil do usuário http://diegodeoliveira.gamejolt.io/defeattheilluminatis

Voltar ao Topo Ir em baixo

Voltar ao Topo

- Tópicos similares

 
Permissão deste fórum:
Você não pode responder aos tópicos neste fórum