美好的一天,我试图创造一个伤害玩家的敌人,因为这就是敌人所做的。我已经弄清楚了如何做到这一点,唯一的问题是敌人几乎立即杀死了玩家并且太强大了......我试图在敌人再次袭击之前放一些冷却时间,但不幸的是,OnTriggerEnter2D
似乎只接受 1 if 语句。
void OnTriggerEnter2D(Collider2D col){
//What iam trying to achieve but this doesn't work
if(Time.time > nextDamageTime) {
if(col.CompareTag("Player")){
player.curHealth -= 1;
Debug.Log("Enemy damaged player!");
nextDamageTime = Time.time + cooldownTime;
}
}
}
首先是 c#。没有什么可以控制您在方法中打开多少if
块。
因此,不,OnTriggerEnter2D
内的条件和if
块没有限制!
我实际上在您的代码中没有看到直接问题,除了可能:OnTrigggerEntet2D
只调用一次,即在触发器进入而不退出的那一刻。因此,如果这已经立即杀死了玩家,那么减少1
可能只是一个过高的值。
使用计时器什么都不会发生,因为如前所述,它只被调用一次,所以在计时器尚未完成的情况下,在敌人离开并最终重新进入之前什么都不会发生。
您可能希望使用OnTriggerStay2D
只要触发器发生冲突,它就会调用每一帧。
float timer;
private void OnTriggerEnter2D (Collider other)
{
// reset the timer so the first hit happens immediately
timer = 0;
}
private void OnTriggerStays2D(Collider other)
{
if(!col.CompareTag("Player")) return;
timer -= Time.deltaTime;
if(timer > 0) return;
timer = cooldownTime;
player.curHealth -= 1;
}
现在,每cooldownTime
秒就会降低玩家的生命值1
。
一般来说,特别是对于多个敌人,我个人宁愿让玩家在最后一次命中后控制计时器,这样玩家本身就有了无敌的时间。敌人可以像往常一样简单地攻击,但玩家自己决定伤害是否算数。