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:
Nitro para Carro
Firebase (Login com facebook)
[____TÓPICO LIVRE____] FALE O QUE QUISER (Parte 2)
Duvida com API Vulkan Vs OpenGL -- Unity !!!!
Procura-se equipe para jogo de puzzle em 3º Pessoa
Ajuda jogo
duvida player quicando ao descer desnivel
cliente/servidor
Animação de abrir/fechar porta mais complexa
duvida sobre essa Ui e raycast
Duvida Tamanho do Mapa unity
[Formação de Equipe] - City Driving
Graficos bugados no android Unity 5
[ASSET] Script Arma Completo Incluso Recuo. Incluso outros Scripts
Clicar em um Sprite e realizar uma ação
[TUTORIAL] FPSController nadar e mergulhar, junto com efeito submerso
Ajuda com Colisões
mudar objeto ao clicar nele
Ajuda com um script(SmoothCamera)
Duvida em Desenhar UI -- HELP
Finalização Calculadora, fazer com que o jogador tente novamente
Como colocar musicas em um app?
[Duvida] Sobre Reference Resolution -> (Canvas)
Como criar navegador próprio em app?
[RESOLVIDO] Duvida sobre Edição de texto em imagem
Da pra criar Apps na Unity?
BUG MT CHATO. USANDO O PlayerPrefs. ME AJUDAAAAAAA PF
[RESOLVIDO] Camera não colide com parede
Há algum segredo em criações de I.A?
[RESOLVIDO] salvar as configurações para aparecer no game certo que o jogador configurou
Dica de estudos
[RESOLVIDO] Duvida Sobre C#
Script parando de funcionar quando maximizo a tela do game
Fazer uma seleção de personagens e seguir para o jogo com o personagem escolhido
Como faço para colocar unity em rede
personagem
Criar animações
Detectar movimento Joystick
tem como abrir arquivos de jogos já compilado?
Como criar rede neural para AI
[____ADMINISTRAÇÃO____] Gostaria da opinião de vocês...
[____ADMINISTRAÇÃO____] Alterações IMPORTANTES no fórum.
Navegador reiniciando no mobile dos IOS [WEBGL]
[RESOLVIDO] Dúvida Script OnTriggerEnter
Gerar APK
[TUTORIAL] Salvar dados com playerprefs facilmente.
É possível reproduzir som durante logo de abertura do jogo?
[TUTORIAL] Criação de Skins Realistas em 3D!
Command 888
Sistema de Yu-Gi-Oh - C O M P L E T O - Download 13/08
[RESOLVIDO] Como fazer uma calculadora recebendo o resultado do jogador? UNITY
Construção de um save das configurações e ir pro jogo com as config certas
Podem me ajudar com esse problema
Contagem de tempo em classes abstratas
[TUTORIAL] Controle 3ª pessoa com animações mecânicas (root motion)
[RESOLVIDO] Como mostrar o valor atual de uma variável do tipo Int em um text
Como se faz um dash?
Como permitir que o usuário escolha uma imagem para ser usada em um jogo?
[Projeto em Andamento] Favela Combat - Multiplayer online (Android & iOS)
[TUTORIAL] Sistema Pdv, Mercado, Padaria, Conveniência, Lojas Em Geral - C# VISUAL STUDIO
Diferenciar execução (mobile / desktop) WEBGL
Como mudar de camera assim que o player entrar no Trigger
WEBGL
Como faço para mover um objeto?
[TUTORIAL] Unity 5 - Sistema Completo de PORTAS E CHAVES
Ajuda em bug da Unity!
como mudar o material de um mesh que tem mas de 1 material por Script ?
[Duvida] Como funciona a coleta de dados e como é feito?
Teclado na Unity
Formação de equipe -- ASSALTO A BANCO--
Câmera estar limitada ao tamanho da tela
ESCOLA DE DESENVOLVIMENTO DE GAMES.
Mudar uma animação já existente com o clique em um botão UI
Cam
[RESOLVIDO] Minha imagem só aparece na scene
COMO EXPORTAR PARA IOS COM WINDOWS
Criei uma Grama com Shader Graph
[TUTORIAL] Mover personagem com Touch, no estilo SUBWAY SURFERS
Joystick
Limite Máximo de tamanho de mapa na Unity?
Jogo Mobile (Leia)
Entender um script
[RESOLVIDO] Como Ativar Objeto Apenas na Frente Dele?
POR QUE O TOUCH MOBILE TRAVA COM ADMOB?
Qual o Tempo Máximo que vocês Jogaram um Jogo ?
Tocar audio
Todos os veiculos mudando de cor no multplayer, como resolver ?
[Projeto em Andamento] Brazil Combat
Background com bug
[Projeto] Omega Racers
[RESOLVIDO] Clones morrendo ao mesmo tempo?
Alguém pode me dizer o que esse script está fazendo?
HELP inimigo perseguir personagens
Html 5
1 exception was raised by workers: see the console for detail HELP
Acessar teclado nativo dispositivo, para inputFiled [WEBGL]
Como fazer uma animação parar em determinado frame?
Meu Jogo inspirado em resident evil 2 remake
Posso limitar o "Instantiate" para instanciar até uma quantidade X?
Hoje à(s) 6:32 pm
Hoje à(s) 6:22 pm
Hoje à(s) 6:06 pm
Hoje à(s) 5:02 pm
Hoje à(s) 4:48 pm
Hoje à(s) 2:25 pm
Hoje à(s) 1:29 pm
Hoje à(s) 11:47 am
Hoje à(s) 9:51 am
Hoje à(s) 3:47 am
Ontem à(s) 11:29 pm
Ontem à(s) 9:40 pm
Ontem à(s) 7:08 pm
Ontem à(s) 5:33 pm
Ontem à(s) 3:16 pm
Sab Ago 17, 2019 11:23 pm
Sab Ago 17, 2019 3:16 am
Sex Ago 16, 2019 11:27 pm
Sex Ago 16, 2019 8:50 pm
Sex Ago 16, 2019 12:19 pm
Sex Ago 16, 2019 12:07 pm
Sex Ago 16, 2019 10:58 am
Sex Ago 16, 2019 6:33 am
Qui Ago 15, 2019 6:42 pm
Qui Ago 15, 2019 4:02 pm
Qui Ago 15, 2019 12:10 pm
Qui Ago 15, 2019 11:57 am
Qua Ago 14, 2019 7:13 pm
Qua Ago 14, 2019 6:07 pm
Qua Ago 14, 2019 5:48 pm
Qua Ago 14, 2019 5:18 pm
Qua Ago 14, 2019 5:05 pm
Qua Ago 14, 2019 5:00 pm
Qua Ago 14, 2019 4:56 pm
Qua Ago 14, 2019 4:53 pm
Qua Ago 14, 2019 4:52 pm
Qua Ago 14, 2019 4:49 pm
Qua Ago 14, 2019 4:47 pm
Qua Ago 14, 2019 4:45 pm
Qua Ago 14, 2019 4:44 pm
Qua Ago 14, 2019 4:35 pm
Qua Ago 14, 2019 4:32 pm
Qua Ago 14, 2019 4:31 pm
Qua Ago 14, 2019 4:10 pm
Qua Ago 14, 2019 12:39 am
Ter Ago 13, 2019 10:23 pm
Ter Ago 13, 2019 10:03 pm
Ter Ago 13, 2019 7:53 pm
Ter Ago 13, 2019 6:33 pm
Ter Ago 13, 2019 4:26 pm
Ter Ago 13, 2019 4:10 pm
Seg Ago 12, 2019 11:25 pm
Seg Ago 12, 2019 8:31 pm
Seg Ago 12, 2019 6:17 pm
Seg Ago 12, 2019 12:51 pm
Dom Ago 11, 2019 7:54 pm
Dom Ago 11, 2019 10:17 am
Sab Ago 10, 2019 10:32 pm
Sab Ago 10, 2019 2:34 pm
Sex Ago 09, 2019 10:43 pm
Sex Ago 09, 2019 5:56 pm
Qui Ago 08, 2019 7:48 pm
Qui Ago 08, 2019 5:21 pm
Qui Ago 08, 2019 12:32 pm
Qui Ago 08, 2019 2:53 am
Qua Ago 07, 2019 10:57 pm
Qua Ago 07, 2019 8:10 pm
Qua Ago 07, 2019 7:16 pm
Qua Ago 07, 2019 4:29 pm
Qua Ago 07, 2019 2:51 pm
Seg Ago 05, 2019 11:24 pm
Seg Ago 05, 2019 9:51 pm
Seg Ago 05, 2019 8:48 pm
Seg Ago 05, 2019 8:33 pm
Seg Ago 05, 2019 7:36 pm
Seg Ago 05, 2019 6:23 pm
Seg Ago 05, 2019 5:31 pm
Seg Ago 05, 2019 5:27 pm
Seg Ago 05, 2019 2:35 am
Seg Ago 05, 2019 2:27 am
Dom Ago 04, 2019 7:37 pm
Dom Ago 04, 2019 4:25 pm
Dom Ago 04, 2019 3:58 pm
Dom Ago 04, 2019 3:44 pm
Dom Ago 04, 2019 4:50 am
Dom Ago 04, 2019 4:39 am
Dom Ago 04, 2019 4:37 am
Sab Ago 03, 2019 9:43 pm
Sab Ago 03, 2019 9:13 pm
Sex Ago 02, 2019 8:47 pm
Sex Ago 02, 2019 11:55 am
Sex Ago 02, 2019 2:48 am
Sex Ago 02, 2019 2:41 am
Sex Ago 02, 2019 2:36 am
Qui Ago 01, 2019 11:00 pm
Qui Ago 01, 2019 10:50 pm
Qui Ago 01, 2019 10:47 pm
Qui Ago 01, 2019 8:23 pm
Qua Jul 31, 2019 11:00 pm
HeroSword
Zack2
Tegh
SteveRogers
merike11
richerd
Édipo
Valakinhas
ovoPentelho
clarckquente
MarcosSchultz
artplayer
MarcosSchultz
Jhonyzin
MayLeone
Callyde Jr
MarcosSchultz
MayLeone
rafaelllsd
SteveRogers
lucaspoiob
Daniel Dória
nibirou
Daniel Dória
nibirou
Daniel Dória
daniel123163
SergioDB
Projeto Residentes Evil
lucaspoiob
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
Dionilson
guimaraf
rafaelllsd
artplayer
Diguinho
Callyde Jr
MayLeone
lucaspoiob
Unidade3d5
MayLeone
MayLeone
dstaroski
RodriGO3477
SteveRogers
artplayer
dkrazor
Chilinger
numb123
Matrirxp
MarcosSchultz
Lonx SpellArtsStudio
MarcosSchultz
SteveRogers
ffabim
poyser
artplayer
artplayer
joffersoju
rafaelllsd
RodriGO3477
MarcosSchultz
Hamassfall
gtcmcsgo
MarcosSchultz
MarcosSchultz
MarcosSchultz
MarcosSchultz
iToddy
MayLeone
LardosJogos
artplayer
MarcosSchultz
MarcosSchultz
MarcosSchultz
dkrazor
abraao36
zZAndersonZz
speedluk
MarcosSchultz
MarcosSchultz
MarcosSchultz
Magnatah
Magnatah
Magnatah
iToddy
RodriGO3477

