Значение слайдера не может быть любым числом, кроме 1 или 0 - PullRequest
0 голосов
/ 11 февраля 2019

Я использую предустановку Survival Shooter для Unity и пытаюсь получить сердце, которое находится в углу экрана, отрезать его части в зависимости от здоровья игроков.

Я пытался установить значение Slider для игроков currentHealth / 100, но оно всегда просто исчезает, и значение устанавливается на 0.

Я не думаю, что это проблема с моим Slider, так как я могу изменить значение в редакторе, и оно отлично работает.Я не знаю, что делать, и я пытался искать в других местах.

using UnityEngine;
using UnityEngine.UI;
using System.Collections;
using UnityEngine.SceneManagement;

namespace CompleteProject
{
    public class PlayerHealth : MonoBehaviour
    {
        public int startingHealth = 100;                            // The amount of health the player starts the game with.
        public int currentHealth;                                   // The current health the player has.
        public Slider healthSlider;                                 // Reference to the UI's health bar.
        public Image damageImage;                                   // Reference to an image to flash on the screen on being hurt.
        public AudioClip deathClip;                                 // The audio clip to play when the player dies.
        public float flashSpeed = 5f;                               // The speed the damageImage will fade at.
        public Color flashColour = new Color(1f, 0f, 0f, 0.1f);     // The colour the damageImage is set to, to flash.


        Animator anim;                                              // Reference to the Animator component.
        AudioSource playerAudio;                                    // Reference to the AudioSource component.
        PlayerMovement playerMovement;                              // Reference to the player's movement.
        PlayerShooting playerShooting;                              // Reference to the PlayerShooting script.
        bool isDead;                                                // Whether the player is dead.
        bool damaged;                                               // True when the player gets damaged.


        void Awake ()
        {
            // Setting up the references.
            anim = GetComponent <Animator> ();
            playerAudio = GetComponent <AudioSource> ();
            playerMovement = GetComponent <PlayerMovement> ();
            playerShooting = GetComponentInChildren <PlayerShooting> ();

            // Set the initial health of the player.
            currentHealth = startingHealth;
            healthSlider.value = 1;
        }


        void Update ()
        {
            // If the player has just been damaged...
            if(damaged)
            {
                // ... set the colour of the damageImage to the flash colour.
                damageImage.color = flashColour;
            }
            // Otherwise...
            else

            {
                // ... transition the colour back to clear.
                damageImage.color = Color.Lerp (damageImage.color, Color.clear, flashSpeed * Time.deltaTime);
            }

            // Reset the damaged flag.
            damaged = false;

            if (Input.GetKeyDown("k"))
            {
                TakeDamage(10);

            }
        }


        public void TakeDamage (int amount)
        {
            // Set the damaged flag so the screen will flash.
            damaged = true;

            // Reduce the current health by the damage amount.
            currentHealth -= amount;


            // Set the health bar's value to the current health.
            healthSlider.value = currentHealth/100;
            print(healthSlider.value);

            // Play the hurt sound effect.
            playerAudio.Play ();

            // If the player has lost all it's health and the death flag hasn't been set yet...
            if(currentHealth <= 0 && !isDead)
            {
                // ... it should die.
                Death ();
            }
        }


        void Death ()
        {
            // Set the death flag so this function won't be called again.
            isDead = true;

            // Turn off any remaining shooting effects.
            playerShooting.DisableEffects ();

            // Tell the animator that the player is dead.
            anim.SetTrigger ("Die");

            // Set the audiosource to play the death clip and play it (this will stop the hurt sound from playing).
            playerAudio.clip = deathClip;
            playerAudio.Play ();

            // Turn off the movement and shooting scripts.
            playerMovement.enabled = false;
            playerShooting.enabled = false;
        }


        public void RestartLevel ()
        {
            // Reload the level that is currently loaded.
            SceneManager.LoadScene (0);
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

отладка currenthealth как int, результатом будет int, поэтому 1/100 - это 0

, попробуйте сделать его (float)currenthealth/100

0 голосов
/ 11 февраля 2019

currentHealth - это int, как и 100

, поэтому оно всегда будет округлено до 0 (для currentHealth < 100) или 1 (для 100 <= currentHealth < 200), используяint деление, когда вы делаете

 healthSlider.value = currentHealth / 100;

до того, как результат будет неявно проанализирован до float


, чтобы избежать этого

healthSlider.value = currentHealth / 100.0f;

чтобы заставить его использовать float деление.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...