UI canvas 索引

UI canvas Index

我有下面的脚本执行以下操作:

玩家开始时有 3 颗心 [0] 如果它受到伤害失去一颗心并将纹理更改为 2 颗心 1,如果他赢得一颗额外的心回到纹理 [0] .. 如果你只有一颗心 [ 2] 并且受伤,游戏结束。

此代码完美运行,但我想将其转换为 UI Canvas 图像。我该怎么做?

using UnityEngine;
using System.Collections;

public class Hearts : MonoBehaviour {

    public Texture2D[]initialHeart;
    private int hearts;
    private int currentHearts;
    // Use this for initialization

    void Start () {
        GetComponent<GUITexture>().texture = initialHeart[0];
        hearts = initialHeart.Length;
    }

    // Update is called once per frame
    void Update () {
    }

    public bool TakeHeart()
    {
        if (hearts < 0) {
            return false;
        }

        if (currentHearts < (hearts - 1)) {
            currentHearts += 1;
            GetComponent<GUITexture> ().texture = initialHeart [currentHearts];
            return true;
        } else {
            return false;
        }   
    }

    public bool AddHeart() {
        if (currentHearts > 0) {
            currentHearts -= 1;
            GetComponent<GUITexture> ().texture = initialHeart [currentHearts];
            return true;
        } else {
            return false;
        }
    }
}

编辑:

看看发生了什么:

在对象检查器中,HealthBar 我将 3 个心作为图像(附上第一张图像)。但是当我进入脚本并尝试 select 根据用户的进度更改图像时,不允许仅使用图像、对象(附上第二个图像)。

1。将 Texture2D 更改为 Sprite

2.然后把GetComponent<GUITexture>().texture = initialHeart[0];改成GetComponent<Image>().sprite = initialHeart[0];

3.还有两个GetComponent<GUITexture> ().texture = initialHeart [currentHearts];GetComponent<Image>().sprite = initialHeart[currentHearts];

注意:做GetComponent<GUITexture> ().textureGetComponent<Image>().sprite是不好的。如果您需要访问任何组件 多次 次,则需要 cache 次。这意味着您执行 GetComponent<Image>() 一次并将其保存到变量中。您现在可以多次使用该变量。我在您的另一个 questions/codes 中也注意到了这一点,因此决定是时候告诉您了。看一下下面的代码以加深对它的理解。代码未经测试,但可以编译。

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

public class Hearts : MonoBehaviour
{

    public Sprite[] initialHeart;
    private int hearts;
    private int currentHearts;
    // Use this for initialization

    //Used for chaching Image so that you won't be doing GetComponent<Image>(); each time
    Image heartImage;


    void Start()
    {
        //Cache the Image once so that you won't be doing GetComponent<Image>(); each time
        heartImage = GetComponent<Image>();
        heartImage.sprite = initialHeart[0];
        hearts = initialHeart.Length;

    }

    // Update is called once per frame
    void Update()
    {

    }

    public bool TakeHeart()
    {
        if (hearts < 0)
        {
            return false;
        }

        if (currentHearts < (hearts - 1))
        {

            currentHearts += 1;
            heartImage.sprite = initialHeart[currentHearts];
            return true;


        }
        else
        {

            return false;

        }
    }



    public bool AddHeart()
    {

        if (currentHearts > 0)
        {
            currentHearts -= 1;
            heartImage.sprite = initialHeart[currentHearts];
            return true;
        }
        else
        {
            return false;

        }
    }
}

编辑:我将 initialHeartImage 更改为 Sprite 以便您可以直接放置 Sprite。不要忘记从该脚本将附加到的 GameObject 中删除 GUITexture。还要确保您附加此脚本的 GameObject 附加了 Image。否则,GetComponent<Image>(); 将失败。