🫥

【Unity】CanvasRendererに秘められし能力

2024/06/28に公開

はじめに

こんにちは、UnityでUIを作っているときに何気なしに付いているCanvasRendererというコンポーネントありますよね。

私はuGUIの内部で何か使われてるんだろうな~知らんけど、みたいな感じでスルーしていましたが、
何やら便利そうな機能が備わっていたのを発見したので紹介いたします📝

色の調整機能

CanvasRendererにはSetColorという関数が定義されています。

こちらで色を指定すると、なんと表示物の色に乗算して色を変更してくれます!
なので、Image等の色情報を書き換えずにグレーアウトしたり、透明度を調整したりすることが可能になります。

身近なところだと、ButtonコンポーネントのColorTintがこちらの機能を使っているようですね~
(Graphic.CrossFadeColor経由で使われています)

ちなみにSetAlpha関数も存在しておりますが、内部ではSetColorをしているだけっぽいので透明度のみを設定できるショートカット版という感じでした。

また、シリアライズされた変数ではないので、標準ではインスペクタやアニメータで設定することはできないですが、以下のようにスクリプトを作ることで対応可能になります。

CanvasRendererModifier.cs
using UnityEngine;

[RequireComponent(typeof(CanvasRenderer))]
[ExecuteAlways]
public class CanvasRendererModifier : MonoBehaviour
{
    [SerializeField]
    private Color _color;

    private CanvasRenderer _canvasRenderer;

    private void Awake()
    {
        ApplyColor();
    }

    private void ApplyColor()
    {
        if (_canvasRenderer != null || TryGetComponent(out _canvasRenderer))
            _canvasRenderer.SetColor(_color);
    }

    private void OnDidApplyAnimationProperties()
    {
        ApplyColor();
    }

#if UNITY_EDITOR
    private void OnValidate()
    {
        ApplyColor();
    }
#endif
}

キャンバス内での表示順番を知る

absoluteDepthやrelativeDepthが存在しており、自身が何番目に描画される要素なのかを知ることが可能です。

absoluteDepth

このプロパティは自身の表示対象となるCanvas内での表示順番を取得できます。
表示優先度の強さ的なものなので知っておくと何かで便利に使えることがありそうですね👀

サブCanvasのOverrideSortingがONであれば別枠扱いで番号が振られます。

relativeDepth

このプロパティは直近の親Canvas基準での表示順番を取得できます。
こちらはサブCanvasのOverrideSortingに関係なく区別される

おわりに

紹介したもの以外にもいくつか機能があるようなので興味があれば調べてみてくださいね 🤗
https://docs.unity3d.com/ja/2023.2/ScriptReference/CanvasRenderer.html

Discussion