Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/unity3d/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unity3d Can';我不知道如何阻止僵尸在不再与玩家碰撞时造成伤害_Unity3d - Fatal编程技术网

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相当陌生,所以我不太了解了解如何根据文档修复它。