【Unity】レンダラーを切って表示をON/OFF

DEVELOP, Unity

SetActiveはコストが高いので描画だけを切りたい、そんな時に。

サンプルコード

// 表示設定。
private Renderer[] rendererArray;
private bool[] prevRendererEnableArray;
UnityEngine.UI.Image[] imageArray;
private bool[] prevImageEnableArray;
UnityEngine.UI.Text[] textArray;
private bool[] prevTextEnableArray;
TMP_Text[] textMeshProArray;
private bool[] prevTextMeshProArrayEnableArray;
 
/// <summary>
/// 非表示。
/// </summary>
protected void HideStore()
{
    rendererArray = gameObject.GetComponentsInChildren<Renderer>(true);
    prevRendererEnableArray = rendererArray.Select(x => x.enabled).ToArray();
    foreach (Renderer n in rendererArray)
    {
        n.enabled = false;
    }
 
    imageArray = gameObject.GetComponentsInChildren<UnityEngine.UI.Image>(true);
    prevImageEnableArray = imageArray.Select(x => x.enabled).ToArray();
    foreach (var n in imageArray)
    {
        n.enabled = false;
    }
    textArray = gameObject.GetComponentsInChildren<UnityEngine.UI.Text>(true);
    prevTextEnableArray = textArray.Select(x => x.enabled).ToArray();
    foreach (UnityEngine.UI.Text n in textArray)
    {
        n.enabled = false;
    }
    textMeshProArray = gameObject.GetComponentsInChildren<TMP_Text>(true);
    prevTextMeshProArrayEnableArray = textMeshProArray.Select(x => x.enabled).ToArray();
    foreach (var n in textMeshProArray)
    {
        n.enabled = false;
    }
}
 
/// <summary>
/// 表示(非表示にした時のバックアップを元に復元)
/// </summary>
protected void ShowRestore()
{
    for (int ii = 0; ii < rendererArray.Length; ii++)
    {
        // バックアップした時に enabled false でも途中で true へ変更がかかっているなら復元しない。
        if (rendererArray[ii].enabled == false)
        {
            rendererArray[ii].enabled = prevRendererEnableArray[ii];
        }
    }
    for (int ii = 0; ii < imageArray.Length; ii++)
    {
        // バックアップした時に enabled false でも途中で true へ変更がかかっているなら復元しない。
        if (imageArray[ii].enabled == false)
        {
            imageArray[ii].enabled = prevImageEnableArray[ii];
        }
    }
    for (int ii = 0; ii < textArray.Length; ii++)
    {
        // バックアップした時に enabled false でも途中で true へ変更がかかっているなら復元しない。
        if (textArray[ii].enabled == false)
        {
            textArray[ii].enabled = prevTextEnableArray[ii];
        }
    }
    for (int ii = 0; ii < textMeshProArray.Length; ii++)
    {
        // バックアップした時に enabled false でも途中で true へ変更がかかっているなら復元しない。
        if (textMeshProArray[ii].enabled == false)
        {
            textMeshProArray[ii].enabled = prevTextMeshProArrayEnableArray[ii];
        }
    }
}

Posted by kazupon