C# 让玩家使用固定的生命值?
嘿,我想让我的玩家不受伤害,当他受到伤害并失去生命时。ATM我不能让我的玩家无敌,而且如果他与多个伤害结构相撞,他会受到比预期更大的伤害。我希望他损失20%的生命值,然后在2-3秒内无敌 这是连接到我的损坏结构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
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;
}
}