【问题标题】:Unity OnTriggerEnter2DUnity OnTriggerEnter2D
【发布时间】:2019-05-27 10:15:36
【问题描述】:

谁能帮我解决我遇到的这个问题?

*第一个脚本:

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 盒子碰撞,那么敌人不会受到伤害,这不是我想要的。

我可以将其更改为 OnTriggerStay2D,但敌人会继续受到伤害,直到对撞机再次被禁用。愿意帮忙吗?

【问题讨论】:

    标签: c# unity3d triggers


    【解决方案1】:

    我认为问题是

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

    这会导致更新中的 IF 语句仍然发生 1 秒并启动大量协程。最简单的解决方案是移动攻击 = false;在屈服之前,但我想您想使用该变量来了解用户是否处于攻击状态。所以我建议使用另一个 bool 变量。

            if (invokeAttack)
            {
                attacking = true;
                invokeAttack = false
    
                Debug.Log("Box Collider Enabled");
                attackTrigger.enabled = true;
                StartCoroutine(DisableCollider());
            }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-19
      • 2021-11-17
      • 2014-12-14
      • 2016-02-28
      • 1970-01-01
      • 2016-08-27
      • 1970-01-01
      • 2021-12-18
      相关资源
      最近更新 更多