Search Unity

  1. Welcome to the Unity Forums! Please take the time to read our Code of Conduct to familiarize yourself with the forum rules and how to post constructively.

Bug Healthbar value is set. Fill doesn't show until I move player.

Discussion in 'Scripting' started by kyrieortu, Mar 25, 2023.

  1. kyrieortu


    Feb 7, 2023
    I have 3 bars (Health, speed, weapon/ mana), all 3 behave the exact same way. They have the exact same code and are called the same way.

    The value of my healthbar is correct, but the fill is at value 0, until i move my player using the up-arrow. Then the display works fine. Any other button somehow doesn't work.

    I noticed that the healthbar is already empty in the scene view, even when the slider value is at 1. As soon as i move the slider, the fill gets updated correctly.
    When I start the game now, it still does the same.

    Another attempt showed that when i slide the slider (as earlier) to update the fill.. and then change something irrelevant and save that, then the fill of the bar returns back to zero.
    Repeat infintely.

    The other 2 bars behave normal at all times.

    I tried copying and changing and nothing works. Doing it from scratch, everything the same. Weirdly enough, originally I only did everything for my healthbar, and copy+pasted it 1:1 to create the other bars. Changing only the color (Which also is not the cause, already tested).

    I'm out of ideas. What do you think?

    One last weird thing I noticed: The bar sometimes displays correctly by random chance. if i disable some objects, the chances are higher for it working. It doesn't matter which ones i deactivate too, so there is no object weirdly interacting (I think). I also don't have many Game Objects at all. I have around 10 and a spawner who spawns 50 Objects. If i disable that it works 1 out of 5 times. If I disable all but 3-4 objects, it works most of the times. If I disable 1-2 it works exactly every other time in alternating fashion.. wtf?
  2. Kurt-Dekker


    Mar 16, 2013
    Nothing special here, it just sounds like it is time to you to start debugging!

    Here is how you can get a fast start on your exciting new debugging adventures:

    You must find a way to get the information you need in order to reason about what the problem is.

    Once you understand what the problem is, you may begin to reason about a solution to the problem.

    What is often happening in these cases is one of the following:

    - the code you think is executing is not actually executing at all
    - the code is executing far EARLIER or LATER than you think
    - the code is executing far LESS OFTEN than you think
    - the code is executing far MORE OFTEN than you think
    - the code is executing on another GameObject than you think it is
    - you're getting an error or warning and you haven't noticed it in the console window

    To help gain more insight into your problem, I recommend liberally sprinkling
    statements through your code to display information in realtime.

    Doing this should help you answer these types of questions:

    - is this code even running? which parts are running? how often does it run? what order does it run in?
    - what are the names of the GameObjects or Components involved?
    - what are the values of the variables involved? Are they initialized? Are the values reasonable?
    - are you meeting ALL the requirements to receive callbacks such as triggers / colliders (review the documentation)

    Knowing this information will help you reason about the behavior you are seeing.

    You can also supply a second argument to Debug.Log() and when you click the message, it will highlight the object in scene, such as

    If your problem would benefit from in-scene or in-game visualization, Debug.DrawRay() or Debug.DrawLine() can help you visualize things like rays (used in raycasting) or distances.

    You can also call Debug.Break() to pause the Editor when certain interesting pieces of code run, and then study the scene manually, looking for all the parts, where they are, what scripts are on them, etc.

    You can also call GameObject.CreatePrimitive() to emplace debug-marker-ish objects in the scene at runtime.

    You could also just display various important quantities in UI Text elements to watch them change as you play the game.

    If you are running a mobile device you can also view the console output. Google for how on your particular mobile target, such as this answer or iOS: or this answer for Android:

    If you are working in VR, it might be useful to make your on onscreen log output, or integrate one from the asset store, so you can see what is happening as you operate your software.

    Another useful approach is to temporarily strip out everything besides what is necessary to prove your issue. This can simplify and isolate compounding effects of other items in your scene or prefab.

    Here's an example of putting in a laser-focused Debug.Log() and how that can save you a TON of time wallowing around speculating what might be going wrong:

    When in doubt, print it out!(tm)

    Note: the
    function is an alias for Debug.Log() provided by the MonoBehaviour class.
  3. chemicalcrux


    Mar 16, 2017
    Does it always show an empty fill, or is it sometimes half-full? If it's always empty, then I have to wonder if this is a problem with the renderer itself.

    I do almost no 2D, unfortunately, so I can't tell you too much about it.
  4. kyrieortu


    Feb 7, 2023
    I already tried everything with the code. I even swapped out code for different bars, but its always the same one with the problems.

    The bar is ALWAYS empty when starting the game (Or the correct value as explained).
    The bar is ALWAYS empty in scene view (without a starded game), unless I drag the slider, as mentioned above.

    I also feel like it's a problem with the renderer or something on the engine in general.
  5. kyrieortu


    Feb 7, 2023
    I just wanted to say that I ignored that bug and for some reason it's gone now.
    Some bug in unity or the renderer that somehow sorted itself out.