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:
Mexer a camera com touch
PlayerPrefab
movimentar a camera com o mouse estilo jogo RTS
Script de movimentação
[Formação de Equipe] Quando foi ontem?
Reduzir uso de memória RAM
PRECISO DE AJUDA URGENTE !!!
preciso da ajuda de alguém urgente
Como dar um fade out/escurecer tela/mudar cena após um diálogo terminar?
PRECISO DE UMA PESSOA QUE SAIBA MECHER COM ONLINE NO UNITY
[RESOLVIDO] Problemas com blender
[Formação de equipe] Formação de equipe para o ramo de criação de jogos.
[RESOLVIDO] Como selecionar diferentes objetos com o clique do mouse usando raycast
Uma alternativa para o Visual Studio Community
[RESOLVIDO] Como fazer a funcao do Slider iniciar com o valor setado?
[RESOLVIDO] Como fazer sequência de if e personagem respawnar depois de alguns segundos.
[TUTORIAL] Deixando o unity 2019 preto na versão de graça
Por favor, coloquem a opção de excluir mensagem
Animações Bugando ao trocar Ajuda aqui na moral
Ajuda com IAP Purchase Unity PlayStore.
Nano - Jogo de Estratégia para Android
Ajuda com IA
Como passo variáveis entre Cenas?
Alguem sabe se existe uma função parecida a OnMouseEnter para Touch
Recrutando (FugasBR Online Para Mobile e PC)
Código de Joystick obsoleto que o Unity pede para atualizar
Erro na compilação (Visual Studio)
Teaser do Project Lazarus parte 2
Cubo sendo esvaziado 3D
Esta versão não está em conformidade com o requisito de 64 bits do Google Play
Sobre reflexão de luzes no unity e flares
Como salvar tudo de uma que esta em uma scene?
Rotação para inimigo
Como posso resolver o erro "NullRefenceException" da unity
[Duvida] Sistema de movimentação de personagem em 4 direções.
Melhore a IA dos seus jogos - IA do Creeper
Jogo de luta - multiplayer local
DESAFIO MULTPLAYER
[TUTORIAL] Passar Valores entre cenas
Como sobreponho um sprite num objeto em que ambos colidem?
Click na tela Mobile/PC
Bug Animation <não fica em loop> Unity 2019.4
Meu Proprio remake de siren head (em 24hrs)
Troca de fase
[TUTORIAL] AI Enemy ( Jogos de terror )
Um unico script de status serve pra todos em geral?
quero que a camera gire como o personagem mais nao consigo
The scripts needs to derive from monobehaviour
[TUTORIAL] Pegar e Dropar item no chao.[2.0]
[RESOLVIDO] COMO EXECUTAR FUNÇÃO A CADA PERÍODO DE TEMPO
Textura realistas
Sistema de Pontuação (Dúvida)
Como deixar a barra de vida fixa??
[TUTORIAL] Usando Pos Processamento
Humanoid
FPS KIT 1.0 - EM DESENVOLVIMENTO
Alguém pode me ajuda a coloca animação quando anda?
Mudar cena ao ativar um objeto
Escape the Danonão (Jogo de terror do Danonão Grosso no estilo Slender)
UI duplicando numeração usando SceneManager.LoadScene
AssetBundle não renderiza
Lets Play RPG - No editor funciona perfeito, porem dps de compilado nao funciona.
PAUSE PARCIAL
duvida sobre C# e unity
Como Add Fog em lugar no mundo específico
Como criar sistema de Habilidades (Skills) para o personagem 2D / e sistema de batalha 2D
Como identificar o vencedor em uma corrida multiplayer?
Sistema de desaceleração usando MovePosition
Alguém poderia me ajuda?
Como fazer um ciclo dia e noite com transição de skyboxes?
Como limito um movimento de modo a que não se movimente na diagonal?
[TUTORIAL] Sistema de DIA E NOITE completo, com luzes noturnas e SISTEMA DE NUVENS
Animaçao de sacar arma
Movimentaçao de personagem 3d
Rotacionar objeto de acordo com direção que ele está se movendo
Dúvida com o IEnumertor
[DUVIDA]como coloco um audio enquanto uma esfera roda
Fear - Modern House The Game [WINDOWS - ANDROID]
Sistema de pulo 2d
COMO MUDAR GETKEY WASD PARA GETBUTTON HORIZONTAL E VERTICAL ???
TOCAR SONS REPETIDAMENTE
Duvida sobre o forum
Explicacao de GD para CSharp[GODOT]
Tutorial Game de Plataforma 2D[GODOT]
Tutorial Inteligencia Artificial 2D[GODOT]
Sistema de vitória em um jogo multiplayer (photon 2)
Movimentar inimigo em posições aleatorias
Parallax travando, segue o código que utilizo
Jogo Maria Bella
Joystick Mobile do Marcos Schult
[RESOLVIDO] Pegar um frame no animation via C# Unity 3D
[AJUDA] NavMesh bugado
Jogo de Galo e de Galinha também
Movimento com Botões Unity 3D
[Dúvida] posições de objetos e âncora
Meu player não se move
um erro inicial no unity
UNITY CRASHANDO
[TUTORIAL] Criar árvores fácilmente com o criador de árvores da Unity
Hoje à(s) 9:56 pm
Hoje à(s) 8:19 pm
Hoje à(s) 6:08 pm
Hoje à(s) 8:08 am
Ontem à(s) 11:13 pm
Ontem à(s) 5:42 pm
Ontem à(s) 3:56 pm
Ontem à(s) 2:55 pm
Ontem à(s) 2:43 pm
Ontem à(s) 2:17 pm
Ontem à(s) 1:05 pm
Ontem à(s) 12:35 pm
Ontem à(s) 9:49 am
Ontem à(s) 8:07 am
Qui Jul 09, 2020 7:42 pm
Qui Jul 09, 2020 6:09 pm
Qui Jul 09, 2020 4:26 pm
Qui Jul 09, 2020 1:18 pm
Qui Jul 09, 2020 12:09 pm
Qua Jul 08, 2020 8:58 pm
Qua Jul 08, 2020 4:50 pm
Qua Jul 08, 2020 4:40 pm
Qua Jul 08, 2020 4:34 pm
Qua Jul 08, 2020 3:15 pm
Qua Jul 08, 2020 2:51 pm
Qua Jul 08, 2020 12:53 pm
Ter Jul 07, 2020 10:18 pm
Ter Jul 07, 2020 7:56 pm
Seg Jul 06, 2020 6:56 pm
Seg Jul 06, 2020 6:52 pm
Dom Jul 05, 2020 9:13 pm
Dom Jul 05, 2020 7:17 pm
Dom Jul 05, 2020 7:15 pm
Dom Jul 05, 2020 2:56 pm
Dom Jul 05, 2020 2:05 pm
Dom Jul 05, 2020 1:43 pm
Dom Jul 05, 2020 11:50 am
Sab Jul 04, 2020 5:02 pm
Sab Jul 04, 2020 3:20 pm
Sab Jul 04, 2020 3:08 pm
Sab Jul 04, 2020 11:02 am
Sab Jul 04, 2020 2:31 am
Sex Jul 03, 2020 1:14 pm
Sex Jul 03, 2020 12:34 pm
Qui Jul 02, 2020 5:28 pm
Qui Jul 02, 2020 5:06 pm
Qui Jul 02, 2020 3:06 pm
Qui Jul 02, 2020 2:57 pm
Qui Jul 02, 2020 2:07 pm
Qui Jul 02, 2020 1:59 pm
Qui Jul 02, 2020 1:25 pm
Qui Jul 02, 2020 11:32 am
Qui Jul 02, 2020 12:00 am
Qua Jul 01, 2020 6:31 pm
Qua Jul 01, 2020 6:04 pm
Qua Jul 01, 2020 6:00 pm
Qua Jul 01, 2020 3:19 pm
Qua Jul 01, 2020 1:18 pm
Qua Jul 01, 2020 8:59 am
Qua Jul 01, 2020 8:54 am
Qua Jul 01, 2020 8:51 am
Qua Jul 01, 2020 8:22 am
Ter Jun 30, 2020 2:22 pm
Ter Jun 30, 2020 11:25 am
Seg Jun 29, 2020 7:51 pm
Seg Jun 29, 2020 4:45 pm
Seg Jun 29, 2020 12:49 pm
Seg Jun 29, 2020 11:41 am
Seg Jun 29, 2020 9:53 am
Dom Jun 28, 2020 11:59 pm
Dom Jun 28, 2020 10:02 pm
Dom Jun 28, 2020 10:01 pm
Dom Jun 28, 2020 5:55 pm
Dom Jun 28, 2020 10:40 am
Dom Jun 28, 2020 9:16 am
Dom Jun 28, 2020 7:29 am
Sab Jun 27, 2020 2:53 pm
Sab Jun 27, 2020 8:08 am
Sex Jun 26, 2020 12:18 pm
Qui Jun 25, 2020 10:40 pm
Qui Jun 25, 2020 10:20 pm
Qui Jun 25, 2020 5:18 pm
Qui Jun 25, 2020 5:13 pm
Qui Jun 25, 2020 5:10 pm
Qui Jun 25, 2020 5:08 pm
Qui Jun 25, 2020 4:45 pm
Qui Jun 25, 2020 12:35 pm
Qui Jun 25, 2020 10:45 am
Qui Jun 25, 2020 7:21 am
Qui Jun 25, 2020 12:30 am
Qua Jun 24, 2020 8:02 pm
Qua Jun 24, 2020 6:58 pm
Qua Jun 24, 2020 6:37 pm
Qua Jun 24, 2020 3:23 pm
Qua Jun 24, 2020 11:41 am
Ter Jun 23, 2020 11:00 pm
Ter Jun 23, 2020 9:44 pm
Ter Jun 23, 2020 8:45 pm
Ter Jun 23, 2020 8:07 pm
CShar
adryansantoss
JulioWinchester
LúcioHenrique098
Nitram766
MRX
artplayer
Magnatah
Magnatah
marlon33
MRX
Weslley
JulioWinchester
artplayer
TioUV
flaviopunk182
NKKF
CShar
Fagner
poyser
Koai
Koai
Koai
KurotamaXIII
fecirineu
flaviopunk182
orph
Patrick
orph
iToddy
dknoob537
JoelMJunior
BrunoMga07
M.Choice
FerX95
ScorpionG4mer
jsiilva2k
BrunoMga07
Tiagotes
Tiagotes
Micco
fabricadegame
thales.ulisses
Micco
maxwellvale
Magnatah
Andrew lameira batista
kauannunes
Micco
CristhianSelbach
vini024
Callyde Jr
Hohenheim
hendrick22
adryansantoss
pekazao
Th2y
Micco
AmazingDeliciano
AmazingDeliciano
numb123
gtcmcsgo
FabioYuji
artplayer
Gabriel M
04vini
EliezerGomes
gabrimo
streamer
mama2401
Tiagotes
Albert Vinicius
iToddy
Micco
Ezequiel286
JoelMJunior
diegopds
thales.ulisses
AndreDeveloper
teos626
eduardoklausss
Chilinger
Chilinger
Chilinger
Chilinger
MarcosSchultz
Callyde Jr
bunijaclp
thales.ulisses
teos626
KurotamaXIII
AmazingDeliciano
poyser
KurotamaXIII
poyser
maxwellvale
Micco
vini024
MarcosSchultz

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 1590
REPUTAÇÃO : 124
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

https://www.instagram.com/ampercygames/

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 1714
REPUTAÇÃO : 54
Respeito as regras : Problema com AI WvDYdlf

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 : 1590
REPUTAÇÃO : 124
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

https://www.instagram.com/ampercygames/

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 1590
REPUTAÇÃO : 124
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

https://www.instagram.com/ampercygames/

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 1590
REPUTAÇÃO : 124
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

https://www.instagram.com/ampercygames/

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 1590
REPUTAÇÃO : 124
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

https://www.instagram.com/ampercygames/

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 : 2487
REPUTAÇÃO : 40
Idade : 26
Respeito as regras : Problema com AI WvDYdlf

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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 : 424
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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