Problema com AI

Ir em baixo

DÚVIDA Problema com AI

Mensagem por abraao36 em Qui Jul 25, 2019 2:43 pm

Pessoal, estou escrevendo um script de AI para os meus inimigos e estou com um problema.
Quando o player dispara os inimigos se deslocam para os esconderijos mais próximos. Eu queria que dois inimigos não ocupassem o mesmo local ao mesmo tempo. Sou iniciante em programação e não faço ideia de como fazer isso. Se alguém puder me ajudar ou indicar algum tutorial para isso eu agradeceria muito.

Esse é o meu script
Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

[RequireComponent(typeof(AudioSource))]
public class Enemies : MonoBehaviour
{
    public enum Status
    {
        Patrol,
        AttackPlayer,
        Idle,
        Dead
    };

    Status enemiesStatus = Status.Patrol;

    public GameObject dropAmmoCanvas;
    private GameObject player;
    public AudioClip shoot;
    AudioSource gun;

    public float speed;
    private float waitTime;
    public float startWaitTime;

    public List<Transform> moveSpots;
    public List<Transform> hideSpots;
    private int randomSpot;
    public int nearestHideSpotIndex = 0;

    private bool canAttack = true;
    private bool playerIsShooting = false;
    public bool isDead = false;

    private int minDam = 0;
    private int maxDam = 8;
    private int minFrequency = 3;
    private int maxFrequency = 6;

