Obstacle avoidance

I am trying to make my enemies avoid obstacles in front of them.

I have 6 Empty GameObjects which I called “sensors” which are positioned left, right, and 2 in the middle one offset to the right and the other to the left. FreeMovement is a method I wrote which takes a point (Vector) as parameter and makes the enemy navigate its way to that point, which works fine.

> private Vector3 EnemySight()
>     {
>         Ray middleRayLeft = new Ray(transform.position + middleOffset,
> (middleSensorLeft.position -
> (transform.position - middleOffset)));
>         Ray middleRayRight = new Ray(transform.position - middleOffset,
> (middleSensorLeft.position -
> (transform.position - middleOffset)));
>         Ray leftRay = new Ray(transform.position,
> (leftSensor.position -
> transform.position).normalized);
>         Ray rightRay = new Ray(transform.position,
> (rightSensor.position -
> transform.position).normalized);
> 
>         Debug.DrawRay(transform.position,
> leftSensor.position -
> transform.position, Color.blue);
>         Debug.DrawRay(transform.position,
> rightSensor.position -
> transform.position, Color.red);
>         Debug.DrawRay(transform.position +
> middleOffset,
> (middleSensorLeft.position -
> (transform.position - middleOffset)),
> Color.grey);
>         Debug.DrawRay(transform.position -
> middleOffset,
> (middleSensorLeft.position -
> (transform.position - middleOffset)),
> Color.green);
> 
>         bool leftMiddle = Physics.Raycast(middleRayLeft);
>         bool rightMiddle = Physics.Raycast(middleRayRight);
> 
>         print(leftMiddle + " " + Time.fixedTime);
> 
>         /*if (leftMiddle && !rightMiddle)
>         {
>             return middleSensorRight.position;
>         }
> 
>         if (rightMiddle && !leftMiddle)
>         {
>             return middleSensorLeft.position;
>         }*/
> 
>         if (leftMiddle || rightMiddle)
>         {
>             bool left = Physics.Raycast(leftRay);
>             bool right = Physics.Raycast(rightRay);
> 
>             if (!left)
>             {
>                 return rightSensor.position;
>             }
> 
>             if (!right)
>             {
>                 return leftSensor.position;
>             }
>         }
> 
>         return Vector3.zero;
>     }

then in the update I have this code:

Vector3 collVector = EnemySight();
            //  }

            if (collVector == Vector3.zero)
            {
                if (target != null)
                {
                    FreeMovement(target.transform.position + squadLeaderOffset);
                }
                else
                {
                    FreeMovement(pathStart);
                }
            }
            else
            {
                FreeMovement(collVector);
            }

Now I’ve got variations of this code to work in some cases but miserably fail in other situations. any ideas on what’s wrong with my reasoning ?

thanks in advance

Im not sure how to fix your example but it looks very similar to how i used to do object avodiance, rather than useing several raycast i would suggest useing just one then useing the normal of the hit to modify your players movement.

not my video but sums it up very nicely Obstacle Avoidance - Unity 3d on Vimeo