为什么我的球员健康状况在我想要的时候没有改变



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

如果代码不好,我深表歉意。我是一名noob程序员。

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;
}   
}

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

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

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

请查看任何简单的继承示例以了解要点。

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

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

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

4.-关于协同活动,你不需要为你正在做的事情协同活动。您可以阅读文档。此外,您正在Update()中启动一个corroutine

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

这可能会破坏你的游戏或其他意想不到的事情。我会开始在Update()和monoheiour方法中尽可能简单地处理我的代码,当需要时,你可以探索协程的使用,因为它们必须小心使用。

最后:

你的玩家和你的治疗者似乎需要是两个不同的类,继承自Monopahavior。这很容易,因为不同类型的游戏对象通常需要它们多余的单一行为继承类,而事情保持简单。然后你需要将这两个职业联系起来,这样当玩家失去生命值时,你的治疗棒会在某些显示中减少数量。当然,通过任何一个小教程,你都可以达到这一点。

您想要做的是不要让您的健康条继承健康脚本。继承将允许您扩展类,这不是您在这里想要做的。相反,您希望从健康栏脚本中引用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);
}
}

您将从检查器中将带有运行状况脚本的对象拖动到healthbar脚本的trackedHealth变量上。它现在有一个将显示的健康状况的参考。

现在,在Update中缩放转换就足够了,但考虑一下,对于这些不常见的更改,请不要进行更新。对于快速测试和学习来说,这是非常好的。

相关内容

最新更新