    private int minDroppedAmmo = 0;
    private int maxDroppedAmmo = 10;
    public int droppedAmmo;


    void Start()
    {
        player = GameObject.FindWithTag("Player");
        gun = GetComponent<AudioSource>();

        waitTime = startWaitTime;
        randomSpot = Random.Range(0, moveSpots.Count);
    }


    void Update()
    {
        switch (enemiesStatus)
        {
            case Status.AttackPlayer:

                CheckNearestHideSpot();

                transform.position = Vector2.MoveTowards(transform.position, hideSpots[nearestHideSpotIndex].position, speed * Time.deltaTime);

                Attack();

                break;
            case Status.Patrol:

                transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);

                if (Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
                {
                    if (waitTime <= 0)
                    {
                        randomSpot = Random.Range(0, moveSpots.Count);
                        waitTime = startWaitTime;
                    }
                    else
                    {
                        waitTime -= Time.deltaTime;
                    }
                }

                break;
            case Status.Idle:
                StopAllCoroutines();
                break;
            case Status.Dead:
                StopAllCoroutines();
                GetComponent<Animator>().SetBool("died", true);
                droppedAmmo = Random.Range(minDroppedAmmo, maxDroppedAmmo);
                if(dropAmmoCanvas != null && droppedAmmo > 0)
                {
                    dropAmmoCanvas.gameObject.SetActive(true);
                }
                
                break;
        }


        if(Input.GetMouseButtonDown(0) && player.GetComponent<Weapon>().isReloading == false && player.GetComponent<Weapon>().isDryFire == false && !EventSystem.current.IsPointerOverGameObject())
        {
            if (player.GetComponent<Player>().life > 0)
            {
                playerIsShooting = true;
                
            }
            
        }

        if (playerIsShooting && player.GetComponent<Player>().life > 0)
        {
            enemiesStatus = Status.AttackPlayer;
        }

        if (player.GetComponent<Player>().life <= 0)
        {
            enemiesStatus = Status.Idle;
        }

        if (isDead)
        {
            enemiesStatus = Status.Dead;
        }

    }

