Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/317.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
C# 让玩家使用固定的生命值?_C#_Unity3d_2d - Fatal编程技术网

C# 让玩家使用固定的生命值?

C# 让玩家使用固定的生命值?,c#,unity3d,2d,C#,Unity3d,2d,嘿,我想让我的玩家不受伤害,当他受到伤害并失去生命时。ATM我不能让我的玩家无敌,而且如果他与多个伤害结构相撞,他会受到比预期更大的伤害。我希望他损失20%的生命值,然后在2-3秒内无敌 这是连接到我的损坏结构 using System.Collections; using System.Collections.Generic; using UnityEngine; public class LoseHealth : MonoBehaviour { private

嘿,我想让我的玩家不受伤害,当他受到伤害并失去生命时。ATM我不能让我的玩家无敌,而且如果他与多个伤害结构相撞,他会受到比预期更大的伤害。我希望他损失20%的生命值,然后在2-3秒内无敌

这是连接到我的损坏结构

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

    public class LoseHealth : MonoBehaviour {



       private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.CompareTag("Player"))
            {
                HealthBarScript.health -= 20f;
            }

        }
    }
这是写给画布上的我的完整的心,作为一个孩子附在我的“空心”上


所以我用你提供的方法做了一个简单的碰撞“游戏”,一切都很好。但现在,当我进一步看的时候,我发现你提供的内容有些冗余,你的“答案”有点让人困惑

但是你的第一个脚本显示,每次伤害制造者与“玩家”碰撞时,它都会造成伤害

private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.CompareTag("Player"))
            {
                HealthBarScript.health -= 20f;
            }

        }
每次“玩家”与“敌人”碰撞时,它都会进行一次无敌检查,这应该是有效的。(假设删除了注释)。但如评论所示,“玩家”击中伤害结构不会造成伤害,但总是(无论无敌)从结构对玩家造成伤害

if (!invincible)
    {
        if (col.gameObject.tag == "enemy")
        {
            // HealthBarScript.health -= 20f;
            // health -= 20; // subtract 1 form your total health
            invincible = true; // makes this whole function unusable since invincible is no longer false
            StartCoroutine(Invincible());                   // makes this whole function reusable since invincible is false again
        }


    }
}


IEnumerator Invincible()
{
    if (invincible == true)


    {
        yield return new WaitForSeconds(2);
        {


            invincible = false;
        }
    }
但是当你在无敌检查到期前再次命中时,敌人的脚本仍然会造成伤害

你有两个脚本造成伤害,只有一个脚本进行无敌检查

摆脱结构上的破坏性脚本,正确标记所有结构,在玩家身上评论脚本,你就可以开始了。或者,你可以将脚本保存在伤害结构上,让每个人通过使bool保持静止来检查玩家是否无敌


此外,您还可以使用Debug.Log的标准用法(“到底发生了什么”)轻松回答自己的问题。Debug.Log应该是你最好的朋友

只是一个粗略的猜测,应该是“返回新的WaitForSeconds(3);”?但是我需要一个协同程序,因为它只是一个bool,我必须让它做一些事情,这样玩家就不会受到损害,但我猜,因为我使该功能不可用,它将是不可侵犯的还是?因此,也许我会尝试一个协同程序:现在,它将做以下事情:1)使玩家无敌。2) 立即创建一个表示(仅表示,它自己不做任何事情!)的对象,等待三秒钟。3) 立即使玩家能够再次受到伤害。4) 继续其他任务好吧,我会试试,但是如果它击中3个物体,你怎么能只获得20%的生命值,而不是60%的生命值呢?我成功了,在我需要敌人的时候标记了敌人,但现在我只需要确保它只能击中20%=1颗心脏,他显示了5颗心脏,所以在他失去的每一个生命中都会取出它们:D
private void OnTriggerEnter2D(Collider2D collision)
        {
            if (collision.CompareTag("Player"))
            {
                HealthBarScript.health -= 20f;
            }

        }
if (!invincible)
    {
        if (col.gameObject.tag == "enemy")
        {
            // HealthBarScript.health -= 20f;
            // health -= 20; // subtract 1 form your total health
            invincible = true; // makes this whole function unusable since invincible is no longer false
            StartCoroutine(Invincible());                   // makes this whole function reusable since invincible is false again
        }


    }
}


IEnumerator Invincible()
{
    if (invincible == true)


    {
        yield return new WaitForSeconds(2);
        {


            invincible = false;
        }
    }