protected internal override Steering getSteering(PersonajeBase personaje) { _finishedLinear = _finishedAngular = false; Vector3 newOffset = SimulationManager.DirectionToVector(_target.orientacion + SimulationManager.VectorToDirection(offsetPosition)) * offsetPosition.magnitude; Vector2 destino = SimManagerFinal.positionToGrid(_target.posicion + newOffset); if (destino != lastDestiny) { Vector2 origen = SimManagerFinal.positionToGrid(personaje.posicion); List <Vector3> recorrido = SimManagerFinal.aStarPathV3(origen, destino, personaje.tipo, personaje is PersonajePlayer); lastDestiny = destino; followPath = new PathFollowEndSD(recorrido); } if (followPath.finishedLinear) { personaje.fakeAlign.orientacion = _target.orientacion + offsetOrientation; if (personaje.fakeAlign.orientacion < -System.Math.PI) { personaje.fakeAlign.orientacion += 2 * (float)System.Math.PI; } else if (personaje.fakeAlign.orientacion > System.Math.PI) { personaje.fakeAlign.orientacion -= 2 * (float)System.Math.PI; } personaje.fakeAlign.transform.eulerAngles = new Vector3(0, (_target.orientacion + offsetOrientation) * Bodi.RadianesAGrados, 0); faceSD.target = personaje.fakeAlign; parada.getSteering(personaje); return(faceSD.getSteering(personaje)); } else { return(followPath.getSteering(personaje)); } }
protected internal override void doit() { if (receptor) { destiny = SimManagerFinal.positionToGrid(receptor.posicion); } List <Vector3> camino = SimManagerFinal.aStarPathV3(SimManagerFinal.positionToGrid(sujeto.posicion), destiny, sujeto.tipo, sujeto is PersonajePlayer); recorrer = new PathFollowEndSD(camino); sujeto.newTaskGrid(recorrer); }
protected internal override Steering getSteering(PersonajeBase personaje) { if (!setup) { Vector3 puntoActual = path[0]; for (int i = 1; i < path.Count; i++) { List <Vector3> recorridoActual = SimManagerFinal.aStarPathV3(puntoActual, path[i], personaje.tipo, personaje is PersonajePlayer); ruta.AddRange(recorridoActual); puntoActual = path[i]; } List <Vector3> recorridoFinal = SimManagerFinal.aStarPathV3(path[path.Count - 1], path[0], personaje.tipo, personaje is PersonajePlayer); ruta.AddRange(recorridoFinal); float minDist = Mathf.Infinity; int nearestPoint = -1; for (int i = 0; i < ruta.Count; i++) { if ((ruta[i] - personaje.posicion).magnitude < minDist) { nearestPoint = i; minDist = (ruta[i] - personaje.posicion).magnitude; } } setup = true; currentStartingPoint = nearestPoint; startingruta = SimManagerFinal.aStarPathV3(SimManagerFinal.positionToGrid(personaje.posicion), SimManagerFinal.positionToGrid(ruta[nearestPoint]), personaje.tipo, personaje is PersonajePlayer); } if (!startingsetup) { if (startingruta.Count > 0) { //preguntar a alex si se acuerda personaje.fakeMovement.innerDetector = personaje.innerDetector; personaje.fakeMovement.posicion = startingruta[currentPoint]; personaje.fakeMovement.moveTo(startingruta[currentPoint]); personaje.fakeAvoid.posicion = startingruta[startingruta.Count - 1]; personaje.fakeAvoid.moveTo(startingruta[startingruta.Count - 1]); if (pursueSD.finishedLinear) { currentPoint = (currentPoint + 1); if (currentPoint >= startingruta.Count) { startingsetup = true; currentPoint = currentStartingPoint; for (int i = currentPoint; i < ruta.Count; i++) { bool found = false; for (int j = 0; j < path.Count; j++) { if (ruta[i] == SimManagerFinal.gridToPosition(path[j])) { personaje.fakeAvoid.posicion = ruta[i]; personaje.fakeAvoid.moveTo(ruta[i]); found = true; break; } } if (found) { break; } } } } } else { startingsetup = true; currentPoint = currentStartingPoint; for (int i = currentPoint; i < ruta.Count; i++) { bool found = false; for (int j = 0; j < path.Count; j++) { if (ruta[i] == SimManagerFinal.gridToPosition(path[j])) { personaje.fakeAvoid.posicion = ruta[i]; personaje.fakeAvoid.moveTo(ruta[i]); found = true; break; } } if (found) { break; } } } } else { if (pursueSD.finishedLinear) { for (int i = 0; i < path.Count; i++) { if (path[i] == SimManagerFinal.positionToGrid(ruta[currentPoint])) { int next = (i + 1) % path.Count; Vector3 nextRoutePoint = SimManagerFinal.gridToPosition(path[next]); personaje.fakeAvoid.posicion = nextRoutePoint; personaje.fakeAvoid.moveTo(nextRoutePoint); } } currentPoint = (currentPoint + 1) % ruta.Count; } personaje.fakeMovement.innerDetector = personaje.innerDetector; personaje.fakeMovement.posicion = ruta[currentPoint]; personaje.fakeMovement.moveTo(ruta[currentPoint]); } pursueSD.target = personaje.fakeMovement; return(pursueSD.getSteering(personaje)); }