Ejemplo n.º 1
0
    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));
        }
    }
Ejemplo n.º 2
0
    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));
    }