【问题标题】:Game character split health bar calculation游戏角色拆分血条计算
【发布时间】:2020-09-13 02:50:08
【问题描述】:

我正在尝试为游戏中的角色制作一个健康条,我想将它分成多个较小的条。

我整个上午都在为此工作,但不知何故我不知道该怎么做。 这是我到现在为止的代码:

    /// <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;
            }
        }
    }

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

【问题讨论】:

  • 您能添加一个小插图吗?仅从代码来看,我有点难以想象
  • 基本上你有一个进度条列表(n),老板从生命开始。每个条都有一个可以设置的最大值,所以你要做的就是将他的最大值设置为从所有条中除以老板的最大生命值示例:bossLife = 100;进度条.count = 3;每个progressBar.maxValue = 100 / 3;当老板受到伤害时,他的生命开始减少,并且用户界面正在实时更新。如果第一个进度条为空,则列表旁边的第二个进度条开始递减,依此类推。我的问题是计算boss的生命值来正确申请每个bar。

标签: c# unity3d user-interface


【解决方案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;
    }

【讨论】:

  • 天啊,非常感谢!这段代码很干净!我想使用模运算符,但由于某种原因,我无法弄清楚。
猜你喜欢
  • 2011-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多