うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】GameObject の Active を切り替えるときに 変更があったときだけ切り替えるようにすると無駄がないか検証

GameObject の アクティブを切りかえる際に gameObject.SetActive(enable); で切り替えると思いますが
Active が true な GameObject に対して SetActive(true) をしても意味はありません

そのため 異なってなくても呼び出した場合と、異なっていた場合のみ SetActive() を呼び出した場合の時間を見てみます

// 1万回ループして 10回に1回切り替える
for (int i = 0; i < 10000; i++)
{
    target.SetActive(enable);
    if (i % 10 == 0)
    {
        enable = !enable;
    }
}

コンポーネントは以下

f:id:hacchi_man:20200829022301p:plain:w200

結果

ほとんど変化が無かった・・・

常に呼び出す場合

f:id:hacchi_man:20200829021800p:plain:w200

異なった際のみ呼び出す場合

f:id:hacchi_man:20200829022240p:plain:w200

大量にコンポーネントをつけてみた

むしろ異なったときのみ呼び出す場合は遅くなるという

常に呼び出す場合

f:id:hacchi_man:20200829022601p:plain:w200

異なった際のみ呼び出す場合

f:id:hacchi_man:20200829022455p:plain:w200

結論

大量にコンポーネントがある場合チェック処理を入れると遅くなったので
拡張等せず普通に SetActive を呼び出したほうがよさそう

※UnityEditor上での検証なので実機だと変わるかもしれませんが