我使用健康栏和脚本创建了一个UI图像,但是当我的玩家受到攻击时,健康栏的图像不会改变,只是在检查器中,健康会显示损坏的变化。当播放器受到攻击时,如何更改UI图像健康栏?我需要更改脚本中的某些内容吗?
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class HealthBar : MonoBehaviour
{
public static HealthBar singleton;
public Image currentHealthbar;
public Text ratioText;
public float currentHealth;
public float maxHealth = 100f;
public bool isDead = false;
public bool isGameOver = false;
public GameObject gameOverText;
private void Awake()
{
singleton = this;
}
// Start is called before the first frame update
private void Start()
{
currentHealth = maxHealth;
UpdateHealthbar();
}
// Update is called once per frame
private void UpdateHealthbar()
{
float ratio = currentHealth/ maxHealth;
currentHealthbar.rectTransform.localScale = new Vector3(ratio, 1, 1);
ratioText.text = (ratio * 100).ToString("0") + '%' ;
}
void Update()
{
if(currentHealth < 0)
{
currentHealth = 0;
}
}
public void DamagePlayer(float damage)
{
if(currentHealth > 0)
{
currentHealth -= damage;
}
else
{
Dead();
if (isGameOver && Input.GetMouseButtonDown(0))
{
SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex);
}
}
UpdateHealthbar();
}
void Dead()
{
currentHealth = 0;
isDead = true;
Debug.Log("Player is dead");
gameOverText.SetActive(true);
isGameOver = true;
}
}
答案 0 :(得分:2)
我看到两个问题。
玩家受到伤害时,不会调用您的方法UpdateHealthBar
。一种解决方案是在DamagePlayer
方法的末尾调用该方法。 (请注意,Update
会像当前所写的那样在每个帧中被调用,而UpdateHealthBar
不会被调用。)
此外,您似乎正在使用两个变量来跟踪玩家的健康状况:hitpoint
和currentHealth
。两者有什么区别?你们都需要吗?当前,hitpoint
方法中使用了UpdateHealthbar
,而currentHealth
方法中使用了DamagePlayer
。您需要两种方法都对健康栏使用相同的变量,以准确反映玩家的健康。
答案 1 :(得分:0)
ScriptableObject
在this Unity Blog的ScriptableObject
上有一篇很好的文章,描述了这种确切的困境。基本上,ScriptableObject
是一种资产(也可以被实例化,在运行时创建),可以由多个组件使用,以便它们引用同一事物。您将在项目中创建此资产,并将其附加到播放器的运行状况脚本和播放器的UI脚本。当值在一个中更改时,它将在另一个中反映。附加值是您可以将关注点分开(并删除很多单例用例)。