- Home /
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
Answer by ninjarob · Oct 30, 2011 at 07:58 PM
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 http://vimeo.com/9304844
Your answer
 
 
             Follow this Question
Related Questions
Help Understanding Raycast 2 Answers
My Raycasts seem to sometimes miss 0 Answers
Raycast origin overlapping surface of collider counts as a hit 0 Answers
How to check if a raycast is not hitting any tagged colliders? 0 Answers
onGround raycasts return onGround is true while colliding with platform sides 0 Answers
 koobas.hobune.stream
koobas.hobune.stream 
                       
                
                       
			     
			 
                