Variable goes into the negative even if I reset it when it goes below 0.
Hey guys,
I was adding a muzzle flash to my gun and found a weird problem, the light itself is just a point light. First of all, im using this function to time the muzzle flash so it only lights up when I fire my gun:
function WaitForMuzzle()
{
if(muzzleTimer < 0)
{
muzzleFlash.enabled = false;
muzzleTimer = 0.5;
}
else
{
muzzleTimer = muzzleTimer - 50.0 * Time.deltaTime;
}
}
I call this function at the input of the left mouse button just like I do for my shooting function. As you can see in my if statement i set muzzleFlash back to 0.5, the thing is that when I have my inspector open the muzzleTimer variable is sometimes still in the negative which results to the muzzle flash not lighting up when shooting. How can I prevent this from happening?
Answer by Dave-Carlile · Aug 30, 2015 at 03:59 PM
Pretend muzzleTimer = 0.1...
It's not less than 0 so the muzzleTimer < 0
condition is false, so your else gets executed.
That subtracts 50 * Time.deltaTime. At 60fps that will subtract 0.83 from 0.1, resulting in -0.73.
You can deal with this by doing the subtraction first, then doing the negative check...
muzzleTimer -= 50 * Time.deltaTime;
if (muzzleTimer < 0)
{
muzzleTimer = 0.5;
muzzleFlash.enabled = false;
}
Also, you may want to do muzzleTimer <= 0
instead of < 0
, since your 0.5 seconds has elapsed if muzzleTimer
is 0. You'll wait an extra frame if you're just doing < 0
.
I modified what you told me to do, but now the muzzle flash won't turn on at all. Why is this the case?
You probably need to reduce the multiplier from 50 to something smaller. It's going to go negative immediately so it's probably disabling muzzleFlash in the same frame you're enabling it.
So tweak the 50 starting with something much smaller until you get the flash the way you want. Or you can set the timer to something higher than 0.5 so it takes a couple of frames.
For this sort of timer I usually just use Time.deltaTime by itself, then set my timer to the amount of time I want something to take...
muzzleTimer -= Time.deltaTime;
if (muzzleTimer <= 0)
{
muzzleTimer = 0.5;
muzzleFlash.enabled = false;
}
This will take 0.5 seconds for the timer to get to
Alright thanks, after some tweaking with your help I managed to get it to work properly now!
Your answer
Follow this Question
Related Questions
Error with unity shooting script: Monster Death Script Doesent Work 0 Answers
Tag calling is calling all my objects with the same tag 2 Answers
How can I delay 1 second this code? 3 Answers
How do i get a switch to turn on and off fluid flow? 0 Answers
LIST full itself with the last element after leaving a for loop 0 Answers