- Home /
Question by
Albert-han · Jun 25, 2014 at 12:21 PM ·
airandomwander
Random Wander Ai
Hi guys i've been using a script for my ai but it is just nonsense.randomly walk around a place (school) in my case without colliding with another person or wall but now it go through walls even with box collider and cant change direction when going to hit something.Does anybody know how to implement those features.thanks Here's my current script.
var Speed= 20;
var wayPoint : Vector3;
var Range= 10;
function Start(){
//initialise the target way point
Wander();
}
function Update()
{
// this is called every frame
// do move code here
transform.position += transform.TransformDirection(Vector3.forward)*Speed*Time.deltaTime;
if((transform.position - wayPoint).magnitude < 3)
{
// when the distance between us and the target is less than 3
// create a new way point target
Wander();
}
}
function Wander()
{
// does nothing except pick a new destination to go to
wayPoint= Vector3(Random.Range(transform.position.x - Range, transform.position.x + Range), 1, Random.Range(transform.position.z - Range, transform.position.z + Range));
wayPoint.y = 1;
// don't need to change direction every frame seeing as you walk in a straight line only
transform.LookAt(wayPoint);
Debug.Log(wayPoint + " and " + (transform.position - wayPoint).magnitude);
}
Comment
Answer by bobin115 · Sep 08, 2014 at 10:15 AM
try this. #pragma strict
/// <summary>
/// Creates wandering behaviour for a CharacterController.
/// </summary>
@script RequireComponent(CharacterController)
var speed:float = 5;
var directionChangeInterval:float = 1;
var maxHeadingChange:float = 30;
var heading: float=0;
var targetRotation: Vector3 ;
function Awake (){
// Set random initial rotation
transform.eulerAngles = Vector3(0, Random.Range(0,360), 0); // look in a random direction at start of frame.
//StartCoroutine
NewHeadingRoutine ();
}
function Update (){
var controller : CharacterController = GetComponent(CharacterController);
transform.eulerAngles = Vector3.Slerp(transform.eulerAngles, targetRotation, Time.deltaTime * directionChangeInterval);
var forward = transform.TransformDirection(Vector3.forward);
controller.SimpleMove(forward * speed);
}
/// <summary>
/// Repeatedly calculates a new direction to move towards.
/// Use this instead of MonoBehaviour.InvokeRepeating so that the interval can be changed at runtime.
/// </summary>
while (true){
NewHeadingRoutine();
yield WaitForSeconds(directionChangeInterval);
}
/// <summary>
/// Calculates a new direction to move towards.
/// </summary>
function NewHeadingRoutine (){
var floor = Mathf.Clamp(heading - maxHeadingChange, 0, 360);
var ceil = Mathf.Clamp(heading + maxHeadingChange, 0, 360);
heading = Random.Range(floor, ceil);
targetRotation = new Vector3(0, heading, 0);
}
Your answer
![](https://koobas.hobune.stream/wayback/20220613152453im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Move Enemy randomly in a range. 3D 0 Answers
Onclick Waypoint Wander 2 Answers
Can you randomise a Navmesh agents rotation 1 Answer