【问题标题】:Make player use fixed amount of health?让玩家使用固定的生命值?
【发布时间】:2019-04-18 12:29:59
【问题描述】:

嘿,当我的玩家受到伤害并失去生命值时,我想让他无敌。 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;
            }

        }
    }

这是给我小时候贴在我“空心”上的画布上的 FullHearts

  using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;

public class HealthBarScript : MonoBehaviour {


    Image FullHearts;
    float maxHealth = 100f;
    public static float health;
    // Use this for initialization
    void Start () {
        FullHearts = GetComponent<Image>();
        health = maxHealth;
    }

    // Update is called once per frame
    void Update () {
        FullHearts.fillAmount = health / maxHealth;
        if (health == 0)
        {
            Application.LoadLevel(Application.loadedLevel);
        }
    }
}

ATM 我在我的 playerscript 上有这个,它不工作所有其他脚本都在工作,但只需要它只需要失去一颗心,无论玩家是否击中多个结构,然后无敌有时间恢复而不击中结构:

  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
                new WaitForSeconds(3);
                invincible = false; // makes this whole function reusable since invincible is false again
            }


        }

【问题讨论】:

  • 胡乱猜测,应该是“yield return new WaitForSeconds(3);”吗?
  • 但是我需要一个协程,因为它只是一个布尔值,所以我必须让它做一些事情,这样播放器就不会被某种方式损坏,但我想因为我让这个函数不可用,所以它会是无敌的或?所以也许我会尝试协程:D
  • 现在怎么样了,它会做到以下几点:1)让玩家无敌。 2)立即创建一个代表(只是代表,它自己不做任何事情!)等待三秒钟的对象。 3) 立即使玩家能够再次受到伤害。 4) 继续其他任务

标签: c# unity3d 2d


【解决方案1】:

所以我只是使用您提供的方法制作了一个简单的碰撞“游戏”,一切正常。但是现在,当我进一步观察时,我发现您提供的内容有些冗余,并且您的“答案”有点令人困惑。

但是您的第一个脚本显示,每次伤害经销商与“玩家”碰撞时都会造成伤害。

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

        }

并且每次“玩家”与“敌人”发生碰撞时,它都会进行一次无敌检查,这应该是有效的。 (假设删除了 cmets)。但就 cmets 而言,“玩家”击中损坏结构不会造成伤害,但总是(无论无敌)结构对玩家造成伤害。

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 应该是你最好的朋友。

【讨论】:

  • 好吧,我会尝试,但是如果它击中 3 个物体,你将如何只获得 20% 的生命值而不是 60% 的生命值?
  • 当我需要 Enemy 时,我已经标记了敌人,但现在我只需要确保它只能击中 20% = 1 颗心,他有 5 颗心,所以它会在每个生命中取出它们他失去了:D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 2016-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多