Enemy IA 1x1 movement!?
2 participantes
Página 1 de 1
Enemy IA 1x1 movement!?
Gente voltei a mexer em um projeto antigo que tinha parado porque não encontrei solução em lugar nenhum, só algo parecido com A* ou astar sei lá '-'
uma vez pedi ajuda aqui sobre criar uma movimentação tipo a do game legend of grimrock que o player anda de 1x1 com smooth movement e tudo, ate ai deu tudo certo a parte do player mas o código dele não consigo de forma nenhuma adaptar pra criar uma IA com isso
queria saber se alguém tem uma ideia de como criar um inimigo que ande 1x1 também e que rotacione como o player(no caso 90°,-90°...)
tentei com um script que encontrei na net modificar e o mais próximo que cheguei o inimigo fica todo louco fora de sincronia -_-
uma vez pedi ajuda aqui sobre criar uma movimentação tipo a do game legend of grimrock que o player anda de 1x1 com smooth movement e tudo, ate ai deu tudo certo a parte do player mas o código dele não consigo de forma nenhuma adaptar pra criar uma IA com isso
queria saber se alguém tem uma ideia de como criar um inimigo que ande 1x1 também e que rotacione como o player(no caso 90°,-90°...)
tentei com um script que encontrei na net modificar e o mais próximo que cheguei o inimigo fica todo louco fora de sincronia -_-
speedluk- Avançado
- PONTOS : 2679
REPUTAÇÃO : 29
Idade : 32
Respeito as regras :
Re: Enemy IA 1x1 movement!?
Eu iria de A* com um sistema de Nodes para os pontos, pois facilita bastante quando se tem paredes ou obstáculos. Mas se o A* não for uma opção, tenta fazer com navmesh mesmo, define o destino e calcula o caminho, depois, faz um gameobject vazio(vamos chamá-lo de guia) percorrer esse caminho bem rápido.
No cenário você vai ter um grid de gameobjects vazios a cada 1m, conforme a guia vai se movendo, você calcula qual dos objetos da grid está mais perto e o coloca numa lista(ou ainda melhor, numa hashset) , se ja estiver lá, não faz nada.
Quando a guia chegar no destino, você vai ter uma lista completa de cada ponto que precisa percorrer, respeitando a grid, ela é que você vai usar pra mover o inimigo de 1 em 1 metro.
O resultado vai ser igual ao que você teria usando A* (ironicamente, você está usando A*, navmesh é baseado nele)
No cenário você vai ter um grid de gameobjects vazios a cada 1m, conforme a guia vai se movendo, você calcula qual dos objetos da grid está mais perto e o coloca numa lista(ou ainda melhor, numa hashset) , se ja estiver lá, não faz nada.
Quando a guia chegar no destino, você vai ter uma lista completa de cada ponto que precisa percorrer, respeitando a grid, ela é que você vai usar pra mover o inimigo de 1 em 1 metro.
O resultado vai ser igual ao que você teria usando A* (ironicamente, você está usando A*, navmesh é baseado nele)
Fagner- Moderador
- PONTOS : 4445
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Enemy IA 1x1 movement!?
sim sim pensei no navmesh também só que não encontrei uma forma em que ele respeita a velocidade e o movimento de 1 em 1 metro mas no caso terei que bolar uma forma de IA com esse sistema de navmesh que você falou mesmo
o problema é o tempo de decisão para os lados que ele vai, queria que esse tempo fosse aleatório como no script que eu tinha achado só que não deixasse o inimigo todo fora de sincronia
de qualquer forma muito obrigado =)
o problema é o tempo de decisão para os lados que ele vai, queria que esse tempo fosse aleatório como no script que eu tinha achado só que não deixasse o inimigo todo fora de sincronia
de qualquer forma muito obrigado =)
speedluk- Avançado
- PONTOS : 2679
REPUTAÇÃO : 29
Idade : 32
Respeito as regras :
Re: Enemy IA 1x1 movement!?
Já tentou usar Root Motion nas animações? se utilizar isso, pode alterar a velocidade das animações direto no Animator, fazendo ela ser executada com velocidades aleatórias, e o melhor, tudo permanece em sincronia.
Fagner- Moderador
- PONTOS : 4445
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Enemy IA 1x1 movement!?
Tentei o root motion tambem mas fica meio bugado acho que pelo random =/
esse é o script que achei na net modifiquei algumas coisas pra tentar melhor resultadi mas muito sem sucesso
vou estudar sobre coroutines, enum entre outras coisas ^^ sei que não é o caminho mas talvez me ajude mais que esse ^^
esse é o script que achei na net modifiquei algumas coisas pra tentar melhor resultadi mas muito sem sucesso
vou estudar sobre coroutines, enum entre outras coisas ^^ sei que não é o caminho mas talvez me ajude mais que esse ^^
- Codigo:
- Código:
using UnityEngine;
using System.Collections;
public class EnemyMovement : MonoBehaviour {
public static bool CanMoveForward;
public bool FoundPlayer;
//Translation:
float movSpeed = 4.0f;
Vector3 pos;
Transform tr ;
public static bool moving = false;
//Rotation:
public static bool rotating = false;
public float rotSpeed = 360f;
float rotDegrees = 0f;
Quaternion rotToAngle ;
void Start () {
pos = transform.position;
tr = transform;
CanMoveForward = true;
FoundPlayer = false;
}
// Update is called once per frame
void Update () {
int randomValue = Random.Range (1, 100);
Debug.DrawRay(transform.position, transform.forward, Color.red);
if (!moving && !rotating && !FoundPlayer) {
if (randomValue == (1 | 2) && tr.position == pos && CanMoveForward) {
pos += transform.forward;
moving=true;
}
else if (randomValue == 5 && tr.position == pos) {
rotDegrees -= 90f;
rotToAngle = Quaternion.Euler(0, rotDegrees, 0);
rotating = true;
}
else if (randomValue == 6 && tr.position == pos) {
rotDegrees += 90f;
rotToAngle = Quaternion.Euler(0, rotDegrees, 0);
rotating = true;
}
} else if (FoundPlayer) {
}
//Translation:
if (moving) {
if (Vector3.Distance(transform.position,pos) <0.05f){
transform.position = pos;
moving=false;
//print ("FINISHED MOVE");
} else {
transform.position = Vector3.MoveTowards(transform.position, pos, Time.deltaTime * movSpeed);
}
}
//Rotation:
if (rotating) {
if (Quaternion.Angle(transform.rotation,rotToAngle) <10f) {
transform.rotation = rotToAngle;
rotating=false;
//print ("FINISHED TURN");
} else {
transform.rotation = Quaternion.RotateTowards(transform.rotation, rotToAngle, rotSpeed * Time.deltaTime);
}
}
}
}
speedluk- Avançado
- PONTOS : 2679
REPUTAÇÃO : 29
Idade : 32
Respeito as regras :
Re: Enemy IA 1x1 movement!?
Eu montei um exemplo de como é possível transformar um caminho de Navmesh em uma grid de pontos, seguindo o que sugeri anteriormente.
Pra começar, defini um valor alto pro raio do navmesh agent, para que a navmesh gerada fosse bem fina, isso ajuda o calculo de distância ser mais preciso.
Aqui você pode ver como ficou o Navmesh calculado (azul) e os pontos que coloquei no cenário para montar a grid(verde).
Outra vista
Feito isso, criei um navmeshpath e populei com um caminho gerado entre o Inimigo(Vermelho), e o destino (Azul).
Com o caminho gerado, foi só questão de usar um for pra percorrer os corners no caminho e pegar o ponto mais próximo dele.
Os pontos mais próximos são armazenados numa Hashset pra evitar que existam duplicatas. Depois é só usar esse Hashset como o caminho do seu inimigo, que ele irá respeitar o movimento em 1 por 1m. Veja como fica o caminho que o inimigo enxerga.
Acredito que isso sirva de guia pra você adaptar na IA do seu jogo. O projeto pode ser baixado logo abaixo:
ProjetoGridPathfind
Pra começar, defini um valor alto pro raio do navmesh agent, para que a navmesh gerada fosse bem fina, isso ajuda o calculo de distância ser mais preciso.
Aqui você pode ver como ficou o Navmesh calculado (azul) e os pontos que coloquei no cenário para montar a grid(verde).
Outra vista
Feito isso, criei um navmeshpath e populei com um caminho gerado entre o Inimigo(Vermelho), e o destino (Azul).
Com o caminho gerado, foi só questão de usar um for pra percorrer os corners no caminho e pegar o ponto mais próximo dele.
Os pontos mais próximos são armazenados numa Hashset pra evitar que existam duplicatas. Depois é só usar esse Hashset como o caminho do seu inimigo, que ele irá respeitar o movimento em 1 por 1m. Veja como fica o caminho que o inimigo enxerga.
Acredito que isso sirva de guia pra você adaptar na IA do seu jogo. O projeto pode ser baixado logo abaixo:
ProjetoGridPathfind
Fagner- Moderador
- PONTOS : 4445
REPUTAÇÃO : 667
Áreas de atuação : Modelagem 3D, Programação.
Respeito as regras :
Re: Enemy IA 1x1 movement!?
Puts Fagner muito obrigado amigo, especificamente essa parte da movimentação do inimigo é o que me fez a muito quase abandonar esse projeto, baixando aqui e já vou pro laboratório fazer os testes ^^
speedluk- Avançado
- PONTOS : 2679
REPUTAÇÃO : 29
Idade : 32
Respeito as regras :
Tópicos semelhantes
» Enemy grid movement
» [TUTORIAL] Smooth Movement Unity (UNET)
» Ajuda Enemy AI
» Ai Enemy Inimigo Parando do nada
» erro AI Enemy
» [TUTORIAL] Smooth Movement Unity (UNET)
» Ajuda Enemy AI
» Ai Enemy Inimigo Parando do nada
» erro AI Enemy
Página 1 de 1
Permissões neste sub-fórum
Não podes responder a tópicos