Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

[Bug] Barra de vida do inimigo fica invisível quando atualiza a cor

Olá, acho que o Slider de vida do chefe no Inspector não está sendo acessado corretamente, então criei um método para acessá-lo via script, e isso funcionou para alterar o valor do Slider. Não sei por que diretamente pelo Inspector não está funcionando para mudar o valor da barra de vida do chefe. Em relação à mudança de cor do Slider, acredito que ele esteja ficando transparente por algum motivo. Verifiquei tudo no Inspector, revisei e fiz o debug do script. Então, criei um método para acessá-lo diretamente via script, e funcionou para mudar o valor da Slider, mas a vida fica transparente quando a cor muda. Inspetor

Deixei apenas os métodos que estão usando a parte das variáveis 'Slider_lifeBar, Image_Life, MaxLifeColor e MinLifeColor'. Mas posso manda o Script todo. As partes comentadas são porquê eu estava testando o código para ver qual era o erro aí comentei e descomentei varias partes.

using UnityEngine;
using UnityEngine.AI;
using UnityEngine.UI;
public class BossControl : MonoBehaviour, IKillable
{
    [HideInInspector]
    public BossSpawner MySpawn;
    [Tooltip("Suavisação para girar")]
    public float SmoothSpinSpeed = 10f;
    [Tooltip("Kit médico")] 
    public GameObject LootDrop_MedKit;
    [Tooltip("Som de morte")] 
    public AudioClip SFXDead;
    public Slider Slider_lifeBar;
    public Image image_Life;
    public Color MaxLifeColor, MinLifeColor;
    public bool ShowGizmos;

    private EnemyStatus bossStatus;
    private CharacterMovement bossMovement;
    private CharacterAnimator bossAnimation;
    private UIManager _UIManager;
    private Transform player;
    private NavMeshAgent agent;

    private void Start()
    {
        player = GameObject.FindGameObjectWithTag("Player").transform;
        if (player == null)
        {
            Debug.LogError("Objeto do player não encontrado na cena!");
            return;
        }
        
        _UIManager = FindObjectOfType<UIManager>();
        
        agent = GetComponent<NavMeshAgent>();
        bossStatus = GetComponent<EnemyStatus>();
        bossMovement = GetComponent<CharacterMovement>();
        bossAnimation = GetComponent<CharacterAnimator>();

        StartLifeBar();
    }

    // Metodo criado para acessar a slider barra de vida diretamente
    private void StartLifeBar()
    {
        Slider_lifeBar = transform.GetChild(1).transform.GetChild(0).GetComponent<Slider>();
        
        // Configura o Slider
        Slider_lifeBar.maxValue = bossStatus.MaxLife;
        Slider_lifeBar.value = Slider_lifeBar.maxValue;
    }

    private void AttacksPlayer()
    {
        int currentDamage = Random.Range(bossStatus.MinDamage, bossStatus.MaxDamage);
        player.GetComponent<PlayerControl>().TakeDamage(currentDamage);
    }

    public void TakeDamage(int damageAmount)
    {
        bossStatus.CurrentLife -= damageAmount;
        //Slider_lifeBar.value = bossStatus.CurrentLife;
        UpdateUILife();
        
        if (bossStatus.CurrentLife < 0)
        {
            ToDie();
        }
    }

    private void UpdateUILife()
    {
        Slider_lifeBar.value = bossStatus.CurrentLife;
        // Image image_Life = Slider_lifeBar.transform.GetChild(1).transform.GetChild(0).GetComponent<Image>();
        
        // float lifePercentage = (float)bossStatus.CurrentLife / bossStatus.MaxLife;
        // Debug.Log($"BOSS LifePercentage: {lifePercentage}");
        // Color currentLifeColor = Color.Lerp(MinLifeColor, MaxLifeColor, lifePercentage);
        // image_Life.color = currentLifeColor;
    }
}
3 respostas
solução!

Oi, Bruno, tudo bem?

Confere se quando você clica na cor o último campo o Alpha (A) tá no máximo, talvez seja isso, se ele estiver zero vai ficar transparente.

É uma solução boba que passou despercebida. Foi no Alfa da cor, que estava zero no inspetor. Coloquei no script também para garantir que o Alfa da cor seja sempre 255 (opaco). Acho que estava cansado ou desatento no dia em que fiz e passou despercebido, pois hoje, quando comecei a revisar encontrei o erro ate que bem rápido.

    private void UpdateUILife()
    {
        Slider_lifeBar.value = bossStatus.CurrentLife;
        float lifePercentage = (float)bossStatus.CurrentLife / bossStatus.MaxLife;

        Color currentLifeColor = Color.Lerp(MinLifeColor, MaxLifeColor, lifePercentage);
        currentLifeColor.a = 1f; // Garante que a cor resultante seja totalmente opaca
        Image_Life.color = currentLifeColor;
    }

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Obrigado pela dica. Acabei de conferir isso neste exato momento. Obrigado! Não sei se o Alfa estava em 0 como padrão quando criei as variáveis e passou despercebido, e eu tinha esquecido do Alfa também.

Boa! Bons, estudos!

Sim! Eu notei porque no print que você notou a barrinha embaixo da cor tava preta e normalmente é branca