Unity3d Can';我不知道如何阻止僵尸在不再与玩家碰撞时造成伤害
我正在创造一个自上而下的僵尸射手,我已经让僵尸在碰到玩家时对玩家造成伤害。然而,当玩家在受到伤害后从僵尸身上后退时,玩家的生命值将继续下降。如果您有任何关于如何解决此问题的想法,我们将不胜感激Unity3d Can';我不知道如何阻止僵尸在不再与玩家碰撞时造成伤害,unity3d,Unity3d,我正在创造一个自上而下的僵尸射手,我已经让僵尸在碰到玩家时对玩家造成伤害。然而,当玩家在受到伤害后从僵尸身上后退时,玩家的生命值将继续下降。如果您有任何关于如何解决此问题的想法,我们将不胜感激 public float moveSpeed= 5f; public Rigidbody2D rb; public Camera cam; public float playerHealth = 100; public float enemyDamage = 25; public GameObject
public float moveSpeed= 5f;
public Rigidbody2D rb;
public Camera cam;
public float playerHealth = 100;
public float enemyDamage = 25;
public GameObject gameOverScreen;
Vector2 movement;
Vector2 mousePos;
// Update is called once per frame
void Update()
{
movement.x = Input.GetAxisRaw("Horizontal");
movement.y = Input.GetAxisRaw("Vertical");
mousePos = cam.ScreenToWorldPoint(Input.mousePosition);
if(playerHealth == 0)
{
gameOverScreen.SetActive(true);
}
}
void FixedUpdate()
{
rb.MovePosition(rb.position + movement * moveSpeed * Time.fixedDeltaTime);
Vector2 lookDir = mousePos - rb.position;
float angle = Mathf.Atan2(lookDir.y, lookDir.x) * Mathf.Rad2Deg - 90f;
rb.rotation = angle;
}
void OnCollisionEnter2D(Collision2D collision)
{
if (collision.gameObject.CompareTag("Enemy"))
{
StartCoroutine(DamagePlayer());
}
else
{
StopCoroutine(DamagePlayer());
}
}
IEnumerator DamagePlayer()
{
while(true)
{
yield return new WaitForSeconds(1);
playerHealth -= enemyDamage;
}
}
首先,如果它不再发生碰撞,你应该使用 然后你可以用你使用它的方式
StopCoroutine(DamagePlayer());
或者,如果您想确定是否可以存储对例程的引用
专用协同程序;
空心OnCollisionInter2D(碰撞2D碰撞)
{
if(collision.gameObject.CompareTag(“敌人”))
{
if(例程==null)
{
例程=开始例程(DamagePlayer());
}
}
其他的
{
如果(例程!=null)StopCorroutine(例程);
}
}
专用空心OnCollisionInter2D(碰撞2D碰撞)
{
如果(例程!=null)StopCorroutine(例程);
}
或者使用bool标志终止它
private bool cancelRoutine=true;
空心OnCollisionInter2D(碰撞2D碰撞)
{
if(collision.gameObject.CompareTag(“敌人”))
{
if(cancelRoutine)routine=startcroutine(DamagePlayer());
}
其他的
{
cancelRoutine=true;
}
}
专用空心OnCollisionInter2D(碰撞2D碰撞)
{
cancelRoutine=true;
}
IEnumerator DamagePlayer()
{
cancelRoutine=false;
而(!取消例程)
{
返回新的WaitForSeconds(1);
玩家健康-=敌人伤害;
}
}
一般情况下,您可以通过直接使用like来解决这个问题,而无需使用例程
无效OnCollisionInter2D(碰撞2D碰撞)
{
if(collision.gameObject.CompareTag(“敌人”))
{
定时器=1;
}
}
无效碰撞Stay2D(碰撞2D碰撞)
{
if(collision.gameObject.CompareTag(“敌人”))
{
timer-=Time.deltaTime;
如果(计时器我建议你看看它是如何工作的。你不会以这种方式停止协同程序,这就是为什么玩家每秒都会失去健康。你需要一个IEnumerator变量
。如果你需要详细的答案,请告诉我。很抱歉打扰你,但你能向我解释一下吗?我对C相当陌生,所以我不太了解了解如何根据文档修复它。