【Unity】レンダラーを切って表示をON/OFF
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];
}
}
}