游戏角色分割健康栏计算

时间:2020-05-26 10:16:09

标签: c# unity3d user-interface

我正在尝试为游戏中的角色制作一个健康条,并且希望将其分成多个较小的条。

我整个上午都在努力,但是不知怎么做。 这是我到目前为止编写的代码:

    /// <summary>
    /// UI list for the health bars
    /// </summary>
    [SerializeField] private List<Slider> healthBars = null;

    /// <summary>
    /// The health of the boss
    /// </summary>
    [SerializeField] private Enemy bossLife = null;

private void Awake()
    {
        InitializeUI();
    }

private void LateUpdate()
    {
        UpdateBossUI();
    }

// WIP
private void InitializeUI()
    {
        int _maxBossHealth = bossLife.maxHealth;
        int _totalHeathBars = healthBars.Count;

        float _barMaxVal = _maxBossHealth / _totalHeathBars;
        for (int i = 0; i < _totalHeathBars; i++)
        {
            healthBars[i].value = healthBars[i].maxValue = _barMaxVal;
        }
        lastHealth = _maxBossHealth;
    }

    private void UpdateBossUI()
    {
        // Be sure to not update the UI every frame but only if needed
        int _currBossHealth = bossLife.CurrentHealth;
        if (lastHealth == _currBossHealth)
            return;

        // Remember when the UI was updated
        lastHealth = _currBossHealth;

        int _maxBossHealth = bossLife.maxHealth;
        int _totalHeathBars = healthBars.Count;
        float _barMaxVal = _maxBossHealth / _totalHeathBars;

        for (int i = 0; i < _totalHeathBars; i++)
        {
            if (_currBossHealth > _maxBossHealth - _barMaxVal * (i + 1) 
                && _currBossHealth <= _maxBossHealth - _barMaxVal * i)
            {
                healthBars[i].value = ((_maxBossHealth - (_maxBossHealth / _totalHeathBars)) - _currBossHealth) * -1;
            }
        }
    }

有人可以帮我一下吗? 谢谢

1 个答案:

答案 0 :(得分:1)

我将您的上一个for循环更改为此:

    for (int i = 0; i < _totalHeathBars; i++)
    {
        if (_currBossHealth >= (i + 1) * _barMaxVal)     // health greater than current bar => full bar
            healthBars[i].value = _barMaxVal;
        else if (_currBossHealth < i * _barMaxVal)       // health less than current bar => empty bar
            healthBars[i].value = 0;
        else                                             // health inside current bar 
            healthBars[i].value = _currBossHealth % _barMaxVal;
    }