x


Function in Update delaying involuntarily

I have a section of code that I wanted to move out of update to prepare some organization for the future. Inside of update the segment runs as expected, but once I place the code segment into a separate function and call it I won't get a response until several seconds after it was suppose to trigger.

I literally copy and pasted between the two and there is only an 'if' statement in the function so far.

function Update () {
    var forward : Vector3 = transform.TransformDirection(Vector3.forward);
    var back : Vector3 = transform.TransformDirection(Vector3.back);
    Debug.DrawRay (transform.position, forward, Color.white);

    if (Physics.Raycast(transform.position, forward, hit, 1))
        if (hit.collider.gameObject.name ==  "Player")
        {
            var test = hit.collider.gameObject.GetComponent(ThirdPersonController);
            if (test.travelAxisCurrent == 4)
                if (!Physics.Raycast(transform.position, back, hit, 1))
                {
                    AssignDestination();
                }
        }
        else{}//was planning on using this else, haven't yet.

    var speed = direction * Time.deltaTime;
    transform.position.z += speed;

    //AtDestination();
    if (transform.position.z + speed < destinationZ)
    {   
        transform.position.z = destinationZ;
        direction = 0;
    }
}

function AtDestination()
{
    if (transform.position.z + speed < destinationZ)
    {   
        transform.position.z = destinationZ;
        direction = 0;
    }
}

EDIT: as requsted, all relevant code. As is with the conditional in Update it runs perfectly, but if I comment out the conditional and un-comment the call the reaction is delayed acouple of seconds. I did try to figure this out but I'm at a complete loss as to why putting an if statement in a method would cause such behavior. And sorry for the readability of the function, I can't get the code formatting to cooperate.

EDIT 2: Finally found the issue. It skipped my mind that speed isn't global. I really should stop working with global variables. So now my assumption is that once the block was pushed it just kept going until the block passed some arbitrary amount that was where the new un-initialized speed variable was. Thanks, and I guess sorry I bugged you all with something so noobish.

more ▼

asked May 31 '12 at 06:49 AM

flojer0 gravatar image

flojer0
1 1 2 3

Are you calling that function from Update()?

function NewFunction()
{
    Debug.Log("Running New Function");
}
function Update()
{
    NewFunction();
}

This will call New Function every frame w/o any delay. What is in your if statement?

May 31 '12 at 06:53 AM hijinxbassist
if (transform.position.z + speed < destinationZ)
{   
    transform.position.z = destinationZ;
    direction = 0;
}

as I said, the code works perfectly fine when placed in update, but once it's moved to a function I get problems.

May 31 '12 at 07:17 AM flojer0

@flojer0 Is there something blocking the call of the function(a conditional)? When does the function get called?

May 31 '12 at 09:47 AM hijinxbassist

Please edit your question to include the whole script, there must be a problem somewhere in the code.

May 31 '12 at 09:50 AM Wolfram

Yep do like @Wolfram said. It's impossible that this caused any problems if that's the only code in your function.

Ask specific and detailed questions. That doesn't mean you have to include 1000 lines of code. Only include the relevant part. If it's still too much code, try to figure out what part is causing the problem. You can only move a part of your code into the function and see how it goes.

You should try to spot the error on your own before you post a question here. This should be a knowledge database and not a human crystal-ball that solve your personal issues for free.

If you have an issue that could happen to others and you couldn't find a solution, ask a question, but take the time to describe your problem because at the moment you actualy waste our time trying to figuring out your problem ;)

May 31 '12 at 08:15 PM Bunny83
(comments are locked)
10|3000 characters needed characters left

2 answers: sort voted first

What is can directly see is that you defined a speed variable inside of update. That means this speed variable is only available in Update. In your AtDestination function you also use a speed variable, but it's definately not the same as the one used in Update.

I guess you have a speed variable in your class / script itself and want to use this instead of creating a local variable in Update. So just remove the "var" in front of speed and you're good to go.

speed = direction * Time.deltaTime;

edit
Next thing that is a bit strange is you check only if the position along the world axis is below your destinationZ. Do you only move backwards or what's the purpose of the check?

more ▼

answered Jun 02 '12 at 09:04 AM

Bunny83 gravatar image

Bunny83
46.8k 12 50 210

As I stated, only you put it better. The variable is local to update at the moment, I just haven't removed all the bad practices I let myself get while learning unity and javascript(unity script).

If you want to know for curiosities sake I'm building a game that involves pushing blocks around, and I wish to keep the player and the blocks on a grid pattern. This is the start of keeping the block I'm testing on moving one unit at a time unless I'm still pushing it. So only one direction is tested.

Jun 02 '12 at 06:22 PM flojer0
(comments are locked)
10|3000 characters needed characters left

you will have to use coroutine in update (). for example click here.

more ▼

answered May 31 '12 at 06:52 AM

hirenkacha gravatar image

hirenkacha
721 12 19 21

You cannot use a coroutine in Update(). Look at the bottom of this page.

May 31 '12 at 06:54 AM hijinxbassist

ohh.. so i will have to use this in a seprate function. But can i use yeild waitforseconds?

May 31 '12 at 07:31 AM hirenkacha

@hirenkacha No coroutine can be used inside of Update(). You can use StartCoroutine to start a function that can as stated at the bottom of the link i posted in my prev comment. You cannot delay the Update call.

May 31 '12 at 09:41 AM hijinxbassist

@hijinxbassist Thanx friend for correcting me... it will help me in my game too..

May 31 '12 at 04:40 PM hirenkacha

@hijinxbassist: You should watch your words because you can use coroutines in Update. Update itself can't be a coroutine so you can't use yield in Update, but you can start coroutines in Update.

In UnityScript you don't have to use StartCoroutine(), that happens behind the scenes. If you just call a coroutine like a normal function, Unity will call StartCoroutine for you.

May 31 '12 at 10:03 PM Bunny83
(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:

x513
x497
x182

asked: May 31 '12 at 06:49 AM

Seen: 366 times

Last Updated: Jun 02 '12 at 06:22 PM