c# - Unity OnTriggerEnter2D
问题描述
任何人都可以帮助我如何解决我遇到的这个问题?
*第一个脚本:
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 但敌人会继续受到伤害,直到对撞机再次被禁用。关心帮助?
解决方案
我认为问题是
IEnumerator DisableCollider()
{
yield return new WaitForSeconds(1);
attacking = false;
...
这导致您的更新中的 IF 语句仍然发生 1 秒并启动大量协程。最简单的解决方案是移动攻击 = false; 在屈服之前,但我想您想使用该变量来了解用户是否处于攻击状态。所以我建议使用另一个布尔变量。
if (invokeAttack)
{
attacking = true;
invokeAttack = false
Debug.Log("Box Collider Enabled");
attackTrigger.enabled = true;
StartCoroutine(DisableCollider());
}
无论如何,您没有向我们展示您如何调用攻击,但也许不是将变量(在您的情况下为攻击/invokeAttack)更改为 true 并在 Update 中检查它,您只需调用一个启用对撞机并启动协程的方法?
推荐阅读
- java - Eclipse Photon 中的 Spring Boot 调试模式不起作用
- c# - c# Moq objects void方法,改变objects参数值
- hadoop - Apache Phoenix 无法创建架构
- excel - 在 Excel VBA 中暂停循环,直到另一个 Sub 完成
- c# - 检查 sql 数据库中是否存在记录返回错误结果
- react-native - 反应原生找不到变量中心
- javascript - TypeError: UserSchema is not a constructor (Schema is not a constructor MongoDB)
- python - 如何使用 Discord.py 重写更改机器人用户名/头像?
- c# - VS30063突然抛出错误:您无权访问
- python-3.x - Is there a way to read disk access times in python?