ボタンなどで使える、子要素のアルファ値を全て変更する拡張メソッド

ボタンオブジェクトの子要素にテキストやアイコン画像があったりして、それら全てを変更したいとき、普通にやると少し面倒な処理記述になってしまいます。

そもそも何かのアルファ値を変えるだけでも、以下のような記述が必要です。

var color = image.color;
color.a = 0.2f; // アルファ値を0.2fに変更
image.color = color;

これをもっと簡単に記述できるような拡張メソッドを作りました。

作成した拡張メソッド

ColorUtilities.cs

using UnityEngine;
using UnityEngine.UI;

public static class ColorUtilities
{
    public static void SetAlpha(this SpriteRenderer spriteRenderer, float alpha)
    {
        var color = spriteRenderer.color;
        color.a = alpha;
        spriteRenderer.color = color;
    }

    public static void SetAlpha(this Graphic graphic, float alpha)
    {
        var color = graphic.color;
        color.a = alpha;
        graphic.color = color;
    }

    public static void SetAlphasInChildren(this GameObject obj, float alpha)
    {
        var spriteRenderers = obj.GetComponentsInChildren();
        var graphics = obj.GetComponentsInChildren();

        if (spriteRenderers != null)
        {
            foreach (var spriteRenderer in spriteRenderers)
            {
                spriteRenderer.SetAlpha(alpha);
            }
        }

        if (graphics != null)
        {
            foreach (var graphic in graphics)
            {
                graphic.SetAlpha(alpha);
            }
        }
    }
}

使い方

上記ColorUtilities.csを保存し、アルファ値を変えたい場面で以下のように記述します。

SpriteRenderer spriteRenderer;
Image image;
TextMeshProUGUI text;

void Sample(){
    spriteRenderer.SetAlpha(0.2f); // spriteRendererのアルファ値を0.2fに変更
    image.SetAlpha(1f); // imageのアルファ値を1f(不透明)に変更
    text.SetAlpha(0f); // textのアルファ値を0f(透明)に変更
}

また、あるGameObjectの自身を含む子要素全てに特定のアルファ値を指定したい場合。

想定ケースとしては冒頭にも述べたように、
ButtonとImageが付いているオブジェクトの子要素にTextMeshProや別のImageが付いているオブジェクトがあり、全てのアルファ値を一斉に変更したい場合
などを想定しています。

void Sample(){
    gameObject.SetAlphasInChildren(0.2f); // gameObjectとその子オブジェクトのアルファ値を0.2fに変更
}

初めて知ったこと

ImageやTextMeshProはGraphicというものにまとめられるようです。

新たな知見。

コメント