0

I have a simple project which includes pathfinding with obstacle avoidance. Now, I have void Steer which steers the object around since the path is not straight. then I have void AvoidObstacles which has raycast and the obstacle avoidance part basically.

Whenever the object steers, it calls the AvoidObstacles function. The problem now is, at the start, whenever it hasn't call in the Steer function yet, because it is a straigh line, it passes through the object not avoiding it.

Here are some of the codes used:

 public Vector3 Steer(Vector3 target, bool bFinalPoint = false)
 {
    //Calculate the directional vector from the current position towards the target point
    Vector3 desiredVelocity = (target - transform.position);
    float dist = desiredVelocity.magnitude;



    AvoidObstacles(ref desiredVelocity);
    //Normalise the desired Velocity
    desiredVelocity.Normalize();

    //Calculate the velocity according to the speed
    if (bFinalPoint && dist < 10.0f)
        desiredVelocity *= (curSpeed * (dist / 10.0f));
    else 
        desiredVelocity *= curSpeed;

    //Calculate the force Vector
    Vector3 steeringForce = desiredVelocity - velocity; 
    Vector3 acceleration = steeringForce / mass;

    return acceleration;
}

here is the other one

public void AvoidObstacles(ref Vector3 desiredVelocity)
{
    RaycastHit hit;
    Vector3 leftRay = transform.position;
    Vector3 rightRay = transform.position;

    //leftRay.x -= 2;
    //rightRay.x += 2;

    Debug.DrawLine(transform.position,(transform.forward * 5) + transform.position,Color.green);

    if(Physics.Raycast(transform.position, transform.forward,out hit, minimumDistToAvoid))
    {
        Debug.DrawLine(transform.position,(transform.forward * 10) + transform.position,Color.red);
        if(hit.transform != transform)
        {
           //dir += hit.normal * 50;
           //Get the normal of the hit point to calculate the new direction
           Vector3 hitNormal = hit.normal;
           hitNormal.y = 0.0f; //Don't want to move in Y-Space

           //Get the new directional vector by adding force to vehicle's current forward vector
           desiredVelocity = transform.forward + hitNormal * force;
        }
    }
}

and here is my update

    void Update () 
{
    //Unify the speed
    curSpeed = speed * Time.deltaTime;

    targetPoint = path.GetPoint(curPathIndex);

    //If reach the radius within the path then move to next point in the path
    if(Vector3.Distance(transform.position, targetPoint) < path.Radius)
    {
        //Don't move the vehicle if path is finished 
        if (curPathIndex < pathLength - 1)
            curPathIndex ++;
        else if (isLooping)
            curPathIndex = 0;
        else
            return;
    }

    //Move the vehicle until the end point is reached in the path
    if (curPathIndex >= pathLength )
        return;

    //Calculate the next Velocity towards the path
    if(curPathIndex >= pathLength - 1 && !isLooping)
        velocity += Steer(targetPoint, true);
    else
        velocity += Steer(targetPoint);

    transform.position += velocity; //Move the vehicle according to the velocity
    transform.rotation = Quaternion.LookRotation(velocity); //Rotate the vehicle towards the desired Velocity
    //AvoidObstacles(ref Vector3 desiredVelocity);
    dir.Normalize();
}

Maybe someone can help me out buy letting me know how can I call the avoidobstacle function outside of steer? Maybe in update or start perhaps. I can't really use other algorithms, just this one right here. TIA

Cerberus
  • 1
  • 3

0 Answers0