你好,我的代码基本上是碰撞的,它会启动减速敌人的协同线,然后在3.2秒后恢复到原来的状态。
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "slowProjectile")
{
StartCoroutine(slowEnemy());
}
}
// FROZEN ENEMY BEHAVIOUR
public bool isFrozen = true;
IEnumerator slowEnemy()
{
if (isFrozen == true)
{
isFrozen = false;
Debug.Log("FROZEN");
// Turns the enemy into color blue
this.GetComponent<SpriteRenderer>().color = Color.blue;
enemyMovementSpeed = enemyMovementSpeed / 2;
// waits for 3.2 seconds
yield return new WaitForSeconds(3.2f);
// Then return the enemy movement speed and color to its original state.
enemyMovementSpeed = enemyMovementSpeed * 2;
this.GetComponent<SpriteRenderer>().color = Color.white;
}
else
{
isFrozen = true;
}
}问题是协同线是堆叠的,这意味着它将运行x2并丢失原始值,并且弹丸每3秒发射一次。把它想象成一名射击者,每3秒射击一次,撞击时减慢敌人3秒的速度。(就像雪豆,如果你玩植物大战僵尸)
发布于 2022-11-29 06:40:11
如果您想要的是the Frozen effect doesn't stack:
public bool isFrozen = false;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "slowProjectile")
{
if (!isFrozen)
{
StartCoroutine(slowEnemy());
}
}
}
IEnumerator slowEnemy()
{
isFrozen = true;
Debug.Log("FROZEN");
// Turns the enemy into color blue
this.GetComponent<SpriteRenderer>().color = Color.blue;
enemyMovementSpeed = enemyMovementSpeed / 2;
// waits for 3.2 seconds
yield return new WaitForSeconds(3.2f);
// Then return the enemy movement speed and color to its original state.
enemyMovementSpeed = enemyMovementSpeed * 2;
this.GetComponent<SpriteRenderer>().color = Color.white;
isFrozen = false;
}上面代码的缺点是while the Speed Change doesn't stack, the Frozen Time neither。
如果您想要stack the Frozen Time and not stack Speed Change at the same time,也许您需要添加一个Forzen Stack Counter来检查冻结时间是否结束:
public int forenStackCount = 0;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "slowProjectile")
{
StartCoroutine(slowEnemy());
}
}
private IEnumerator slowEnemy()
{
if (forenStackCount == 0)
{
StartFrozenEffect();
}
forenStackCount++;
yield return new WaitForSeconds(3.2f);
forenStackCount--;
if (forenStackCount == 0)
{
EndFrozenEffect();
}
}
private void StartFrozenEffect()
{
Debug.Log("FROZEN");
// Turns the enemy into color blue
this.GetComponent<SpriteRenderer>().color = Color.blue;
enemyMovementSpeed = enemyMovementSpeed / 2;
}
private void EndFrozenEffect()
{
enemyMovementSpeed = enemyMovementSpeed * 2;
this.GetComponent<SpriteRenderer>().color = Color.white;
} 发布于 2022-11-29 08:48:49
其他答案是正确的,但增加了许多协同作用。以下是一种一次只使用一个协同线的解决方案。
private float m_timer;
private IEnumerator m_coroutine;
private void OnTriggerEnter2D(Collider2D collision)
{
if (collision.tag == "slowProjectile")
{
m_timer = 0f;
if (m_coroutine == null){
m_coroutine = FreezeTime();
StartCoroutine(m_coroutine);
}
}
}
IEnumerator FreezeTime()
{
while (m_timer < 3.2f){
m_timer += Time.deltaTime;
yield return null;
}
m_coroutine = null;
}当发生碰撞时,重置为0,如果没有协同线正在运行,则创建一个新的。
协同线不断增加计时器,如果发生碰撞,它将重置为0。完成后,它将重置协同线引用。
https://stackoverflow.com/questions/74609896
复制相似问题