    void Attack()
    {
        if (canAttack && playerIsShooting)
        {
            StartCoroutine(Attacking());
        }
        
    }

    void CheckNearestHideSpot()
    {
        float maxDistance = 99999999999999999;
        for (int x = 0; x < hideSpots.Count; x++)
        {
            float actualHideSpotDistance = Vector2.Distance(transform.position, hideSpots[x].transform.position);
            if (actualHideSpotDistance < maxDistance)
            {
                maxDistance = actualHideSpotDistance;
                nearestHideSpotIndex = x;
            }
        }
    }

    IEnumerator Attacking()
    {
        canAttack = false;
        yield return new WaitForSeconds(Random.Range(minFrequency, maxFrequency));
        gun.PlayOneShot(shoot,0.4f);
        player.GetComponent<Player>().life -= Random.Range(minDam, maxDam);
        canAttack = true;
    }
}

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por Magnatah em Qui Jul 25, 2019 3:49 pm

Você Pode Fazer o Npc lançar um Raycast no lugar onde ele esta indo, caso do Hit colidir com algum outro Npc neste local,  Ele vai para outro esconderijo.


Você Tambem poderia verificar Qual Lugar irá ser ocupado, exemplo:

Este Método  "CheckNearestHideSpot()"  Define para onde o npc vai.

- Crie booleanas a Quantidade depende de quantos lugares ele pode se esconder.
(vamos supor que os Npc só possa se esconder em 5 lugares).


- Então Irei Criar um vetor do tipo bool com 5 posições ->    private bool[] LugarOcupado = new bool[5];

- Agora é só Verificar se o Lugar Escolhido está ocupado, Caso Não esteja o npc pode ir para lá:
Código:
void CheckNearestHideSpot()
{
    float maxDistance = 99999999999999999;
    for (int x = 0; x < hideSpots.Count; x++)
    {
        float actualHideSpotDistance = Vector2.Distance(transform.position, hideSpots[x].transform.position);
        if (actualHideSpotDistance < maxDistance && !LugarOcupado[x])
        {
            maxDistance = actualHideSpotDistance;
            LugarOcupado[x] = true;
            nearestHideSpotIndex = x;
        }
    }
 }


