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:
Role play online estilo gta bora jogar...
Criar Apk Android 64 .aab
Prefabs
unity 2019
[TUTORIAL] Menu Pause AVANÇADO (Unity 5.3 ou superior)
servidor
[TUTORIAL] Criando um simples Multiplayer [UNITY 5]
Jogo de Favela para Android - Estou usando o MS Vehicle System do Marcos!
[TUTORIAL] Mover objetos 2D e conectar em lugares específicos
[RESOLVIDO] Modificação no Script
Como "medir" a distância do caminho no NavMesh??
Meu game para Android " As aventuras de Steff " finalizado, ou quase!
Mecânica do Inimigo (Horror Survive)
iae galera, postei meu jogo no Google play recentemente.
Problemas com animações
[RESOLVIDO] GUARDAR MACHADO
Erro ao usb
Bibliotecas obsoletas causam alguma perda de desempenho?
O jogo acaba depois de um determinado tempo
Mecânica simples no estilo Jogo da Memória
COMO MUDAR UMA VARIAVEL APOS EX: 10 DIAS
Duvida com Script de AI inteligente
Duvida com FadeIn e FadeOut quando o tempo do jogo acaba
Como fazer o personagem não conseguir flipar enquanto estou atacando? (Unity 2D)
Duvida com Network
efeito de pingos na tela e camera com leve balanço realista (game 2D)
Como criar perfil no jogo para quem pagar na play store
Uma Ideia Movimento
INVENTÁRIO ESTILO THE FOREST
ANIMAÇÃO INFINITA NO UNITY
Problemas para salvar imagem de textura gerada na Unity no PC
Deformar mesh sem usar rigidbody e reconhecer força do impacto
Existe outras formas de multiplayer sem ser pelo Photon ou Unet?
força de impacto em npc proximo a objeto que explode
criar perfil no jogo para quem pagar na play store
Uma Ideia Movimento
Sistema De Radio
Jogo de Maior ou Menor - Duvida sobre melhorias no script
As funções dadas não são executadas no cliente, somente no servidor...
Mudar a música com base na mudança do ambiente
[RESOLVIDO] Dano no inimigo
Caixa de dialogo aparece e desaparece muito rápido ;-
[____TÓPICO LIVRE____] FALE O QUE QUISER (Parte 2)
Reiniciar Scene ao tocar Objeto
Ajuda com O Script de coletar objetos e transição de cena
Unity2D- Como criar um spawn inimigo onde saia apenas 2 inimigos do spawn?
Android Game - Fleeing From Evil
[TUTORIAL] Resolver bug dos reflexos, Unity 5.5+
[AJUDA]Preciso de ajuda em um script relacionado ao vídeo Sistema de escolha de personagen
Conexões!
Script faz a função tudo certo na unity, já quando gero apk o script não faz a função
NavMeshAgent com caminho manual.
Preciso de Ajuda Estou a desenvolver um projeto!
Direitos Autorais da Asset Store
Os seguinte apks ou pacotes de apps estão disponíveis para dispositivos de 64 bits!!
Estou querendo mandar as informações SERVIDOR/CLIENTE com o NETWORK
Erro no unity quando eu crio um projeto
Video Player travando no apk do jogo
Update jogo
Erro ao publicar na google play
[RESOLVIDO] BUG MT CHATO. USANDO O PlayerPrefs. ME AJUDAAAAAAA PF
Aparecer Texto Aleatório
Preciso De Um Programador! Para Um Game Fps!
[DUVIDA] Problemas na rotação de uma esfera com o mouse ( AddTorque )
[RESOLVIDO] Como fazer isso em for ou foreach dentro do update
Conceito básico de jogo em Rede Local.
Uso de PNG ou JPG no Unity?
Duvida(tamanho de objetos)
App feito na Unity - Biblia Sagrada
Unity carregando objetos sozinho
Limitação do FPS
Duvida sobre a geração de cenários aleatórios(plataforma 2D)
Personagem olhar para direção de onde estiver se movimentando
Problema com Dano ao Inimigo
Dúvida sobre chaves PlayerPrefs
inventario/Matrix
Personagem voando infinitamente no Unity 2D
[RESOLVIDO] Alguém sabe como tirar esse impulso do collider ?
[RESOLVIDO] Como fazer um objeto 2D rotacionar em direção a outro objeto
Como faço para Criar um sistema de touch em primeira pessoa na Unity2019?
duvida em c#
Shader com efeito de dissolução
[TUTORIAL] Sistema de tiro com RAYCAST (várias armas, mira laser, munição, dano, etc, etc)
Problema com a função Resolution[]
Função Text não esta dando erro no Unity2D (Score Text)
Unity travando na hora do Play
Duvida Raycast2D
Bug Partículas
Física ser calculada mais rápida
[TUTORIAL] Fazer som tocar apenas com colisão
Sobre Criação e Execução de Cutscene
O jogo acaba depois de um determinado tempo
Como fazer uma cena resetar ao voltar para ela
Fonte com caracteres matemáticos para unity
Luz
MENU DE SELEÇÃO DE FASES
usar bluetooh
HDRP - Render Texture Trasnparente na UI
Edge Collider de maneira mais eficaz
Hoje à(s) 12:08 pm
Hoje à(s) 1:37 am
Hoje à(s) 12:03 am
Ontem à(s) 9:12 pm
Ontem à(s) 6:02 pm
Ontem à(s) 5:54 pm
Ontem à(s) 1:49 pm
Ontem à(s) 11:52 am
Ontem à(s) 10:04 am
Sex Out 18, 2019 9:28 pm
Sex Out 18, 2019 8:23 pm
Sex Out 18, 2019 12:14 pm
Sex Out 18, 2019 9:40 am
Sex Out 18, 2019 9:33 am
Qui Out 17, 2019 8:09 pm
Qui Out 17, 2019 6:27 pm
Qui Out 17, 2019 6:25 pm
Qua Out 16, 2019 10:44 pm
Qua Out 16, 2019 9:40 pm
Qua Out 16, 2019 9:34 pm
Qua Out 16, 2019 8:25 pm
Qua Out 16, 2019 3:56 pm
Qua Out 16, 2019 3:51 pm
Ter Out 15, 2019 10:35 pm
Ter Out 15, 2019 9:58 pm
Ter Out 15, 2019 9:25 pm
Ter Out 15, 2019 2:55 pm
Ter Out 15, 2019 1:31 pm
Ter Out 15, 2019 11:47 am
Ter Out 15, 2019 11:43 am
Ter Out 15, 2019 1:06 am
Ter Out 15, 2019 12:13 am
Seg Out 14, 2019 10:00 pm
Seg Out 14, 2019 8:36 pm
Seg Out 14, 2019 8:09 pm
Seg Out 14, 2019 8:04 pm
Seg Out 14, 2019 4:45 pm
Seg Out 14, 2019 1:29 pm
Seg Out 14, 2019 8:06 am
Seg Out 14, 2019 2:33 am
Dom Out 13, 2019 4:47 pm
Dom Out 13, 2019 3:52 pm
Dom Out 13, 2019 9:39 am
Dom Out 13, 2019 2:52 am
Dom Out 13, 2019 2:29 am
Sab Out 12, 2019 7:15 pm
Sab Out 12, 2019 11:21 am
Sex Out 11, 2019 8:06 pm
Sex Out 11, 2019 5:52 pm
Sex Out 11, 2019 5:23 pm
Sex Out 11, 2019 2:48 pm
Sex Out 11, 2019 12:38 pm
Sex Out 11, 2019 11:14 am
Sex Out 11, 2019 9:17 am
Sex Out 11, 2019 8:04 am
Qui Out 10, 2019 5:27 pm
Qui Out 10, 2019 2:32 pm
Qui Out 10, 2019 2:13 pm
Qui Out 10, 2019 1:42 pm
Qui Out 10, 2019 11:30 am
Qua Out 09, 2019 8:07 pm
Qua Out 09, 2019 2:26 pm
Ter Out 08, 2019 10:27 pm
Ter Out 08, 2019 8:12 pm
Ter Out 08, 2019 6:01 pm
Ter Out 08, 2019 5:05 pm
Ter Out 08, 2019 3:12 pm
Ter Out 08, 2019 3:07 pm
Ter Out 08, 2019 11:25 am
Ter Out 08, 2019 2:45 am
Ter Out 08, 2019 2:07 am
Seg Out 07, 2019 10:43 am
Seg Out 07, 2019 3:11 am
Dom Out 06, 2019 5:24 pm
Dom Out 06, 2019 4:02 pm
Dom Out 06, 2019 3:56 pm
Sab Out 05, 2019 3:08 pm
Sab Out 05, 2019 1:41 pm
Sab Out 05, 2019 1:40 pm
Sex Out 04, 2019 10:04 pm
Sex Out 04, 2019 9:12 pm
Sex Out 04, 2019 11:41 am
Qui Out 03, 2019 8:34 pm
Qui Out 03, 2019 7:57 pm
Qui Out 03, 2019 3:46 pm
Qui Out 03, 2019 10:28 am
Qui Out 03, 2019 7:19 am
Qua Out 02, 2019 11:09 pm
Qua Out 02, 2019 5:09 pm
Qua Out 02, 2019 11:19 am
Qua Out 02, 2019 8:57 am
Ter Out 01, 2019 9:03 pm
Ter Out 01, 2019 4:40 pm
Ter Out 01, 2019 4:23 pm
Seg Set 30, 2019 8:50 pm
Seg Set 30, 2019 3:17 pm
Seg Set 30, 2019 10:41 am
Seg Set 30, 2019 3:37 am
Dom Set 29, 2019 7:02 pm
Fagner
Fagner
mirdov
nibirou
DoMundoAlem
richerd
Diguinho
lunaticsgames
kelvys
Samuelostgamer
Laylson.f
Tomás zjjxj
Lester3422
Willams
Samuelostgamer
Fagner
FSL02
RodriGO3477
Okeizito
joffersoju
nibirou
Lester3422
Lester3422
Hamassfall
igorarruda
Joab Artes Gráficas
artplayer
FabioDev
leonardolopes
leonardolopes
gabrimo
JohnRambo
SteveRogers
Extreme Craft
eduardonog30
FabioDev
williangamesbr4021
joffersoju
marino96
luizrbizzio
leonardolopes
MayLeone
Dom3000
MayLeone
Lester3422
Fagner
samoliver1813
leonardolopes
daniel123163
Dimelus
marino96
Nowsfeky
LucasGamerFx
artplayer
samoliver1813
marino96
RafaelSquid1
gtcmcsgo
benhurgdll
natanael.olimpio
daniel123163
Tegh
nibirou
guirigottti
joffersoju
Dark_The_King
Fagner
poyser
Weslley
MayLeone
Fagner
vphyre
luizrbizzio
Gabriel Ferraz
billybmx
billybmx
MayLeone
gersoneson
Hamassfall
ReDsScript
diegopds
AnderGames
GabrielGelbcke
Fagner
gersoneson
gersoneson
poyser
TecnoGames
NKKF
Gutavex
alexalex
Okeizito
poyser
Socates
Magnatah
Gutavex
JohnRambo
conceptfac
NKKF

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 : 158
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 : 1190
REPUTAÇÃO : 97
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://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 : 158
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 : 1422
REPUTAÇÃO : 47
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 : 1190
REPUTAÇÃO : 97
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://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 : 158
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 : 158
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 : 1190
REPUTAÇÃO : 97
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://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 : 158
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 : 1190
REPUTAÇÃO : 97
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://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 : 158
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 : 1190
REPUTAÇÃO : 97
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://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 : 2190
REPUTAÇÃO : 39
Idade : 25
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 : 158
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 : 158
REPUTAÇÃO : 5
Respeito as regras : Problema com AI WvDYdlf

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