【问题标题】:Why does my player health not change when I want it to为什么我的玩家健康在我想要的时候没有改变
【发布时间】:2021-05-12 19:57:41
【问题描述】:

在我的游戏中,我有一个有生命值的玩家,我目前正在尝试添加一个生命值条,但我的一个问题是当我的玩家失去生命值时,我的生命值条不会改变。在我的脚本中,更新健康栏的脚本链接到我的健康脚本,但是当我的玩家失去 hp 时,玩家的 hp 在健康栏中不会改变,我不确定为什么。我知道玩家确实会失去 hp,所以问题是即使脚本被链接,hp 在单独的脚本上也不会改变。我的健康栏的脚本:

抱歉,如果代码不好,我是一个菜鸟程序员。

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

public class HealthBArScript : Health
{   

    private void Update()
    {     
        transform.localScale = new Vector3(healthPoints / 100, 1.0f, 1.0f);
    }

}

如果有必要,我的健康脚本:

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

public class Health : MonoBehaviour
{   
    public float healthPoints = 100.0f; 
    private Coroutine onHit = null;

    private void Update()
    {
        StartCoroutine(Updaate());      
    }

    IEnumerator Updaate()
    {       
        if (healthPoints <= 0)
        {
            Destroy(gameObject);
        }

        if (healthPoints >= 101.0f)
        {
            healthPoints = 100.0f;
        }

        yield return new WaitForSeconds(2.0f);
    }
    
    private void OnTriggerEnter(Collider coll)
    {
        if (coll.gameObject.tag == "Zombie")
        {
            if (onHit == null)
                onHit = StartCoroutine(HitDelay());
        }

        if(coll.gameObject.tag == "Health")
        {
            healthPoints = healthPoints + 10; 
        }

        if (coll.gameObject.tag == "Health_1")
        {
            healthPoints = 100.0f;
        }
    }

    IEnumerator HitDelay()
    {
        healthPoints = healthPoints - 25;
        yield return new WaitForSeconds(2.0f);
        onHit = null;
    }   

}


【问题讨论】:

  • 那么健康栏脚本在健康栏上?健康栏如何知道玩家的健康状况?我想你可能混淆了继承和引用。
  • @hijinxbassist 我相信这是继承,但我不确定。我不记得它到底是什么,但我能解释它的最好方法是我使用Health 而不是MonoBehaviour。我认为这是继承,但我不确定
  • 是的,那部分是继承。如果我错了,请纠正我。我假设您在某种 UI 元素上有 HealthBarScript。然后,您的播放器对象上有 Health 脚本。这是正确的吗?
  • @hijinxbassist 是的,这是正确的
  • 好的。所以你确实混淆了继承和引用。引用是指某事的特定实例,即。健康。场景中可以有任意数量的 Health 脚本,您需要在播放器对象上引用其中的一个。让我举个简单的例子,1 分钟。

标签: c# visual-studio unity3d variables


【解决方案1】:

让我告诉你一些关于统一编程的基本知识,以及为什么有些事情没有多大意义。

1.- Monobehaviour 类是当您需要处理场景中相同的游戏对象行为时需要继承的类。这可以附加到编辑器中的游戏对象,以编程游戏对象的常见行为,如位置、旋转等。这就是为什么该类包含用于此的方法,Start()Update() 等。

2.- 继承使您的类类型包含父类(您继承自的类)的所有功能以及您在子类中添加的新功能。除非您需要一个使用Health 的部分或全部方法/属性的类,否则您不需要从它继承。所以public class HealthBArScript : Health 没有多大意义。继承意味着保留所有父功能以及一些专门的新功能。

检查任何简单的继承example 以获得重点。

3.- Update() 每帧调用一次,因此每秒大约调用 60 次。这就是为什么在更新中一次又一次地设置比例:

private void Update()
{     
    transform.localScale = new Vector3(healthPoints / 100, 1.0f, 1.0f);
}

没有多大意义。您可以在编辑器、Transform 组件或相应 Monobehaviour 组件的 Start() 方法中进行设置,以防您可能需要一些逻辑。

4.- 关于协程,你不需要协程来做你正在做的事情。您可以阅读documentation。 此外,您正在 Update()

中启动协程
private void Update()
{
    StartCoroutine(Updaate());      
}

这可能会导致您的游戏崩溃或出现意外情况。我会开始在Update() 和单体方法中尽可能简单地处理我的代码,当需要时你可以探索协程的使用,因为它们必须小心使用。

最后:

你的玩家和你的治疗条似乎需要是从 Monobehaviour 继承的两个不同的类。这很容易,因为不同类型的游戏对象通常需要它们备用的单一行为继承类,而事情保持简单。然后你需要沟通这两个类,以便当玩家失去生命值时,你的治疗条会减少某些显示的数量。当然,通过任何小教程,您都可以达到这一点。

【讨论】:

    【解决方案2】:

    您想要做的不是让您的健康栏继承健康脚本。继承将允许您扩展类,这不是您想要在这里做的。相反,您希望从健康栏脚本中引用 Health 类的实例。

    将生命值放在需要生命值的游戏对象上。玩家、敌人等

    public class Health : MonoBehaviour
    {
        // The actual health value
        //
        public float healthPoints;
    }
    

    并将健康栏放在您的 UI 元素上:

    public class HealthBar : MonoBehaviour
    {
        // A reference to the Health we want to display
        //
        public Health trackedHealth;
    
        void Update()
        {
            transform.localScale = new Vector3(trackedHealth.healthPoints / 100, 1, 1);
        }
    }
    

    从检查器中,您可以将带有运行状况脚本的对象拖到运行状况栏脚本的 trackedHealth 变量上。它现在有一个将要显示的生命值的引用。

    在 Update 中缩放转换现在就足够了,但考虑从 update 中移除这些不常见的更改。不过,对于快速测试和学习来说,这完全没问题。

    【讨论】:

    • 谢谢你成功了。我为此工作了很长时间
    • 没问题,很高兴我能提供帮助。坚持下去,这是一条艰难的道路,但很好的骑行
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多