健康栏与健康代码脚本同步

时间:2019-05-24 15:14:56

标签: c# unity3d

我使用健康栏和脚本创建了一个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;
    }
}

2 个答案:

答案 0 :(得分:2)

我看到两个问题。

  1. 玩家受到伤害时,不会调用您的方法UpdateHealthBar。一种解决方案是在DamagePlayer方法的末尾调用该方法。 (请注意,Update会像当前所写的那样在每个帧中被调用,而UpdateHealthBar不会被调用。)

  2. 此外,您似乎正在使用两个变量来跟踪玩家的健康状况:hitpointcurrentHealth。两者有什么区别?你们都需要吗?当前,hitpoint方法中使用了UpdateHealthbar,而currentHealth方法中使用了DamagePlayer。您需要两种方法都对健康栏使用相同的变量,以准确反映玩家的健康。

答案 1 :(得分:0)

为您的球员健康使用ScriptableObject

this Unity BlogScriptableObject上有一篇很好的文章,描述了这种确切的困境。基本上,ScriptableObject是一种资产(也可以被实例化,在运行时创建),可以由多个组件使用,以便它们引用同一事物。您将在项目中创建此资产,并将其附加到播放器的运行状况脚本和播放器的UI脚本。当值在一个中更改时,它将在另一个中反映。附加值是您可以将关注点分开(并删除很多单例用例)。