[RESOLVIDO] IA para jogo 2d
4 participantes
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
[RESOLVIDO] IA para jogo 2d
Bom, estava procurando uma IA para o meu jogo, que é top down, mas não encontrei nada, apenas para jogos plataforma. Pelo que vi, para fazer uma ia simples para jogos 3d se usa o pathfinding, mas não encontrei nada sobre pathfinding 2d. Alguem sabe como fazer uma ia para jogos top down 2d?
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Cara, é que existe um problema bem grande neste sentido... a NavMesh da Unity é feita apenas para terrenos em 3D, mas não tem nada para 2D, sendo necessário que você crie o seu próprio pathfinding.
Mas este bixo é um algoritmo extremamente complexo e chato de se fazer, então, você pode procurar algumas fugas, como por exemplo, AIPoints... dê uma olhada:
https://www.schultzgames.com/t101-tutorial-inteligencia-artificial-inimigo-e-aipoints
Mas este bixo é um algoritmo extremamente complexo e chato de se fazer, então, você pode procurar algumas fugas, como por exemplo, AIPoints... dê uma olhada:
https://www.schultzgames.com/t101-tutorial-inteligencia-artificial-inimigo-e-aipoints
Re: [RESOLVIDO] IA para jogo 2d
Hm, pelo que parece, usando ai points o inimigo não consegue seguir o player corretamente, fica batendo nas paredes, problema.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Para resolver isto, só utilizando NavMesh em 3D e usar uma camera ortográfica para ver o jogo de cima, ou fazer o próprio pathfinding
Re: [RESOLVIDO] IA para jogo 2d
Sim, vou fazer o teste, so mais uma coisa, tem coisa usar o NavMesh num objeto 3d sem o mesh renderer? Por que ai eu colocava um quad sem o mesh renderer na fase e nos sprites um collider 3d.
EDIT : Fui testar o navmesh mas a unity não esta fazendo o bake. Eu seleciono todos os objetos(são todos cubos, apenas testando), depois vou em navigation e clico em bake mas nada acontece.
EDIT : Fui testar o navmesh mas a unity não esta fazendo o bake. Eu seleciono todos os objetos(são todos cubos, apenas testando), depois vou em navigation e clico em bake mas nada acontece.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
joaogabrielfer escreveu:Sim, vou fazer o teste, so mais uma coisa, tem coisa usar o NavMesh num objeto 3d sem o mesh renderer? Por que ai eu colocava um quad sem o mesh renderer na fase e nos sprites um collider 3d.
EDIT : Fui testar o navmesh mas a unity não esta fazendo o bake. Eu seleciono todos os objetos(são todos cubos, apenas testando), depois vou em navigation e clico em bake mas nada acontece.
quando você criou o seu projeto, você criou para a plataforma 2D? talvez possa ser isto. tente em um projeto 3D
Re: [RESOLVIDO] IA para jogo 2d
Existem algumas soluções para Ai 2D e talz, um deles é o A*.
Voce pode usar a versao Free dele e tentar criar uma Ai, pq ela usa Waypoints para encontrar o melhor caminho:
http://arongranberg.com/astar/download
Voce pode usar a versao Free dele e tentar criar uma Ai, pq ela usa Waypoints para encontrar o melhor caminho:
http://arongranberg.com/astar/download
Re: [RESOLVIDO] IA para jogo 2d
Como faço então para que simplesmente o inimigo siga o player num campo aberto? Acho que assim da pra fazer não é?
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
se o movimento for apenas pra cima/baixo e esquerda/direita voce pode fazer verificacoes e move-lo com velocity do rigidbody2D.
Se posicão do jogador for maior que do inimigo(esquerda/direita) entao inimigo vai pra direita, caso contrario vai pra esquerda
E o mesmo para cima/baixo, e com base nessas verificacoes voce faz o vector de movimento do velocity.
Se posicão do jogador for maior que do inimigo(esquerda/direita) entao inimigo vai pra direita, caso contrario vai pra esquerda
E o mesmo para cima/baixo, e com base nessas verificacoes voce faz o vector de movimento do velocity.
Re: [RESOLVIDO] IA para jogo 2d
Então, eu entendi, só não sei transcrever isso em forma de script.
E o jogo não é exatamente um top down,
ele é assim, os personagens são desenhados como se fossem de plataforma 2d.
E o jogo não é exatamente um top down,
ele é assim, os personagens são desenhados como se fossem de plataforma 2d.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Um exemplo simples do que disse:
Script do inimigo:
Script do inimigo:
- Código:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody2D))]
public class Enemy2D : MonoBehaviour {
private Rigidbody2D rb;
public float speed = 2f;
public Transform player;
void Awake(){
rb = GetComponent<Rigidbody2D> ();
}
void Update(){
float right;
if (player.position.x > transform.position.x)
right = 1f;
else
right = -1;
rb.velocity = new Vector2 (right,0)*speed*Time.deltaTime;
}
}
Re: [RESOLVIDO] IA para jogo 2d
O script não funcionou, o inimigo se afasta do player caso o player se mova.
Cara o que eu queria era que simplesmente o inimigo seguisse o player normalmente pelo campo, so que se o player se posicionar a sua esquerda ele rotaciona para esquerda, se o player for para a direita, o inimigo rotaciona para a direita.
Cara o que eu queria era que simplesmente o inimigo seguisse o player normalmente pelo campo, so que se o player se posicionar a sua esquerda ele rotaciona para esquerda, se o player for para a direita, o inimigo rotaciona para a direita.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Nesse exemplo que te passei o inimigo so vai seguir o player em x, e voce tem que deixar a gravidade do Rigidbody2D do inimigo em 0 senao ele vai cair. Testei aki e funfo. Vc linkou o player na variavel player?
Com base no valor de right voce pode usar um Flip do spriteRenderer do inimigo pra fazer ele virar pro lado certo, ou inverter a escala em x do mesmo.
Com base no valor de right voce pode usar um Flip do spriteRenderer do inimigo pra fazer ele virar pro lado certo, ou inverter a escala em x do mesmo.
Re: [RESOLVIDO] IA para jogo 2d
No caso o que eu queria era que o inimigo seguisse o player em x e y. Vou te mostrar um exemplo de um jogo.
e uma imagem
No caso do meu jogo, é igual ao jogo do video, o player e o inimigo se movem livremente pelo cenario.
e uma imagem
No caso do meu jogo, é igual ao jogo do video, o player e o inimigo se movem livremente pelo cenario.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Então para um pathfind 2D adequado eu usaria o A star, se voce quiser tem um video de um gringo mostrando como usar o A star, pq faze um pathfind bem feito do zero é meio xatinho:
https://www.youtube.com/watch?v=4T7KHysRw84
https://www.youtube.com/watch?v=4T7KHysRw84
Re: [RESOLVIDO] IA para jogo 2d
Se for fazer algo muito simples poderia fazer isso, igual o codigo antigo so que agora ele sobe e desce e tambem vira pros lados, certifique de colocar seu inimigo olhado pra direita:
- Código:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody2D))]
public class Enemy2D : MonoBehaviour {
private Rigidbody2D rb;
public float speed = 2f;
public Transform player;
bool isFaceRight = true;
SpriteRenderer sr;
void Awake(){
rb = GetComponent<Rigidbody2D> ();
sr = GetComponent<SpriteRenderer> ();
}
void Update(){
float right;
float up;
if (player.position.x > transform.position.x)
right = 1f;
else
right = -1;
if (player.position.y > transform.position.y)
up = 1f;
else
up = -1;
rb.velocity = new Vector2 (right,up)*speed*Time.deltaTime;
if(isFaceRight && right == -1f || !isFaceRight && right == 1f)
Flip ();
}
void Flip(){
sr.flipX = !sr.flipX;
isFaceRight = !isFaceRight;
}
}
Re: [RESOLVIDO] IA para jogo 2d
Isso, é bem isso, o unico problema agora é que se o inimigo ficar exatamente em cima ou em baixo do player ele buga e fica esquerda,direita,esquerda,direita...
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
voce pode usar um Vector2.Distance para checar a distancia do inimigo e do player e pode fazer com que o inimigo pare de seguir e ataque se estiver muito perto.
Re: [RESOLVIDO] IA para jogo 2d
Não, o inimigo buga quando ele fica na alinhado em cima ou em baixo com o player, ai ele não sabe se rotaciona pra esquerda ou direita.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Mude esta linha do código:
Para esta:
- Código:
if (player.position.x > transform.position.x)
right = 1f;
else
right = -1;
if (player.position.y > transform.position.y)
up = 1f;
else
up = -1;
Para esta:
- Código:
if (player.position.x >= transform.position.x)
right = 1f;
else
right = -1;
if (player.position.y >= transform.position.y)
up = 1f;
else
up = -1;
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Problema persiste.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Por que não usa a sugestão do Manawydan?
Usa um Vector2.Distance para fazer o inimigo parar de seguir quando chegar muito perto.
Usa um Vector2.Distance para fazer o inimigo parar de seguir quando chegar muito perto.
Re: [RESOLVIDO] IA para jogo 2d
Acho que vocês não entenderam, o problema não é quando o inimigo encosta no player, e sim quando ele fica alinhado com o player, fica exatamente na mesma linha, seja em cima ou embaixo, ai o inimigo não sabe se vira pra esquerda ou pra direita, ai ele fica virando pros dois lados ao mesmo tempo.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Talvez se colocar um collider gigante em um dos lados do player, direito por exemplo, ai o inimigo so vai rotacionar se ele entrar no collider. Ai deixa o collider um pouco mais para o lado. Acho que da para tentar isso ja que não apareceram soluções para o meu problema acima.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Poderia colocar o script do seu player completo aqui man? Preciso analisar melhor isso ai
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Coloquei um box collider 2d com o Is Trigger marcado ao lado do player, agora a parte do script eu não sei como fazer.
Coloquei o collider com a tag "Respawn" e fiz isso dai, acho que esta certo, mas como termino?
Coloquei o collider com a tag "Respawn" e fiz isso dai, acho que esta certo, mas como termino?
- Código:
void OnTriggerEnter2D (Collider2D colisor)
{
if (colisor.gameObject.tag == "Respawn") {
}
}
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Cara, por tópico é bem chato responder isso. Faz o seguinte: upa teu projeto pra um site e me passa o link (pode ser por privado) que vou tentar resolver seu problema diretamente no game. Depois lhe devolvo o projeto já corrigido e com explicações em .txt
George Lucas Vieira- Avançado
- PONTOS : 3391
REPUTAÇÃO : 132
Idade : 21
Áreas de atuação : Programação, Modelagem e Animação.
Respeito as regras :
Re: [RESOLVIDO] IA para jogo 2d
Então cara se ainda continuar com a ideia que eu disse(sobre distancias) voce pode verificar se ele esta muito perto em X para que ele para de ficar indo pra esquerda,direita.
- Código:
using UnityEngine;
using System.Collections;
[RequireComponent(typeof(Rigidbody2D))]
public class Enemy2D : MonoBehaviour {
private Rigidbody2D rb;
public float speed = 2f;
public Transform player;
bool isFaceRight = true;
SpriteRenderer sr;
public float minDistanceXToTurn = 0.5f;
public float minDistanceYToTurn = 0.5f;
public float distanceToStop = 1.5f;
void Awake(){
rb = GetComponent<Rigidbody2D> ();
sr = GetComponent<SpriteRenderer> ();
}
void Update(){
float right = 0;
float up = 0;
float distanceX = Vector2.Distance (new Vector2(player.transform.position.x,0),new Vector2(transform.position.x,0));
float distanceY = Vector2.Distance (new Vector2(0,player.transform.position.y),new Vector2(0,transform.position.y));
float distanceXY = distanceX + distanceY;
if (distanceXY <= distanceToStop) {
// FAZER ALGO QUANDO ESTIVER PERTO
rb.velocity = Vector2.zero;
}
else
{
if (distanceX > minDistanceXToTurn) {
if (player.position.x > transform.position.x)
right = 1f;
else
right = -1;
if (isFaceRight && right == -1f || !isFaceRight && right == 1f)
Flip ();
}
if (distanceY > minDistanceYToTurn) {
if (player.position.y > transform.position.y)
up = 1f;
else
up = -1;
}
rb.velocity = new Vector2 (right, up) * speed * Time.deltaTime;
}
}
void Flip(){
sr.flipX = !sr.flipX;
isFaceRight = !isFaceRight;
}
}
Re: [RESOLVIDO] IA para jogo 2d
Aaaaah agora entendi o que você falou sobre distancia, eu tinha entendido algo bem diferente, é isso mesmo, obrigado. Valeu por responderem.
joaogabrielfer- Membro
- PONTOS : 3097
REPUTAÇÃO : 1
Idade : 25
Respeito as regras :
Tópicos semelhantes
» [RESOLVIDO] Ajuda com script para matar Inimigo no Jogo
» [RESOLVIDO] Colocando meu jogo para 64 bits
» [RESOLVIDO] MENU DE JOGO PARA ANDROID
» [RESOLVIDO] Aplicação para mudança de Fases em um jogo.
» [RESOLVIDO] Compilar Jogo para Windows Phone ?
» [RESOLVIDO] Colocando meu jogo para 64 bits
» [RESOLVIDO] MENU DE JOGO PARA ANDROID
» [RESOLVIDO] Aplicação para mudança de Fases em um jogo.
» [RESOLVIDO] Compilar Jogo para Windows Phone ?
SchultzGames :: UNITY 3D :: Resolvidos
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos