예제 #1
0
    static public Vector3 Separate(SBAgent agent, List <GameObject> agentToAvoid, float range)
    {
        Vector3 steer = Vector3.zero;

        for (int i = 0; i < agentToAvoid.Count; i++)
        {
            steer += Flee(agent, agentToAvoid[i].transform, range);
        }
        return(steer);
    }
예제 #2
0
    static public Vector3 Seek(SBAgent agent, Transform target)
    {
        // cálculo del vector deseado
        Vector3 desired = (target.position - agent.transform.position).normalized * agent.maxSpeed;

        // cálculo de los demás vectores
        Vector3 steer = Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);

        return(steer);
    }
예제 #3
0
    static public Vector3 Separate(SBAgent agent, GameObject[] agentsToAvoid, float range)
    {
        Vector3 steer = Vector3.zero;

        for (int i = 0; i < agentsToAvoid.Length; i++)
        {
            steer += Flee(agent, agentsToAvoid[i].transform, range);
        }

        return(steer);
    }
예제 #4
0
    public static Vector3 Arrive(SBAgent agent, Transform target, float range)
    {
        Vector3 desired;
        Vector3 difference = (target.position - agent.transform.position);
        float   distance   = difference.magnitude;

        desired = difference.normalized * agent.maxSpeed * ((distance > range)?1:(distance / range));

        //Cálculo de vectores
        Vector3 steer = Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);

        return(steer);
    }
예제 #5
0
    static public Vector3 Rectangle(SBAgent agent, Transform target, Transform center, float sizeX, float sizeY)
    {
        Vector3 desired = Vector3.zero;
        Vector3 steer;

        if (agent.transform.position.x > center.position.x + sizeX || agent.transform.position.x < center.position.x - sizeX ||
            agent.transform.position.y < center.position.x - sizeY || agent.transform.position.y > center.position.y + sizeY)
        {
            steer = Seek(agent, center);
        }
        else
        {
            steer = Seek(agent, target);
        }

        return(steer);
    }
예제 #6
0
    static public Vector3 Rectangulo(SBAgent agente, Transform target, Transform center, float X, float Y)
    {
        Vector3 desired = Vector3.zero;
        Vector3 steer;

        if (agente.transform.position.x > center.position.x + X || agente.transform.position.x < center.position.x - X ||
            agente.transform.position.y < center.position.y - Y || agente.transform.position.y > center.position.y + Y)
        {
            steer = Seek(agente, center);
        }
        else
        {
            steer = Seek(agente, target);
        }

        return(steer);
    }
예제 #7
0
    static public Vector3 Arrive(SBAgent agent, Transform target, float range)
    {
        Vector3 desired;
        Vector3 difference = (target.position - agent.transform.position);
        float   distance   = difference.magnitude;

        desired = difference.normalized * agent.maxSpeed;

        if (distance < range)
        {
            desired *= distance / range;
        }

        Vector3 steer = Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);

        return(steer);
    }
예제 #8
0
    static public Vector3 InsideRectangle(SBAgent agent, Vector3 center, float w, float h)
    {
        Vector3 desired;

        if (agent.transform.position.y > center.y + h / 2)
        {
            desired = (center - agent.transform.position).normalized * agent.maxSpeed;
        }
        else
        {
            desired = Vector3.zero;
        }

        Vector3 steer = Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);

        return(steer);
    }
예제 #9
0
    public static Vector3 Flee(SBAgent agent, Transform target, float range = 99999)
    {
        Vector3 desired    = Vector3.zero;
        Vector3 difference = -(target.position - agent.transform.position);
        float   distance   = difference.magnitude;

        desired = difference.normalized * agent.maxSpeed;

        if (distance < range)
        {
            return(Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer));
        }
        else
        {
            return(Vector3.zero);
        }
    }
예제 #10
0
    static public Vector3 InsideCircle(SBAgent agent, Transform target, Transform center, float range)
    {
        Vector3 desired  = Vector3.zero;
        float   distance = Vector3.Distance(agent.transform.position, center.position);
        Vector3 steer;

        if (distance > range)
        {
            steer = Seek(agent, center);
        }
        else
        {
            steer = Seek(agent, target);
        }

        return(steer);
    }
예제 #11
0
    public static Vector3 InsideCircle(SBAgent agent, Vector3 center, float radius, Transform target)
    {
        Vector3 steer = Vector3.zero;

        float offset = (agent.transform.position - center).magnitude;

        if (offset > radius)
        {
            Vector3 desired    = Vector3.zero;
            Vector3 difference = (center - agent.transform.position);
            float   distance   = difference.magnitude;
            desired = difference.normalized * agent.maxSpeed;

            steer = 2 * Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);
        }

        return(steer);
    }
예제 #12
0
    public static Vector3 InsideRectangle(SBAgent agent, Vector3 center, float limitX, float limitY, Transform target)
    {
        Vector3 steer    = Vector3.zero;
        Vector2 limits_x = new Vector2(center.x - limitX / 2, center.x + limitX / 2);
        Vector2 limits_y = new Vector2(center.y + limitY / 2, center.y - limitY / 2);

        if (agent.transform.position.x < limits_x.x || agent.transform.position.x > limits_x.y || agent.transform.position.y > limits_y.x || agent.transform.position.y < limits_y.y)
        {
            Vector3 desired    = Vector3.zero;
            Vector3 difference = (center - agent.transform.position);
            float   distance   = difference.magnitude;
            desired = difference.normalized * agent.maxSpeed;

            steer = 2 * Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);
        }

        return(steer);
    }
예제 #13
0
    static public Vector3 InsideRectangle(SBAgent agent, Transform target, Transform center, float vertX, float vertY)
    {
        Vector3 desired = Vector3.zero;

        Vector3 steer;

        if (agent.transform.position.x > center.position.x + vertX || agent.transform.position.x < center.position.x - vertX ||
            agent.transform.position.y < center.position.y - vertY || agent.transform.position.y > center.position.y + vertY)
        {
            steer = Seek(agent, center);
        }
        else
        {
            steer = Seek(agent, target);
        }

        return(steer);
    }
예제 #14
0
    public static Vector3 Seek(SBAgent agent, Transform target, float range = 99999)
    {
        //Cálculo del vector deseado
        Vector3 desired    = Vector3.zero;
        Vector3 difference = (target.position - agent.transform.position);
        float   distance   = difference.magnitude;

        desired = difference.normalized * agent.maxSpeed;

        //if(distance < range)
        //{
        return(Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer));
        //}
        //else
        //{
        //    return Vector3.zero;
        //}
    }
예제 #15
0
    static public Vector3 inside(SBAgent agent, Transform target, float range = 99999)
    {
        // cálculo del vector deseado
        Vector3 desired;

        Vector3 difference = -(target.position - agent.transform.position);
        float   distance   = difference.magnitude;

        desired = difference.normalized * agent.maxSpeed;
        if (distance < range)
        {
            desired *= distance / range;
            return(Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer));
        }
        else
        {
            return(Vector3.zero);
        }
    }
예제 #16
0
    static public Vector3 Seek(SBAgent agent, Transform target, float range = 9999)
    {
        // cálculo del vector deseado
        Vector3 desired    = Vector3.zero;
        Vector3 difference = (target.position - agent.transform.position);
        float   distance   = difference.magnitude;

        desired = difference.normalized * agent.maxSpeed;
        Vector3 steer;

        if (distance < range)
        {
            steer = Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);
        }
        else
        {
            steer = Vector3.zero;
        }
        return(steer);
    }
예제 #17
0
    static public Vector3 InsideRectangle(SBAgent agent, Vector3 target, Vector3 centro, float width, float height)
    {
        Vector3 desired;
        Vector3 steer;

        Vector3 deseadoInsideRectangle;
        Vector3 deseadoSeek = (target - agent.transform.position).normalized * agent.maxSpeed;

        if (agent.transform.position.y >= centro.y + height / 4 || agent.transform.position.y <= centro.y - height / 4 ||
            agent.transform.position.x >= centro.x + width / 4 || agent.transform.position.x <= centro.x - width / 4)
        {
            deseadoInsideRectangle = (centro - agent.transform.position).normalized * agent.maxSpeed;
        }
        else
        {
            deseadoInsideRectangle = Vector3.zero;
        }

        desired = deseadoSeek + deseadoInsideRectangle;
        steer   = Vector3.ClampMagnitude(desired - agent.velocity, agent.maxSteer);

        return(steer);
    }