- Home /
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.
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?
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.
@flojer0 Is there something blocking the call of the function(a conditional)? When does the function get called?
Please edit your question to include the whole script, there must be a problem somewhere in the code.
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 ;)
Answer by Bunny83 · Jun 02, 2012 at 09:04 AM
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?
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.
Answer by hirenkacha · May 31, 2012 at 06:52 AM
you will have to use coroutine in update (). for example click here.
You cannot use a coroutine in Update(). http://unity3d.com/support/documentation/ScriptReference/index.Coroutines_26_Yield.html>Look at the bottom of this page.
ohh.. so i will have to use this in a seprate function. But can i use yeild waitforseconds?
@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.
@hijinxbassist Thanx friend for correcting me... it will help me in my game too..
@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.
Your answer
Follow this Question
Related Questions
How to create a delay in a function being called in update? 2 Answers
can i delay the script in the 'function update'? 2 Answers
How to Update a score count going up and down 1 Answer
Update Function Work Around Question 2 Answers
Weird delay on Tween 1 Answer