【问题标题】:Chargin energy and released it while mouse button is held down按住鼠标按钮时充电并释放它
【发布时间】:2019-10-09 20:39:15
【问题描述】:

我需要积累一定的能量,在鼠标松开的时候释放。现在,当能级达到最大值时,能级设置为 0,函数从头开始重新开始累积,创建一个循环。

IEnumerator AttackCharge()
{
    while (true)
    {
        if (Input.GetMouseButton(1) && energyLevel < energyMax)
        {
            energyLevel += 1;

            yield return new WaitForSeconds(playRate);
        }

        if (Input.GetMouseButtonUp(1))
        {
            if (energyLevel == energyMax)
            {
                FxPlayerAttack.Stop();
                FxPlayerAttack.Play();
                shootSound.PlayOneShot(attackSound);

                GetComponentInChildren<ParticleCollision>().attackValue = energyLevel;
                yield return new WaitForSeconds(2);

                energyLevel = 0;
                GetComponentInChildren<ParticleCollision>().attackValue = energyLevel;
            }

            if (energyLevel < energyMax)
            {
                yield return new WaitForSeconds(2);
                energyLevel = 0;
            }
        }
        yield return null;
    }
}

我需要在按住按钮的同时积累能量。当按钮向上时,能量应该在充电阶段达到最大值时释放,能量水平应该回到0并且停止累积,直到再次按下按钮。

【问题讨论】:

  • playRate 是什么?
  • playRate 这是一个浮点数,用于确定执行声音、粒子系统等的增量时间。

标签: c# unity3d


【解决方案1】:

GetMouseButtonUp 仅在释放按钮的单帧 上返回 true。然后你的代码yields

让我们来看看吧:

if (Input.GetMouseButton(1) ...

用户在想要攻击时松开了鼠标,所以这是错误的。

else {
    yield return null;
}

所以你让步并等待下一帧。然后当执行恢复时:

if (Input.GetMouseButtonUp(1))

这是错误的,因为用户在最后帧释放了鼠标按钮。您应该将整个块嵌套在 else 语句中 above yield return null 行。

【讨论】:

  • 即使Input.GetMouseButtonUp(1) 发生在yield return new WaitForSeconds(playRate); 期间的帧中,也可能不会被捕获。而且你不能简单地将被它包裹的行嵌套到 else 块中,因为如果 energyLevel &gt;= energyMax 也会执行 else 块 ...
  • 它工作正常,谢谢。唯一的事情是我需要存储累积的能量并在鼠标向上释放时只释放那个值。我怎样才能做到这一点而不必使用`tempEnergy?
  • @derHugo 次要条件并不会真正影响事情,因为您要添加到else 的内容将/应该仍然包括对GetMouseButtonUp 的检查:如果它们高于在释放发生之前,攻击仍然不会发射的最大能量。
  • @bibrosko 您可以在函数范围内使用变量。看起来您在班级级别声明了tempEnergy:您不需要这样做。即使通过yield,协程也能保持本地范围。
  • @Draco18s 我理解,但我现在的问题是当我释放按钮时能量水平(和/或energyTemp)没有重置。我需要的是存储能量水平,将此值放入子对象的攻击值中,而不是重置所有能量水平。如果我累积 energyMax 应该使用这个值,但是如果我只累积 1 则应该使用 1 的值
猜你喜欢
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-20
  • 2023-03-10
相关资源
最近更新 更多