[Unity]ライフの残をUIで表示する方法

プレイヤーの残りをUIにイメージで表示したいことってありますよね
アイコンを表示することで残りを表すのですが、「ライフアイコンを表示する」メソッドにすることで汎用性を持たせることができます

実行結果

上矢印キーでアイコンが増えます
下矢印キーでアイコンが減ります

シーンの構成

スクリプト

using UnityEngine;

public class IconController : MonoBehaviour
{
    [SerializeField]
    GameObject[] icon;

    int num = 0;

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            num++;
            ShowIcon(num);
        }
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            num--;
            ShowIcon(num);
        }
    }

    void ShowIcon(int number)
    {
        for (int i = 0; i < icon.Length; i++)
        {
            icon[i].SetActive(false);
        }

        for (int i = 0; i < number; i++)
        {
            icon[i].SetActive(true);
        }
    }
}

ShowIconメソッドの別の形

void ShowIcon(int number)
{
    for (int i = 0; i < icon.Length; i++)
    {
        if (i < number)
        {
            icon[i].SetActive(true);
        }
        else
        {
            icon[i].SetActive(false);
        }
    }
}

ここまでは不要ですが、参考のため(for文とcontinueの関係)

void ShowIcon(int number)
{
    for (int i = 0; i < icon.Length; i++)
    {
        if (i < number)
        {
            icon[i].SetActive(true);
            continue;
        }

        icon[i].SetActive(false);
    }
}

ここまでは不要ですが、参考のため(三項演算子)

void ShowIcon(int number)
{
    for (int i = 0; i < icon.Length; i++)
    {
        icon[i].SetActive(i < number ? true : false);
    }
}

ここまでは不要ですが、参考のため(三項演算子も省略)

void ShowIcon(int number)
{
    for (int i = 0; i < icon.Length; i++)
    {
        icon[i].SetActive(i < value);
    }
}

ShowIconメソッドの引数が範囲を超えた場合、アクセスするとエラーになるので次のコードをメソッドの最初に追加すればいいでしょう

if (number < 0 || number > icon.Length)
{
    return;
}

C#プロパティを使ったエラー制御されたコード

using UnityEngine;

public class IconController : MonoBehaviour
{
    [SerializeField]
    GameObject[] icon;

    int icons;

    public int Icons
    {
        get => icons;
        set
        {
            if (value < 0 || value > icon.Length)
            {
                return;
            }

            icons = value;

            for (int i = 0; i < icon.Length; i++)
            {
                icon[i].SetActive(i < value ? true : false);
            }
        }
    }

    void Update()
    {
        if (Input.GetKeyDown(KeyCode.UpArrow))
        {
            Icons++;
        }
        if (Input.GetKeyDown(KeyCode.DownArrow))
        {
            Icons--;
        }

        if (Input.GetKeyDown(KeyCode.H))
        {
            Debug.Log(Icons);
        }
    }
}

C#,Unity

Posted by hidepon