Ai keeps walking in a circle.

So I’m making a simple script using Raycast where when my ai gets close to a wall it rotates and moves away from it. But when I test it the ai just runs in a circle. I’m fairly new to this and any help would be appreciated!

Here is the script I am using:

var speed : float = 10;
var sightRange : float = 5;
function Start () {

}

function Update () {
	var controller = GetComponent(CharacterController);
	var velocity = speed;
	
	var fwd = transform.TransformDirection(Vector3.forward);
	var hit : RaycastHit;
	if(Physics.Raycast(this.transform.position,fwd,hit,sightRange));
	{
		transform.Rotate(0,90 * Time.deltaTime,0);
	}
	controller.Move(fwd * velocity * Time.deltaTime);
}

You’ve got an extra semicolon!

if(Physics.Raycast(this.transform.position,fwd,hit,sightRange)); <= THIS ONE!
    {
        transform.Rotate(0,90 * Time.deltaTime,0);
    }

The semicolon ends the if, and the stuff between the {} happens no matter what the content of the if-check resolves to. Remove that semicolon, and you’re good.

It looks like you need to insert another condition to make sure the ray knows when it hits a wall, otherwise it returns true if it hits anything, no matter what. Something like:

if(Physics.Raycast(this.transform.position,fwd,hit,sightRange));
{
   if(hit.collider.tag == "wall") // or - if(hit.collider.gameObject.isStatic) - if you make the walls static
   {
      transform.Rotate(0,90 * Time.deltaTime,0);
   }
}