250 likes | 375 Views
Desarrollo de Videojuegos. P ersecución de enemigos Ruta más corta. Ma.Elena Melón Jareda ITESM-CEM Departamento de Sistemas de Información y Computación. Persecución sencilla Implementación en Unity. PJ Moskal http://dmac.comdma.com/?p=988. Persecución.
E N D
Desarrollo de Videojuegos Persecución de enemigos Ruta más corta Ma.Elena Melón Jareda ITESM-CEM Departamento de Sistemas de Información y Computación
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 vardetectObject: Transform; //distance that will trigger following action vardistanceDetection: 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 GesterX http://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; //theenemy's target varmoveSpeed = 3; //movespeed varrotationSpeed = 3; //speed of turning varmaxDistance=100; varminDistance=10; varmyTransform : Transform; //currenttransform data of thisenemy functionAwake() { myTransform = transform; //cache transform data foreasyaccess/preformance } functionStart() { target = GameObject.FindWithTag("Player").transform; //target theplayer }
Script modificado functionUpdate () { if (target) { vardist = Vector3.Distance(target.position, transform.position); //ifdistanceislessthanwhatisspecifiedthen do something if(dist<minDistance){ Debug.Log("Te atrape!"); }elseif(dist>maxDistance){ Debug.Log("Estas demasiado lejos!"); }else{ Debug.Log("Alla voy!"); //rotateto look at theplayer myTransform.rotation = Quaternion.Slerp(myTransform.rotation, Quaternion.LookRotation(target.position - myTransform.position), rotationSpeed*Time.deltaTime); //movetowardstheplayer myTransform.position += myTransform.forward * moveSpeed * Time.deltaTime; } } }
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) • g(n) es el costo real del camino recorrido para llegar al nodo n. • 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) nodosPorVisitaro abiertos • una fila donde se guarda la información de los nodos que ya han sido visitados nodosVisitadoso 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 obstáculo destino origen http://www.policyalmanac.org/games/aStarTutorial.htm
Ejemplo Simple obstáculo destino origen ¿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)puedeestimarse de diferentesmaneras. • El métodoqueusaremosparaesteejemplo se conoce con el nombre de Método Manhattan. • En estemétodocalculas el total de cuadrosque se requierenrecorrerhorizontalmente o verticalmenteparallegar al destino, ignorandomovimientosdiagonales y obstáculos. Después se multiplicapor 10 quees el costo de cadamovimiento horizontal o vertical. H = 10*(abs(currentX-targetX) + abs(currentY-targetY))
Ejemplo Simple f(n) g(n) h'(n) ¿Cuál es la mejor opción?
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