(Ajuda) Inteligencia do inimigo
2 participantes
Página 1 de 1
(Ajuda) Inteligencia do inimigo
Olá, estou aqui com uma duvida de um assunto complexo que é inteligencia artificial, estou fazendo um script bem simples para quando o player estiver perto o inimigo atira nele, mais caso ele não esteja ele vai no inimigo mais proximo, ou pelo menos isto que tentei repassar para o script. só que quando duplico o inimigo um segue normalmente as regras só que o outro fica parado, mas quando eu chego perto ele vai em mim, só que quando saio de perto ele para novamente e não segue o outro inimigo. no inimigo duplicado ele não recebe a distancia do outro.
- Código:
private GameObject Player, Inimigos;
private NavMeshAgent naveMesh;
public float distancia, distanciaInimigo;
public bool Instancia, contar, playerPerto;
public Rigidbody Pedra;
public Transform posicao;
private float tempo;
void Start (){
Instancia = true;
contar = false;
naveMesh = transform.GetComponent<NavMeshAgent> ();
Player = GameObject.FindWithTag ("Player");
Inimigos = GameObject.FindWithTag ("Inimigo");
playerPerto = false;
}
void Update (){
distancia = Vector3.Distance (Player.transform.position, transform.position);
distanciaInimigo = Vector3.Distance (Inimigos.transform.position, transform.position);
if (distancia <= 30) {
naveMesh.destination = Player.transform.position;
playerPerto = true;
} else {
playerPerto = false;
}
if (Instancia == true && distancia <= 30) {
Instantiate (Pedra, posicao.position, transform.rotation);
Instancia = false;
contar = true;
}
if (contar == true) {
tempo += Time.deltaTime;
}
if (tempo >= 2) {
tempo = 0;
Instancia = true;
}
if (distanciaInimigo >= 0 && playerPerto == false) {
naveMesh.destination = Inimigos.transform.position;
}
if (Instancia == true && distanciaInimigo >= 0) {
Instantiate (Pedra, posicao.position, transform.rotation);
Instancia = false;
contar = true;
}
}
}
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Fiz um script
caso não entenda diga que eu explico
caso não entenda diga que eu explico
- Código:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(NavMeshAgent))]
public class EnemyBehaviour : MonoBehaviour
{
private GameObject player = null;
private NavMeshAgent navMesh;
private bool canShoot;
public float distanceToShoot;
void Start ()
{
navMesh = GetComponent<NavMeshAgent>();
player = GameObject.FindWithTag("Player");
}
void Update ()
{
if (canShoot)
{
Shoot();
navMesh.stoppingDistance = distanceToShoot;
}
else
{
navMesh.SetDestination(player.transform.position);
}
if (DistacePlayer <= distanceToShoot)
{
canShoot = true;
}
else
{
canShoot = false;
}
}
private void Shoot()
{
Debug.Log("Atirando");
}
private float DistacePlayer
{
get
{
float distace = Vector3.Distance(transform.position, player.transform.position);
return distace;
}
}
}
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Por favor gostaria da explicação.
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Bom vamos começar pegando a distancia do player usando property (propriedade)
quando eu uso get ele e executado quando a propriedade é lida a sim retornando um valor
logo se a distancia for menor ou igual canShoot = true se não canShoot = false
logo canShoot igual a true faço o inimigo parar e chamar a void Shot que sera dedicada ao tiro se não o inimigo vai em busca do player
like :D
quando eu uso get ele e executado quando a propriedade é lida a sim retornando um valor
- Código:
private float DistacePlayer
{
get
{
float distace = Vector3.Distance(transform.position, player.transform.position);
return distace;
}
}
logo se a distancia for menor ou igual canShoot = true se não canShoot = false
- Código:
if (DistacePlayer <= distanceToShoot)
{
canShoot = true;
}
else
{
canShoot = false;
}
logo canShoot igual a true faço o inimigo parar e chamar a void Shot que sera dedicada ao tiro se não o inimigo vai em busca do player
- Código:
if (canShoot)
{
Shoot();
navMesh.stoppingDistance = distanceToShoot;
}
else
{
navMesh.SetDestination(player.transform.position);
}
like :D
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Entendi, obrigado vou testar.
@Edit:
Fico bom, mais acho que não expressei minha ideia corretamente, é apenas assim, se o player tiver menos de 30 metros do inimigo o inimigo vai atrás do player se não ele vai atras de outro inimigo com a Tag(Inimigo). só que quando eu duplico o inimigo, o inimigo duplicado fica parado atirando no vento em vez de ir atrás de outro inimigo. mas se chego perto ele vem atras de mim, caso ao contrario fica parado atirando no vento. apenas é se eu tiver perto o inimigo vem atrás de mim se não ele vai atras de outro inimigo que esteja na fase.
@Edit:
Fico bom, mais acho que não expressei minha ideia corretamente, é apenas assim, se o player tiver menos de 30 metros do inimigo o inimigo vai atrás do player se não ele vai atras de outro inimigo com a Tag(Inimigo). só que quando eu duplico o inimigo, o inimigo duplicado fica parado atirando no vento em vez de ir atrás de outro inimigo. mas se chego perto ele vem atras de mim, caso ao contrario fica parado atirando no vento. apenas é se eu tiver perto o inimigo vem atrás de mim se não ele vai atras de outro inimigo que esteja na fase.
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
rafaelllsd escreveu:Entendi, obrigado vou testar.
@Edit:
Fico bom, mais acho que não expressei minha ideia corretamente, é apenas assim, se o player tiver menos de 30 metros do inimigo o inimigo vai atrás do player se não ele vai atras de outro inimigo com a Tag(Inimigo). só que quando eu duplico o inimigo, o inimigo duplicado fica parado atirando no vento em vez de ir atrás de outro inimigo. mas se chego perto ele vem atras de mim, caso ao contrario fica parado atirando no vento. apenas é se eu tiver perto o inimigo vem atrás de mim se não ele vai atras de outro inimigo que esteja na fase.
trocando em miudos vc quer que o inimigo vá a traz do player se a distancia for menor que 30 se não ele vai em busca de outro player mais próximo ?
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
praticamente sim. tentei no script acima deu +/- certo mais tem esse bug do inimigo clone n seguir o outro caso esteja longe do player.
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
rafaelllsd escreveu:praticamente sim. tentei no script acima deu +/- certo mais tem esse bug do inimigo clone n seguir o outro caso esteja longe do player.
vc tem skype ? se tiver manda ai la vc me explica direito
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Eu uso steam em vez de skype. é aquilo que você disse "trocando em miudos vc quer que o inimigo vá a traz do player se a distancia for menor que 30 se não ele vai em busca de outro player mais próximo ?"
Sim é isso, mais o inimigo segue outro inimigo entendeu, como se o outro inimigo fosse um player. ou seja um inimigo mata o outro '-'
Sim é isso, mais o inimigo segue outro inimigo entendeu, como se o outro inimigo fosse um player. ou seja um inimigo mata o outro '-'
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
rafaelllsd escreveu:Eu uso steam em vez de skype. é aquilo que você disse "trocando em miudos vc quer que o inimigo vá a traz do player se a distancia for menor que 30 se não ele vai em busca de outro player mais próximo ?"
Sim é isso, mais o inimigo segue outro inimigo entendeu, como se o outro inimigo fosse um player. ou seja um inimigo mata o outro '-'
Então todos matão todos ?
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Sim, é tipo um multiplayer com bot, só que offline '--'
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
isso podia ser resolvido fazendo com que todos os "jogadores" tivessem a mesma Tag Mais acho que você quer preservar certo ? se for o caso o jeito que pensei no momento foi esse tem vários outros mais creio que esse seja mais simples de compreender e mais didático
pegando os componentes e removendo um inimigo da lista que no caso ele mesmo
a variável enemyForFollow e igualada FindEnemy a propriedade que retorna o player que esta em seu range(alcance)
logo se enemyForFollow não for null ele vai executar o bloco
procurando todos os objetos e adicionando e suas determinadas matrizes
logo depois adicionado a lista de inimigos
esse e propriedade que retornara um player que esta em seu alcance fazendo uma pesquisa na lista de inimigos
script
talvez seja oque vc queira ou não '-' caso seja vai ser de grande importância que vc intenda o Código
pegando os componentes e removendo um inimigo da lista que no caso ele mesmo
- Código:
void Start ()
{
navMesh = GetComponent<NavMeshAgent>();
GetEnemy();
enemy.Remove(gameObject);
}
a variável enemyForFollow e igualada FindEnemy a propriedade que retorna o player que esta em seu range(alcance)
logo se enemyForFollow não for null ele vai executar o bloco
- Código:
void Update()
{
enemyForFollow = FindEnemy;
if (enemyForFollow != null)
{
if (thisAttack)
{
Shoot();
navMesh.stoppingDistance = distanceToShoot;
}
else
{
navMesh.SetDestination(enemyForFollow.transform.position);
}
if (DistacePlayer <= distanceToShoot)
{
thisAttack = true;
}
else
{
thisAttack = false;
}
}
else
{
navMesh.SetDestination(transform.position);
}
}
procurando todos os objetos e adicionando e suas determinadas matrizes
logo depois adicionado a lista de inimigos
- Código:
private void GetEnemy()
{
GameObject[] playersFind = GameObject.FindGameObjectsWithTag("Player");
GameObject[] enemiesFind = GameObject.FindGameObjectsWithTag("Enemy");
enemy.AddRange(playersFind);
enemy.AddRange(enemiesFind);
}
esse e propriedade que retornara um player que esta em seu alcance fazendo uma pesquisa na lista de inimigos
- Código:
private GameObject FindEnemy
{
get
{
foreach (var player in enemy)
{
float tempDistance = Vector3.Distance(transform.position, player.transform.position);
if (tempDistance <= distanceForFollow)
{
return player;
}
}
return null;
}
}
script
- Código:
using UnityEngine;
using System.Collections;
using System.Collections.Generic;
[RequireComponent(typeof(NavMeshAgent))]
public class EnemyBehaviour : MonoBehaviour
{
private NavMeshAgent navMesh;
private bool thisAttack;
public float distanceForFollow;
public float distanceToShoot;
public List<GameObject> enemy;
private GameObject enemyForFollow;
void Start ()
{
navMesh = GetComponent<NavMeshAgent>();
GetEnemy();
enemy.Remove(gameObject);
}
void Update()
{
enemyForFollow = FindEnemy;
if (enemyForFollow != null)
{
if (thisAttack)
{
Shoot();
navMesh.stoppingDistance = distanceToShoot;
}
else
{
navMesh.SetDestination(enemyForFollow.transform.position);
}
if (DistacePlayer <= distanceToShoot)
{
thisAttack = true;
}
else
{
thisAttack = false;
}
}
else
{
navMesh.SetDestination(transform.position);
}
}
private void Shoot()
{
Debug.Log("Atirando");
}
private void GetEnemy()
{
GameObject[] playersFind = GameObject.FindGameObjectsWithTag("Player");
GameObject[] enemiesFind = GameObject.FindGameObjectsWithTag("Enemy");
enemy.AddRange(playersFind);
enemy.AddRange(enemiesFind);
}
private GameObject FindEnemy
{
get
{
foreach (var player in enemy)
{
float tempDistance = Vector3.Distance(transform.position, player.transform.position);
if (tempDistance <= distanceForFollow)
{
return player;
}
}
return null;
}
}
private float DistacePlayer
{
get
{
if (enemyForFollow != null)
{
float distace = Vector3.Distance(transform.position, enemyForFollow.transform.position);
return distace;
}
return 0;
}
}
}
talvez seja oque vc queira ou não '-' caso seja vai ser de grande importância que vc intenda o Código
Última edição por weslleyFx em Qui maio 05, 2016 10:03 pm, editado 1 vez(es)
Weslley- Moderador
- PONTOS : 5727
REPUTAÇÃO : 744
Idade : 26
Áreas de atuação : Inversión, Desarrollo, Juegos e Web
Respeito as regras :
Re: (Ajuda) Inteligencia do inimigo
Funcionou, era o que eu queria obrigado pela ajuda.
rafaelllsd- ProgramadorMaster
- PONTOS : 5242
REPUTAÇÃO : 507
Idade : 24
Áreas de atuação : Unity, Audacity, Blender, Gimp, C#, JS, MySQL.
Respeito as regras :
Tópicos semelhantes
» [Ajuda]Inimigo
» Ajuda com IA de inimigo
» Ajuda com AI Inimigo.
» Ajuda com respawn do inimigo
» (Ajuda) Spawn Inimigo
» Ajuda com IA de inimigo
» Ajuda com AI Inimigo.
» Ajuda com respawn do inimigo
» (Ajuda) Spawn Inimigo
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos