我试图让我的播放器在被击中时闪烁。我已经命中检测工作。他现在变成了红色。我想知道如何使实际的闪烁发生。这是一个处理被击中的片段:
if(otherObject.CompareTag("Minion")) //hit by minion
{
if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy
{
otherObject.GetComponent<Minion>().setMoving(false); //stop moving
playSound(KillEnemySound); //play killing enemy sound
jump();
Destroy(otherObject.gameObject); //kill minion
}
else //otherwise, enemy hit player
{
if(canTakeDamage)
{
changeColor(Color.red);
loseHealth(1); //lose health
canTakeDamage=false;
yield return new WaitForSeconds(1.5f); //delay taking damage repeatedly
changeColor(Color.white);
canTakeDamage=true;
}
//indicate lost health somehow
}
目前,通过yield return new WaitForSeconds(1.5f);
. 我可以发出几个这样的调用,它们之间的颜色会发生变化,但我想知道是否有更简洁的方法。我不能成为第一个在游戏中做出闪光的人。
编辑:我添加了 Heisenbug 的 Flash() 代码如下:
IEnumerator FlashPlayer(float time, float intervalTime)
{
canTakeDamage=false;
float elapsedTime = 0f;
int index = 0;
while(elapsedTime < time )
{
Debug.Log("Elapsed time = " + elapsedTime + " < time = " + time + " deltaTime " + Time.deltaTime);
mat.color = colors[index % 2];
elapsedTime += Time.deltaTime;
index++;
yield return new WaitForSeconds(intervalTime);
}
canTakeDamage=true;
}
它在这里被调用:
void loseHealth(int damage)
{
//irrelevant details omitted for brevity
//the "if" checks if the player has run out of health, should not affect the else because this method is called from OnTriggerEnter...see below...
else
{
StartCoroutine(FlashPlayer (1.5f, 0.5f));
}
}
这是调用的地方(在 OnTriggerEnter 中):
if(otherObject.CompareTag("Minion")) //hit by minion
{
if(hitFromTop(otherObject.gameObject)) //if player jumped on enemy
{
//irrelevant to the problem
}
else //otherwise, enemy hit player
{
if(canTakeDamage)
{
loseHealth(1);
}
//indicate lost health somehow
}
}
现在的问题是Flash永远不会停止。正如我所指定的,当 elapsedTime 达到 1.5f 时它应该停止,但是因为它只是增加少量(在 Time.deltaTime 中),所以它不会在很长一段时间内达到 1.5f。有没有我遗漏的东西可以让它更快地达到 1.5f,或者我可以选择另一个可以准确地用作停止点的数字?elapsedTime 的数字往往是:0、0.02、0.03693、0.054132 等,非常小,所以我不能从这里挑选。