- Home /
 
Raycast AI - Avoiding Obstacles in 2D Topview (Using Velocity)
I need help with a script I've been working on. I got the 2D enemy to follow my character, but I'm stuck at trying to make him avoid things with Raycasts. I don't want him to rotate, because I'm doing a top-down view in 2D. I just want him to change his velocity on the X or Y axis when he approaches a wall. Now, I did write a partial script of him doing that, but I'm too embarrassed to post it because it kinda sucks. (If you want to see it, I can post it in a comment if necessary.) So I will just post the script that makes him follow the player without avoiding things.
Any help would be appreciated.
Thanks
My Script in UnityScript:
 #pragma strict
 //Stuck boolean used for raycast avoiding
 //obstacles, I left it here so you can see
 //below how I was using it.
 var stuck : boolean;
 //Storing player's transform into this variable.
 var player : Transform;
 
 //Distance between player and enemy. 
 //May be useful for figuring out if 
 //he should walk up or down if stuck 
 //at X axis or Y axis. 
 var xDistance : float;
 var yDistance : float;
 
 var moveSpeed : float;
 
 var anim : Animator;
 //Separating X and Y velocities to tell which
 //direction the enemy should go.
 var xVelocity : float;
 var yVelocity : float;
 
 //Boolean for telling the animator when to play
 //idle animation.
 var isIdle : boolean;
 
 //When the enemy is alerted, follow the player
 //(haven't coded that yet, but that's not what I need help with)
 var follow : boolean;
 
 function Start () {
     anim = GetComponent(Animator);
     player = GameObject.FindGameObjectWithTag("Player").transform;
     follow = true;
 }
 
 function FixedUpdate () {
     
     //If both X and Y velocities are at 0
     //set Idle animation to true.    
     if(xVelocity == 0 && yVelocity == 0)
         isIdle = true;
     else
         isIdle = false;
     
     anim.SetBool("isIdle", isIdle);
     
     //Calculating distance from enemy and player.
     xDistance = transform.position.x - player.position.x;
     yDistance = transform.position.y - player.position.y;
 
 
     if(follow){    
     
         //Setting boolean operations to the position of the enemy.
         //Makes it easier to make if statements for where the enemy
         //should follow the player.
         var right : boolean;
         var left : boolean;
         var up : boolean;
         var down : boolean;
 
         if(transform.position.x > player.position.x)
             right = true;
         else
             right = false;
             
         if(transform.position.x < player.position.x)
             left = true;
         else
             left = false;
             
         if(transform.position.y > player.position.y)
             up = true;
         else
             up = false;
             
         if(transform.position.y < player.position.y)
             down = true;
         else
             down = false;
 
     //Following the player.
     if(right && !stuck)
         xVelocity = -moveSpeed;        
     
     if(left && !stuck)
         xVelocity = moveSpeed;
 
     //It bugs out when the player 
     //and enemy is on the same X and Y position.
     if(Mathf.Round(transform.position.x) == 
     Mathf.Round(player.transform.position.x))
         xVelocity = 0f;
         
     if(down && !stuck)
         yVelocity = moveSpeed;
     
     if(up && !stuck)
         yVelocity = -moveSpeed;
     
     //Fixing the wierd thing again for Y position.
     if(Mathf.Round(transform.position.y) == 
     Mathf.Round(player.position.y) && !stuck)
         yVelocity = 0f;
 }
     //Setting the velocities for the animator.    
     anim.SetFloat("xVelocity", xVelocity);
     anim.SetFloat("yVelocity", yVelocity);
     //Using the X and Y velocity variables above to set
     //rigidbody velocity. 
     rigidbody2D.velocity = Vector2(xVelocity, yVelocity);
 }
 
 
              Yeah I'm trying to do the same thing too. (I know this is an old question, but I would just like to see what other people have done to try solving the same problem.) I'm writing it in C#, but I have no idea what i'm doing.
Your answer
 
             Follow this Question
Related Questions
How can I make an AI that avoids obstacles WITHOUT using NavMesh? 3 Answers
Detect tag with 2d raycasting 1 Answer
Unity 2D Top-Down Raycast length/distance and direction problem 0 Answers
2D Field of View 2 Answers
Raycast Steering Problem 1 Answer