Caso o Npc Morra é só fazer o seu lugar ficar desocupado.
Código:
case Status.Dead:
    StopAllCoroutines();
    GetComponent<Animator>().SetBool("died", true);
    droppedAmmo = Random.Range(minDroppedAmmo, maxDroppedAmmo);
    if(dropAmmoCanvas != null && droppedAmmo > 0)
    {
        dropAmmoCanvas.gameObject.SetActive(true);
    }
      LugarOcupado[nearestHideSpotIndex] = false;
break;
Magnatah
Magnatah
Instrutor

Masculino PONTOS : 1095
REPUTAÇÃO : 88
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras : Problema com AI Aad8pUi

Ver perfil do usuário https://magnuspage.000webhostapp.com/index.php

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Qui Jul 25, 2019 7:35 pm

Não deu certo. Tentei com os seus códigos e não mudou nada. Eles continuavam ocupando o mesmo local e não dava nenhum erro. Depois tentei com o Raycast e também não mudou nada kkk. Por fim fiz isso aqui

Coloquei esse script nos hidespots.
Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class HideSpots : MonoBehaviour
{
    private GameObject soldier;
    public bool estaOcupado = false;
    void Start()
    {
        soldier = GameObject.FindWithTag("Soldier");
    }


    void Update()
    {
        if(Vector2.Distance(transform.position, soldier.transform.position) < 0.02f)
        {
            estaOcupado = true;
        }
    }
}


E fiz essa modificação na void CheckNearestHideSpot:
Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

[RequireComponent(typeof(AudioSource))]
public class Enemies : MonoBehaviour
{
    public enum Status
    {
        Patrol,
        AttackPlayer,
        Idle,
        Dead
    };

    Status enemiesStatus = Status.Patrol;

    public GameObject dropAmmoCanvas;
    private GameObject player;
    public AudioClip shoot;
    AudioSource gun;

    public float speed;
    private float waitTime;
    public float startWaitTime;

    public List<Transform> moveSpots;
    public List<Transform> hideSpots;
    private int randomSpot;
    public int nearestHideSpotIndex = 0;

    private bool canAttack = true;
    private bool playerIsShooting = false;
    public bool isDead = false;

    private int minDam = 0;
    private int maxDam = 8;
    private int minFrequency = 3;
    private int maxFrequency = 6;

    private int minDroppedAmmo = 0;
    private int maxDroppedAmmo = 10;
    public int droppedAmmo;


    void Start()
    {
        player = GameObject.FindWithTag("Player");
        gun = GetComponent<AudioSource>();

        waitTime = startWaitTime;
        randomSpot = Random.Range(0, moveSpots.Count);
    }


    void Update()
    {
        switch (enemiesStatus)
        {
            case Status.AttackPlayer:

                CheckNearestHideSpot();

                transform.position = Vector2.MoveTowards(transform.position, hideSpots[nearestHideSpotIndex].position, speed * Time.deltaTime);

                Attack();

                break;
            case Status.Patrol:

                transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);

                if (Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
                {
                    if (waitTime <= 0)
                    {
                        randomSpot = Random.Range(0, moveSpots.Count);
                        waitTime = startWaitTime;
                    }
                    else
                    {
                        waitTime -= Time.deltaTime;
                    }
                }

                break;
            case Status.Idle:
                StopAllCoroutines();
                break;
            case Status.Dead:
                StopAllCoroutines();
                GetComponent<Animator>().SetBool("died", true);
                droppedAmmo = Random.Range(minDroppedAmmo, maxDroppedAmmo);
                if(dropAmmoCanvas != null && droppedAmmo > 0)
                {
                    dropAmmoCanvas.gameObject.SetActive(true);
                }

                break;
        }


        if(Input.GetMouseButtonDown(0) && player.GetComponent<Weapon>().isReloading == false && player.GetComponent<Weapon>().isDryFire == false && !EventSystem.current.IsPointerOverGameObject())
        {
            if (player.GetComponent<Player>().life > 0)
            {
                playerIsShooting = true;
                
            }
            
        }

        if (playerIsShooting && player.GetComponent<Player>().life > 0)
        {
            enemiesStatus = Status.AttackPlayer;
        }

        if (player.GetComponent<Player>().life <= 0)
        {
            enemiesStatus = Status.Idle;
        }

        if (isDead)
        {
            enemiesStatus = Status.Dead;
        }

    }

