任何人都可以帮助我如何解决我遇到的这个问题?
*第一个脚本:
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上”,但敌人将继续受到伤害,直到对撞机再次被禁用。想帮忙吗?
我觉得问题是
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并在更新中检查它,而只需调用一个启用碰撞器并启动协同例程的方法?