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:
[____TÓPICO LIVRE____] FALE O QUE QUISER (Parte 2)
[TUTORIAL] MENU PRINCIPAL - UNITY 5 (5.3 ou superior) (Com UI)
[TUTORIAL] Acionar a vibração do dispositivo
Manager Como fazer um jogo nesse estilo?
Como criar conta de publicador na asset store?
Problema de renderização
[Projeto]Simples em Desenvolvimento The Dolls Battle
Scripts !
Problema com script
Como fazer para aparecer um objeto na tela ao clicar com o mouse ou apertar um botão?
Quando a porta estiver trancada dar tipo uma tremedeira
Sorteio Especial GTA V,HELLO NEIGHBOR,PUBG
SonyVegas com qualidade ruim
Cores invertidas/Estranhas no PC
C# Script de Camera
[RESOLVIDO] Compra de asset
criar um app que atende a vários produtos.
Script para abrir e fechar gaveta
Minimap/Radar/GPS Estilo GTA V
Movimento 8 lados e utilização reflexiva de If e Else If (Resolução Transform).
[PROJETO MOBILE] Defeat the Illuminatis
Duvida sobre o unity IAP (compras na google play)
Programação e autonomia
Client Sincronizar objeto sem ser o player ??? (Networking Unet)
[TUTORIAL] AI Enemy ( Jogos de terror )
[____ADMINISTRAÇÃO____] Por que ninguém responde o seu tópico?
Problema de luz com objetos do ProBuilder
PROCURA-SE DESIGNER 2D e ROTEIRISTA PARA PROJETO EM ANDAMENTO!
[RESOLVIDO] Script para textura 3D
[TUTORIAL] Unity 5 - Como utilizar o Animator
Bug com mesh na animação
Formação de Equipe - programadores de C# na unity
Participe da Game Jam - Jaaj do canal Amdré Young!
movimento do porsonagen junto com objeto
[RESOLVIDO] Som na lanterna falhando
imagem transparente
[ AJUDA] Estou com problemas para acessar índice de uma Lista e realizar uma acao
Diferentes tamanhos de Textura afeta o desempenho do jogo?
[____ADMINISTRAÇÃO____] PRECISO DE AJUDA [DICA PARA SER AJUDADO]
[____APOIE O FÓRUM E O CANAL E GANHE RECOMPENSAS____]
Emulador em seu jogo como Descobrir
[GAME JAM] Consegue Fazer um jogo em 15 dias ?
[TUTORIAL] Lanterna
Textura em 3 dimensões na Unity 2018.2??????
Script que ao clicar em um objeto, abra um formulário
[RESOLVIDO] como atualizar o status do perfil na conta unity
[Projeto] Line Battle
Como Posso editar Animação Generic mixamo ?
[TUTORIAL] Sistema de EXP, upar níveis, entre outros
[AULA] Estrutura de repetição while e do while
Como fazer um analogico para rotaciona a camera do jogador? android
Como mudar de Scene sem perder os valores das variáveis
Como mudar alguma configuração de acordo com a resolução da tela?
Timer
Precisa-se de Criador de sprites.
Como criar um Reflexo falso como do Sonic Adventure?
[ FIND ME ] Game em Desenvolvimento
Compilando pra android
[AULA] Estrutura de repetição for
[AULA] Listas (List)
Como encurtar e melhorar meu código, elevador(+ dúvida sobre programação em unity)
GetActiveScene
[TUTORIAL] C# .NET | Visual Studio - conexão com banco de dados MySQL
[___COMO UTILIZAR O FÓRUM___] Principais botões e suas funções
[TUTORIAL] MOVIMENTO NA ARMA PARA FICAR MAIS REAL!
(dúvida) fazer o player cair de paraquedas estilo pubg
[TUTORIAL] Como criar cénarios 2D muito rapido e facil.
Porta "bugada"
[TUTORIAL] C# .NET | Cores aleatorias RGB
RECRUTA-SE DESIGNER PARA JOGO ONLINE..
[RESOLVIDO] Script de porta trancada com audio
Animation Fps
[RESOLVIDO] Problema com StartCoroutine
[RESOLVIDO] Erro ao usar DLL/Biblioteca do Mysql
R7 - GOOH (resident evil 7)
[ NONAME ] Procura de pessoas interessadas
FPS - Armas e balas
Voice Chat
Jogo - Board Challenge Free
[RESOLVIDO] Gerenciador de arquivos CSV
Editor de vídeo gratuito.
Erro ao usar WWW na unity
[RESOLVIDO] color.a diminuir gradualmente
Pack de áudio/ efeitos sonoros gratuitos.
[TUTORIAL] Cursor do mouse não aparecer durante o jogo
Se eu fazer uma animação diferente pra cada personagem,vai pesar ?
Como fazer um sistema de se esconder?
Dragon Bones [software]
Auto-Update de forma rápida, simples e barata.
Como fazer um botão Joystick que controle o First Person Controller?
Cloud Save por arquivo binario no google play services
[RESOLVIDO] Como editar o texto que eu selecionar ? - (InputField)
Como verificar uma colisão constante ?
[TUTORIAL] CONFIGURANDO O UNITY PARA COMPILAR PARA ANDROID
Como fazer ótimo FPSController com full body?
onde publicar os trabalhos prontos.
[RESOLVIDO] Como usar "?" e ":" ?
[RESOLVIDO] Detectar colisão usando if em C#?
[ENQUETE OFICIAL] Você está vendo o CHAT DO FÓRUM?????
Hoje à(s) 12:37 am
Ontem à(s) 8:16 pm
Ontem à(s) 8:14 pm
Ontem à(s) 7:32 pm
Ontem à(s) 6:39 pm
Ontem à(s) 3:16 pm
Ontem à(s) 3:16 pm
Ontem à(s) 3:10 pm
Ontem à(s) 2:56 pm
Ontem à(s) 2:25 pm
Ontem à(s) 2:20 pm
Ontem à(s) 2:14 pm
Ontem à(s) 2:04 pm
Ontem à(s) 11:55 am
Qui Jul 19, 2018 8:06 pm
Qui Jul 19, 2018 5:20 pm
Qui Jul 19, 2018 4:29 pm
Qui Jul 19, 2018 3:13 pm
Qui Jul 19, 2018 2:29 pm
Qui Jul 19, 2018 10:14 am
Qui Jul 19, 2018 10:10 am
Qui Jul 19, 2018 10:06 am
Qui Jul 19, 2018 1:11 am
Qua Jul 18, 2018 9:18 pm
Qua Jul 18, 2018 9:13 pm
Qua Jul 18, 2018 8:04 pm
Qua Jul 18, 2018 5:33 pm
Qua Jul 18, 2018 4:28 pm
Qua Jul 18, 2018 4:26 pm
Qua Jul 18, 2018 4:09 pm
Qua Jul 18, 2018 2:38 pm
Qua Jul 18, 2018 1:52 pm
Qua Jul 18, 2018 11:30 am
Qua Jul 18, 2018 10:10 am
Qua Jul 18, 2018 9:36 am
Ter Jul 17, 2018 11:46 pm
Ter Jul 17, 2018 8:57 pm
Ter Jul 17, 2018 6:44 pm
Ter Jul 17, 2018 5:38 pm
Ter Jul 17, 2018 5:37 pm
Ter Jul 17, 2018 5:34 pm
Ter Jul 17, 2018 3:58 pm
Ter Jul 17, 2018 3:35 pm
Ter Jul 17, 2018 1:51 pm
Ter Jul 17, 2018 12:15 pm
Seg Jul 16, 2018 8:15 pm
Seg Jul 16, 2018 5:01 pm
Seg Jul 16, 2018 4:01 pm
Seg Jul 16, 2018 3:08 pm
Seg Jul 16, 2018 2:11 pm
Seg Jul 16, 2018 1:32 pm
Seg Jul 16, 2018 9:55 am
Dom Jul 15, 2018 11:46 pm
Dom Jul 15, 2018 10:34 pm
Dom Jul 15, 2018 10:32 pm
Dom Jul 15, 2018 10:03 pm
Dom Jul 15, 2018 9:15 pm
Dom Jul 15, 2018 2:05 pm
Dom Jul 15, 2018 12:42 am
Dom Jul 15, 2018 12:35 am
Sab Jul 14, 2018 11:38 pm
Sab Jul 14, 2018 8:06 pm
Sab Jul 14, 2018 6:54 pm
Sab Jul 14, 2018 4:23 pm
Sab Jul 14, 2018 9:44 am
Sab Jul 14, 2018 9:42 am
Sab Jul 14, 2018 12:58 am
Sex Jul 13, 2018 11:09 pm
Sex Jul 13, 2018 10:20 pm
Sex Jul 13, 2018 8:28 pm
Sex Jul 13, 2018 2:11 pm
Sex Jul 13, 2018 12:39 pm
Sex Jul 13, 2018 11:01 am
Sex Jul 13, 2018 10:31 am
Sex Jul 13, 2018 8:53 am
Qui Jul 12, 2018 11:07 pm
Qui Jul 12, 2018 10:52 pm
Qui Jul 12, 2018 10:14 pm
Qui Jul 12, 2018 9:27 pm
Qui Jul 12, 2018 8:05 pm
Qui Jul 12, 2018 7:33 pm
Qui Jul 12, 2018 7:12 pm
Qui Jul 12, 2018 6:29 pm
Qui Jul 12, 2018 6:11 pm
Qui Jul 12, 2018 5:04 pm
Qui Jul 12, 2018 4:10 pm
Qui Jul 12, 2018 3:41 pm
Qui Jul 12, 2018 3:05 pm
Qui Jul 12, 2018 11:38 am
Qui Jul 12, 2018 10:27 am
Qui Jul 12, 2018 10:27 am
Qui Jul 12, 2018 10:05 am
Qui Jul 12, 2018 9:51 am
Qui Jul 12, 2018 1:16 am
Qua Jul 11, 2018 7:25 pm
Qua Jul 11, 2018 6:33 pm
Qua Jul 11, 2018 5:24 pm
Qua Jul 11, 2018 1:44 pm
Ter Jul 10, 2018 7:54 pm
MarcosSchultz
kaufergomi
FelipeSouza11
Callyde Jr
Unidade3d5
vitorhugo
FelipeSouza11
MayLeone
Tiago95
Tiago95
RafaelSquid1
NKKF
Tegh
Callyde Jr
MayLeone
MRX
natanael.olimpio
LucioHenrique890
Isabela
dstaroski
dstaroski
Tegh
QueriaStarMorto
Extreme Craft
Mourao
Tegh
LucasF
rafilkl2
vitorhugo
FelipeSouza11
Dom3000
QueriaStarMorto
Tegh
dstaroski
RafaelSquid1
JohnRambo
Callyde Jr
Dom3000
dstaroski
dstaroski
dstaroski
Dom3000
RafaelSquid1
LucioHenrique890
RandomStuff
marciosilva
MRX
natanael.olimpio
andradetd
NKKF
FelipeSouza11
dstaroski
Nalfam
hetrodo
LucioHenrique890
dkrazor
dstaroski
NKKF
Tegh
Tegh
AprDev
NKKF
Tegh
dstaroski
gcs13
gcs13
LucioHenrique890
Nalfam
Tegh
Picode
RafaelSquid1
FelipeGD
igorobm
igorobm
RafaelSquid1
Locodapraça
LucioHenrique890
FelipeGD
FelipeGD
NKKF
Nalfam
NKKF
Eduardoro39
FelipeGD
FelipeGD
FelipeGD
RafaelSquid1
Zack2
NKKF
RafaelSquid1
jhobert77
Tiago95
NKKF
FelipeGD
FelipeGD
marciosilva
PauloFR
Lorena Martins
zZAndersonZz

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 : 948
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 : 203
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 : 948
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 : 203
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!
avatar
dstaroski
Instrutor

Masculino PONTOS : 3523
REPUTAÇÃO : 854
Idade : 29
Áreas de atuação : Téc. Hardware e Redes, Programação C#, Daz3D and Gimp

Respeito as regras :

Ver perfil do usuário https://gamejolt.com/games/defeattheilluminatis/347786

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