    void Attack()
    {
        if (canAttack && playerIsShooting)
        {
            StartCoroutine(Attacking());
        }
        
    }

    void CheckNearestHideSpot()
    {
        float maxDistance = 99999999999999999;
        for (int x = 0; x < hideSpots.Count; x++)
        {
            float actualHideSpotDistance = Vector2.Distance(transform.position, hideSpots[x].transform.position);
            if (actualHideSpotDistance < maxDistance)
            {
                maxDistance = actualHideSpotDistance;
                nearestHideSpotIndex = x;
                RaycastHit hit;
                if(Physics.Raycast(transform.position, hideSpots[nearestHideSpotIndex].position, out hit, 500))
                {
                    if (hit.transform.gameObject.GetComponent<HideSpots>().estaOcupado)
                    {
                        nearestHideSpotIndex++;
                    }
                    else if (hit.transform.gameObject.GetComponent<HideSpots>().estaOcupado == false)
                    {
                        nearestHideSpotIndex = x;
                    }
                }
            }
        }
    }


    IEnumerator Attacking()
    {
        canAttack = false;
        yield return new WaitForSeconds(Random.Range(minFrequency, maxFrequency));
        gun.PlayOneShot(shoot,0.4f);
        player.GetComponent<Player>().life -= Random.Range(minDam, maxDam);
        canAttack = true;
    }
}


Agora está acusando esse erro toda vez que os inimigos tentam ocupar o mesmo local, mas acho que foi o mais perto que chegou de dar certo kkkk.

NullReferenceException: Object reference not set to an instance of an object
Enemies.CheckNearestHideSpot () (at Assets/Scripts/Enemies.cs:153)
Enemies.Update () (at Assets/Scripts/Enemies.cs:63)

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por ffabim em Qui Jul 25, 2019 8:38 pm

- Então Irei Criar um vetor do tipo bool com 5 posições ->    private bool[] LugarOcupado = new bool[5];
ffabim
ffabim
MembroAvançado

Masculino PONTOS : 1351
REPUTAÇÃO : 44
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por Magnatah em Qui Jul 25, 2019 8:50 pm

eu sei que é obvio, mas verifique se o algum hideSpots está sem o script  "HideSpots".
Magnatah
Magnatah
Instrutor

Masculino PONTOS : 1095
REPUTAÇÃO : 88
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras : Problema com AI Aad8pUi

Ver perfil do usuário https://magnuspage.000webhostapp.com/index.php

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Qui Jul 25, 2019 8:56 pm

@ffabim escreveu:- Então Irei Criar um vetor do tipo bool com 5 posições ->    private bool[] LugarOcupado = new bool[5];
Fiz essa etapa.

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Qui Jul 25, 2019 8:58 pm

@Magnatah escreveu:eu sei que é obvio, mas verifique se o algum hideSpots está sem o script  "[size=39]HideSpots".[/size]
Verifiquei. Todos estão com o script.

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por Magnatah em Qui Jul 25, 2019 9:04 pm

Faz esse tipo de verificação no Raycast:

Os hideSpots Tem que Star com o nome "HideSpots"

Código:
if (Physics.Raycast(transform.position, hideSpots[nearestHideSpotIndex].position, out hit, 500))
{
    if (hit.transform.gameObject.name == "HideSpots")
    {
        if (hit.transform.gameObject.GetComponent<HideSpots>().estaOcupado)
        {
            nearestHideSpotIndex++;
        }

        else if (hit.transform.gameObject.GetComponent<HideSpots>().estaOcupado == false)
        {
            nearestHideSpotIndex = x;
        }
    }
}
Magnatah
Magnatah
Instrutor

Masculino PONTOS : 1095
REPUTAÇÃO : 88
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras : Problema com AI Aad8pUi

Ver perfil do usuário https://magnuspage.000webhostapp.com/index.php

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Qui Jul 25, 2019 9:28 pm

O erro sumiu mas voltaram a ocupar o mesmo local. Deixei a bool  "estaOcupado" ativa em um dos hidespots e o inimigo foi para ela do mesmo jeito.

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por Magnatah em Qui Jul 25, 2019 9:34 pm

