Desarrollo de Videojuegos
Ma.Elena Melón Jareda
ITESM-CEM Departamento de Sistemas de Información y Computación
Persecución de enemigosRuta más corta
Persecución sencilla Implementación en Unity
PJ Moskal
http://dmac.comdma.com/?p=988
Persecución
El enemigo siempre voltea a ver al FPS controller y se mueve en su dirección.
El script de distancia hace que sólo se mueva el enemigo si el FPS controller se encuentra a una distancia mínima.
Ver video.
Script de distancia
//attach this script to the object that will follow FPC
//this script working conjunction with SmoothLookAt script that you should also apply to the object
//and Constant Force component that should be applied to the object
//The object needs a sphere collider and it has to be a rigidbody with Freeze Rotation turned on
//object to be followed
var detectObject: Transform;
//distance that will trigger following action
var distanceDetection: float;
function Update () {
if (detectObject) {
var dist = Vector3.Distance(detectObject.position, transform.position);
//if distance is less than what is specified then do something
if(dist<distanceDetection){
//print("attack");
GetComponent(SmoothLookAt).enabled = true;
GetComponent(ConstantForce).enabled = true;
}else{
//print("stop attack");
GetComponent(SmoothLookAt).enabled = false;
GetComponent(ConstantForce).enabled = false;
}
}
}
Otra persecución sencilla Implementación en Unity
GesterXhttp://answers.unity3d.com/questions/19351/how-to-create-a-basic-follow-ai
Instrucciones
En este caso el script hace todo lo que a mano se realizó en el video anterior.
No se toman en cuenta distancias.
Seguir las instrucciones de la liga.
Modificaciones
El código de Internet no toma en cuenta las distancias.
Combinando los 2 scripts anteriores, el de persecución y el de distancia, se puede detectar si el enemigo está demasiado lejos o demasiado cerca y detener la animación.
Script modificado
var target : Transform; //the enemy's target
var moveSpeed = 3; //move speed
var rotationSpeed = 3; //speed of turning
var maxDistance=100;
var minDistance=10;
var myTransform : Transform; //current transform data of this enemy
function Awake()
{
myTransform = transform; //cache transform data for easy access/preformance
}
function Start()
{
target = GameObject.FindWithTag("Player").transform; //target the player
}
Script modificado
function Update () {
if (target) {
var dist = Vector3.Distance(target.position, transform.position);
//if distance is less than what is specified then do something
if(dist<minDistance){
Debug.Log("Te atrape!");
}else if(dist>maxDistance){
Debug.Log("Estas demasiado lejos!");
}else{
Debug.Log("Alla voy!");
//rotate to look at the player
myTransform.rotation = Quaternion.Slerp(myTransform.rotation,
Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime);
//move towards the player
myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime;
}
}
}
Ruta más corta
A*
A*
El algoritmo de búsqueda A* (A estrella) se clasifica dentro de los algoritmos de búsqueda en grafos.
Presentado en 1968 por Hart, Nilsson y Raphael.
El algoritmo encuentra el camino de menor costo entre un nodo origen y uno objetivo (siempre y cuando se cumplan determinadas condiciones).
A* es un algoritmo completo: en caso de existir una solución, siempre dará con ella.
A*
A* utiliza la función de evaluación:
f(n) = g(n) + h'(n)
o g(n) es el costo real del camino recorrido para llegar al nodo n.
o h'(n) representa el valor heurístico (estimado) del nodo a evaluar desde el n hasta el final
A*
A* mantiene dos estructuras de datos auxiliares:una fila de prioridad (ordenada por el valor f(n) de
cada nodo) nodosPorVisitar o abiertosuna fila donde se guarda la información de los nodos
que ya han sido visitados nodosVisitados o cerrados
En cada paso del algoritmo, se expande el nodo que esté primero en nodosPorVisitar y en caso de que no sea un nodo objetivo, calcula la f(n) de todos sus hijos, los inserta en nodosPorVisitar y pasa el nodo evaluado a nodosVisitados.
Ejemplo Simple
origen
destino
obstáculo
http://www.policyalmanac.org/games/aStarTutorial.htm
Ejemplo Simple
origen
destino
obstáculo
¿Qué camino seguir?
Ejemplo Simple
Para este ejemplo vamos a suponer lo siguiente:
Moverse horizontalmente o verticalmente cuesta 10
Moverse en diagonal cuesta 14
g(n) se calculará sumando el costo del último movimiento más el costo que lleva el padre
Ejemplo Simple
h'(n) puede estimarse de diferentes maneras.
El método que usaremos para este ejemplo se conoce con el nombre de Método Manhattan.
En este método calculas el total de cuadros que se requieren recorrer horizontalmente o verticalmente para llegar al destino, ignorando movimientos diagonales y obstáculos. Después se multiplica por 10 que es el costo de cada movimiento horizontal o vertical.
H = 10*(abs(currentX-targetX) + abs(currentY-targetY))
Ejemplo Simple
f(n)
¿Cuál es la mejor opción?
h'(n)
g(n)
Ejemplo Simple
Ejemplo Simple
Ejemplo Simple
Ejemplo Simple
A*
h'(x) es un estimador de h(x) que informa la distancia al nodo objetivo, entonces: Si h'(x) hace un estimación perfecta de h(x), A* converge
inmediatamente al objetivo. Si h'(x) = 0, la función g(x) controla la búsqueda. Si h'(x) = 0 y g(x) =0 la búsqueda será aleatoria. Si h'(x) = 0 y g(x) =1 o constante, la búsqueda será Primero en
Anchura. Si h'(x) nunca sobrestima a h(x) (o subestima), se garantiza
encontrar el camino optimo, pero se desperdicia esfuerzo explorando otras rutas que parecieron buenas.
Si h'(x) sobrestima a h(x), no puede garantizarse la consecución del camino del menor costo.
Implementación de A* en Unity
Aron Granberg
http://www.arongranberg.com/unity/a-pathfinding/download/
Versiones actuales
http://www.arongranberg.com/astar/docs/getstarted.php
Top Related