首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >创建一个功能,在冲突中敌人将缓慢,并在一定的时间后,它会恢复。

创建一个功能,在冲突中敌人将缓慢,并在一定的时间后,它会恢复。
EN

Stack Overflow用户
提问于 2022-11-29 06:25:59
回答 2查看 36关注 0票数 0

你好,我的代码基本上是碰撞的,它会启动减速敌人的协同线,然后在3.2秒后恢复到原来的状态。

代码语言:javascript
复制
 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秒的速度。(就像雪豆,如果你玩植物大战僵尸)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-29 06:40:11

如果您想要的是the Frozen effect doesn't stack

代码语言:javascript
复制
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来检查冻结时间是否结束:

代码语言:javascript
复制
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;
}    
票数 0
EN

Stack Overflow用户

发布于 2022-11-29 08:48:49

其他答案是正确的,但增加了许多协同作用。以下是一种一次只使用一个协同线的解决方案。

代码语言:javascript
复制
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。完成后,它将重置协同线引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74609896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档