当前位置: 首页 > 知识库问答 >
问题:

Unity OnTriggerEnter2D

欧阳安阳
2023-03-14

任何人都可以帮助我如何解决我遇到的这个问题?

*第一个脚本

public static bool attacking; 
public Collider2D attackTrigger;

private void Awake()
{
    attackTrigger.enabled = false;
}

private void Update()
{
    if (attacking == true)
    {
        Debug.Log("Box Collider Enabled");

        attackTrigger.enabled = true;
        StartCoroutine(DisableCollider());
    }
}

IEnumerator DisableCollider()
{
    yield return new WaitForSeconds(1);
    attacking = false;
    attackTrigger.enabled = false;
    Debug.Log("Box Collider Disabled");
}

*第二个脚本:

public float damage = .10f;

private void OnTriggerEnter2D(Collider2D collision)
{  
    if(collision.isTrigger!=true && collision.CompareTag("Enemy"))
    {
        Debug.Log("Enemy is Damaged");
        EHealthBar.TakeDamage(damage);
    }
}

我试图让我的玩家角色使用碰撞攻击敌人,好吧,它确实有效,玩家确实会伤害敌人,但只有当敌人的盒子对撞机再次进入我的攻击时,它才会起作用。

如果敌人已经在我的攻击区域内,并附加了一个盒子碰撞2d,那么敌人不会受到伤害,这不是我想要的。

我可以将其更改为“在触发者Stay2D上”,但敌人将继续受到伤害,直到对撞机再次被禁用。想帮忙吗?

共有1个答案

漆雕恺
2023-03-14

我觉得问题是

    IEnumerator DisableCollider()
    {
    yield return new WaitForSeconds(1);
    attacking = false;
    ...

这导致更新中的IF语句仍然出现1秒钟,并启动许多协程。最简单的解决方法是移动攻击=假;但我猜你想用这个变量来知道用户是否处于攻击状态。所以我建议用另一个bool变量。

        if (invokeAttack)
        {
            attacking = true;
            invokeAttack = false

            Debug.Log("Box Collider Enabled");
            attackTrigger.enabled = true;
            StartCoroutine(DisableCollider());
        }

无论如何,您并没有向我们展示如何调用攻击,但也许您不需要将变量(在本例中为attacking/invokeAttack)更改为true并在更新中检查它,而只需调用一个启用碰撞器并启动协同例程的方法?

 类似资料:

相关问答

相关文章

相关阅读