我正在用 Unity 制作一款回合制 RPG,我有一个滑块,当玩家攻击时会弹出。A 沿着滑块向下移动,玩家将滑块移到中心越近并按下 Z,它造成的伤害就越大。然而,出于某种原因,它不是一个简单的输入,你要么猛击 Z,要么它根本不会接受输入。
代码如下:
void DamageGauge(int target, float power, bool special, string status, string name)
{
int t = target;
float p = power;
bool s = special;
string st = status;
string n = name;
meterOpen = true;
slashSlider.gameObject.SetActive(true);
slashSlider.value = 0;
StartCoroutine(DamageSliderTick(t, p, s, st, n));
}
// ReSharper disable Unity.PerformanceAnalysis
public IEnumerator DamageSliderTick(int target, float power, bool special, string status, string name)
{
bool press = false;
int t = target;
float p = power;
bool s = special;
string st = status;
string n = name;
BattleChar sTarget = activeBattlers[t];
for (int i = 0; i < 51; i++)
{
yield return new WaitForSeconds(.01f);
slashSlider.value += 4;
if (Input.GetKeyDown(KeyCode.Z) || i == 50)
{
float v = slashSlider.value;
if(i != 50)
{
switch (v)
{
case < 20:
DealDamage(t, p, .5f, s, st, n);
break;
case < 50:
DealDamage(t, p, .8f, s, st, n);
break;
case < 85:
DealDamage(t, p, 1, s, st, n);
break;
case < 97:
DealDamage(t, p, 1.4f, s, st, n);
break;
case < 132:
DealDamage(t, p, 1, s, st, n);
break;
case < 170:
DealDamage(t, p, .8f, s, st, n);
break;
case < 200:
DealDamage(t, p, .5f, s, st, n);
break;
}
} else
{
DealDamage(t, p, .5f, s, st, n);
}
slashSlider.gameObject.SetActive(false);
slashSlider.value = 0;
if (activeBattlers[t].currentHP <= 0)
{
RewardDialog.instance.xpPool += sTarget.xpWorth;
RewardDialog.instance.moneyPool += sTarget.dollarWorth;
if (sTarget.itemDrop[0] != null)
{
RewardDialog.instance.ShuffleItems(sTarget.itemDrop);
}
}
UpdateStatus(t);
NextTurn();
break;
}
}
}
Input.GetKeyDown
仅当您在该帧期间按下该键时才会返回 true。由于您在之后调用它WaitForSeconds
,因此无法保证您只是在该帧按下该键。通常情况下,可以
Input.GetKeyDown
在Update
事件方法中调用记录按键按下的时间,然后在协程中比较当前时间和按下时间的差值,如果小于某个阈值,则认为玩家在这段时间内按下了按键。你也可以直接在协程中等待,而不是使用
WaitForSeconds
更手动的等待循环,例如这允许跟踪每一帧的输入而不会错过任何一帧,并在按下 Z 时直接中断等待并继续其余部分。
尽管如此,等待
0.01
几秒钟几乎没有意义。对于60
FPS 来说,一帧大约需要1/60 = 0.017
几秒钟。所以你也可以使用所以它正好等待一帧。然后,你可以每秒增加一个值,而不是每帧增加一个固定值,然后执行