deve ser por causa da linha 149.  Remove Ela
"nearestHideSpotIndex = x;"


Última edição por Magnatah em Qui Jul 25, 2019 10:11 pm, editado 1 vez(es)
Magnatah
Magnatah
Instrutor

Masculino PONTOS : 1095
REPUTAÇÃO : 88
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras : Problema com AI Aad8pUi

Ver perfil do usuário https://magnuspage.000webhostapp.com/index.php

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Qui Jul 25, 2019 10:08 pm

Deu na mesma. Amanhã vou criar outra cena e tentar corrigir esse problema.

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por Magnatah em Sex Jul 26, 2019 12:41 pm

Eu sei Porque o Primeiro Método Que Fiz Deu Errado, O Array Que Eu Criei "LugarOcupado[]" é um atributo que cada npc tem ou seja, Se voce tem 5 Npcs utilizando o script "Enemies" irá existir 5 Atributos "LugarOcupado[]".


Deixe ela Etatica.

"Métodos e variáveis estáticas são elementos que pertencem à classe e não ao objeto".

Código:
 public static bool[] LugarOcupado = new bool[5];

Só lembrando coloquei 5 posições como exemplo, Coloque a Quantidade de HideSpots da sua cena.
Magnatah
Magnatah
Instrutor

Masculino PONTOS : 1095
REPUTAÇÃO : 88
Idade : 24
Áreas de atuação : Dєรєиvσlvєdσя Wєb(Fяσит-єиd), Blєиdєя, υиiтy, C#, ρнρ є Jαvαรcяiρт.
Respeito as regras : Problema com AI Aad8pUi

Ver perfil do usuário https://magnuspage.000webhostapp.com/index.php

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por Chilinger em Sex Jul 26, 2019 1:14 pm

Voce pode criar um dictionary e nele voce colocar as posiçoes para onde o inimigo ou npc ir e uma bool para definir se tiver true = vazio se tiver false = cheio.
https://www.devmedia.com.br/quick-tips-usando-o-dictionary-no-csharp/15172

Chilinger
MembroAvançado

Masculino PONTOS : 2128
REPUTAÇÃO : 39
Idade : 25
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Sex Jul 26, 2019 8:45 pm

@Magnatah escreveu:Eu sei Porque o Primeiro Método Que Fiz Deu Errado, O Array Que Eu Criei "LugarOcupado[]" é um atributo que cada npc tem ou seja, Se voce tem 5 Npcs utilizando o script "Enemies" irá existir 5 Atributos "LugarOcupado[]".


Deixe ela Etatica.

"Métodos e variáveis estáticas são elementos que pertencem à classe e não ao objeto".

Código:
 public static bool[] LugarOcupado = new bool[5];

Só lembrando coloquei 5 posições como exemplo, Coloque a Quantidade de HideSpots da sua cena.

Agora parece que começou a funcionar porém encontrei alguns problemas.

O primeiro era que os inimigos estavam saindo do seu hidespot para ir para um hidespot onde eu tinha acabado de matar um npc. Esse problema eu consegui resolver criando a booleana "isAlreadyHided".

O segundo é que em algumas situações dois inimigos continuam indo para o mesmo hidespot. No caso estou testando com três hidespots e três inimigos. Dois vão para o local certo e um acaba indo para o hidespot errado. Ainda não consegui encontrar o padrão desse comportamento. As vezes dois npcs também parecem inverter suas posições um acaba indo para o hidespot mais próximo do outro. Verifiquei todos os npcs e hidespots e todos possuem os mesmos parâmetros.

O código está assim agora:

Código:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.EventSystems;

[RequireComponent(typeof(AudioSource))]
public class Enemies : MonoBehaviour
{
    public enum Status
    {
        Patrol,
        AttackPlayer,
        Idle,
        Dead
    };

    Status enemiesStatus = Status.Patrol;

    public GameObject dropAmmoCanvas;
    private GameObject player;
    public AudioClip shoot;
    AudioSource gun;

    public float speed;
    private float waitTime;
    public float startWaitTime;

    public List<Transform> moveSpots;
    public List<Transform> hideSpots;
    private int randomSpot;
    public int nearestHideSpotIndex;

    private bool canAttack = true;
    private bool playerIsShooting = false;
    public bool isDead = false;

    public static bool[] LugarOcupado = new bool[3];
    private bool isAlreadyHided = false;

