x


pause charactercontroller movement briefly?

So I set up a simple waypoint script, where my AI patrols several waypoints, and when it reaches a waypoint, it rotates towards and moves to the next waypoint.

All I want to do is make it so that when the AI gets to a waypoint, he pauses for a moment, and THEN rotates and moves to the next waypoint. I've tried a couple things, like setting up timers and using WaitForSeconds, but I can't figure it out. Anyway, here is my script in its current state:

var waypoints : Transform[];
var moveSpeed = 3.0;
var rotationSpeed = 3.0;
var waypointStopRange = 1.0;

private var currentWaypoint : int;

function Update(){

    PatrolWaypoints();

}

function PatrolWaypoints(){

    if(currentWaypoint < waypoints.length){

        var waypointDistance = Vector3.Distance(transform.position, waypoints[currentWaypoint].position);
        var waypointDirection = waypoints[currentWaypoint].position - transform.position;

        if(waypointDistance <= waypointStopRange){
            currentWaypoint++;
        }
        else{
            RotateTowards(waypointDirection);
            MoveForward();
        }

    }
    else{

        if(waypointLoop){
            currentWaypoint = 0;
        }

    }

}

function RotateTowards (position : Vector3) {

    position.y = 0;
    var targetRotation = Quaternion.LookRotation(position);
    transform.rotation = Quaternion.Slerp(transform.rotation, targetRotation, rotationSpeed * Time.deltaTime);

}

function MoveForward(){

    var forward = transform.TransformDirection(Vector3.forward);
    var moveDirection = forward * moveSpeed;
    GetComponent (CharacterController).SimpleMove(moveDirection);

}

I've been trying to do the pause inside of if(waypointDistance <= waypointStopRange), because that is when he has reached currentWaypoint, and when currentWaypoint is incremented to the next. I cannot for the life of me figure out how to get him to stop moving for a few moments there. If I use yield WaitForSeconds(), he will just get stuck there indefinitely.

more ▼

asked Apr 27 '10 at 08:37 PM

PrimeDerektive gravatar image

PrimeDerektive
3.1k 57 64 84

(comments are locked)
10|3000 characters needed characters left

1 answer: sort voted first

I would rather than calling the Patrol function from update, call it from a start function similar how the FPS tutorial does it. Then yield after every check and once the character reaches his waypoint, then you can use WaitForSeconds() without any issue.

//Simplified to show the idea.
function Start () {
     PatrolWaypoints();
}

function Patrol () {
while(true) {
    if(currentWaypoint < waypoints.length) {
         if( waypointDistance <= wayPointStopRange) {
              currentWaypoint++
              yield WaitForSeconds(waitTime);
         }

         else{
             RotateTowards(waypointDirection);
             MoveForward();
         }
    }
    else{

        if(waypointLoop){
            currentWaypoint = 0;
        }

    }
     yield;
}

function RotateTowards (position : Vector3) {
}

function MoveForward() {
}

The script above looks very similar to the one you wrote so there would not be much to change. I find that state based behavior usually works better from system similar to above because then each state just calls the next instead of a central Update trying to figure it out.

more ▼

answered Apr 27 '10 at 11:10 PM

Peter G gravatar image

Peter G
15.1k 16 44 137

Why is it that yield WaitForSeconds would behave differently in Start() versus Update()?

Also, I removed it because it wasn't relevant to my question, but inside patrol() I also do my checks for distance to the player, and run the attack function if hes within range. Would that be effected if I moved Patrol() to Start()?

Apr 28 '10 at 02:48 PM PrimeDerektive

Nice! Nevermind I figured it out. I can't say I fully understand how coroutines work, but at least now I can use them :)

Apr 28 '10 at 06:52 PM PrimeDerektive
(comments are locked)
10|3000 characters needed characters left
Your answer
toggle preview:

Up to 2 attachments (including images) can be used with a maximum of 524.3 kB each and 1.0 MB total.

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Answers

Answers and Comments

Topics:

x1426
x704
x348
x268

asked: Apr 27 '10 at 08:37 PM

Seen: 1350 times

Last Updated: Apr 27 '10 at 08:37 PM