- 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