    private int minDam = 0;
    private int maxDam = 8;
    private int minFrequency = 3;
    private int maxFrequency = 6;

    private int minDroppedAmmo = 0;
    private int maxDroppedAmmo = 10;
    public int droppedAmmo;


    void Start()
    {
        player = GameObject.FindWithTag("Player");
        gun = GetComponent<AudioSource>();

        waitTime = startWaitTime;
        randomSpot = Random.Range(0, moveSpots.Count);
    }


    void Update()
    {
        switch (enemiesStatus)
        {
            case Status.AttackPlayer:

                CheckNearestHideSpot();

                if (isAlreadyHided == false)
                {
                    transform.position = Vector2.MoveTowards(transform.position, hideSpots[nearestHideSpotIndex].position, speed * Time.deltaTime);
                }
                

                Attack();

                break;
            case Status.Patrol:

                transform.position = Vector2.MoveTowards(transform.position, moveSpots[randomSpot].position, speed * Time.deltaTime);

                if (Vector2.Distance(transform.position, moveSpots[randomSpot].position) < 0.2f)
                {
                    if (waitTime <= 0)
                    {
                        randomSpot = Random.Range(0, moveSpots.Count);
                        waitTime = startWaitTime;
                    }
                    else
                    {
                        waitTime -= Time.deltaTime;
                    }
                }

                break;
            case Status.Idle:
                StopAllCoroutines();
                break;
            case Status.Dead:
                StopAllCoroutines();
                GetComponent<Animator>().SetBool("died", true);
                droppedAmmo = Random.Range(minDroppedAmmo, maxDroppedAmmo);
                if(dropAmmoCanvas != null && droppedAmmo > 0)
                {
                    dropAmmoCanvas.gameObject.SetActive(true);
                }
                LugarOcupado[nearestHideSpotIndex] = false;

                break;
        }


        if(Input.GetMouseButtonDown(0) && player.GetComponent<Weapon>().isReloading == false && player.GetComponent<Weapon>().isDryFire == false && !EventSystem.current.IsPointerOverGameObject())
        {
            if (player.GetComponent<Player>().life > 0)
            {
                playerIsShooting = true;
                
            }
            
        }

        if (playerIsShooting && player.GetComponent<Player>().life > 0)
        {
            enemiesStatus = Status.AttackPlayer;
        }

        if (player.GetComponent<Player>().life <= 0)
        {
            enemiesStatus = Status.Idle;
        }

        if (isDead)
        {
            enemiesStatus = Status.Dead;
        }

        if(Vector2.Distance(transform.position,hideSpots[nearestHideSpotIndex].position) < 0.01f)
        {
            isAlreadyHided = true;
        }

    }

    void Attack()
    {
        if (canAttack && playerIsShooting)
        {
            StartCoroutine(Attacking());
        }
        
    }


    void CheckNearestHideSpot()
    {
        float maxDistance = 99999999999999999;
        for (int x = 0; x < hideSpots.Count; x++)
        {
            float actualHideSpotDistance = Vector2.Distance(transform.position, hideSpots[x].transform.position);
            if (actualHideSpotDistance < maxDistance && !LugarOcupado[x])
            {
                maxDistance = actualHideSpotDistance;
                LugarOcupado[x] = true;
                nearestHideSpotIndex = x;

            }
        }
    }


    IEnumerator Attacking()
    {
        canAttack = false;
        yield return new WaitForSeconds(Random.Range(minFrequency, maxFrequency));
        gun.PlayOneShot(shoot,0.4f);
        player.GetComponent<Player>().life -= Random.Range(minDam, maxDam);
        canAttack = true;
    }
}

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

DÚVIDA Re: Problema com AI

Mensagem por abraao36 em Sex Jul 26, 2019 8:48 pm

@Chilinger escreveu:Voce pode criar um dictionary e nele voce colocar as posiçoes para onde o inimigo ou npc ir e uma bool para definir se tiver true = vazio se tiver false = cheio.
https://www.devmedia.com.br/quick-tips-usando-o-dictionary-no-csharp/15172

Vou dar uma olhada e tentar usar.

abraao36
Membro
Membro

PONTOS : 96
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

Ver perfil do usuário

Voltar ao Topo Ir em baixo

Voltar ao Topo


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