【UnityEditor拡張】SkinnedMeshrendererのUpdateWhenOffscreenを一括で有効にする
2021-02-04 2021-02-24
どのような状況下でもちゃんと描画していたいキャラクターなどのモデルのSkinnedMeshrendererをポチポチ設定するのが面倒なので、それを解決するエディタ拡張メモ。
ちょっと書き換えたら別のことにも応用可能。
Env.
Unity2019.4.17f1
Method
早速ソースコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
#if UNITY_EDITOR using System.Collections.Generic; using UnityEditor; using UnityEngine; public class OffScreenUpdateSettings { [MenuItem("GameObject/[Enable] AllChildOffScreenUpdate", false, 40)] public static void EnableOffScreenUpdate() { foreach (SkinnedMeshRenderer smr in GetAllChildSkindMeshRenderer(Selection.activeGameObject)) { smr.updateWhenOffscreen = true; Debug.Log($"[EnableOffScreenUpdate] {smr.gameObject.name}"); } } [MenuItem("GameObject/[Disable] AllChildOffScreenUpdate", false, 41)] public static void DisableOffScreenUpdate() { foreach (SkinnedMeshRenderer smr in GetAllChildSkindMeshRenderer(Selection.activeGameObject)) { smr.updateWhenOffscreen = false; Debug.Log($"[DisableOffScreenUpdate] {smr.gameObject.name}"); } } public static List<SkinnedMeshRenderer> GetAllChildSkindMeshRenderer(GameObject obj) { List<SkinnedMeshRenderer> res = new List<SkinnedMeshRenderer>(); List<GameObject> allChild = new List<GameObject>(); GetChildren(obj, ref allChild); if (allChild.Count < 1) return res; Debug.Log(allChild.Count); foreach (var child in allChild) { SkinnedMeshRenderer smr; if (child.TryGetComponent<SkinnedMeshRenderer>(out smr)) res.Add(smr); } return res; } public static void GetChildren(GameObject obj, ref List<GameObject> allChildren) { Transform children = obj.GetComponentInChildren<Transform>(); if (children.childCount < 1) return; foreach (Transform ob in children) { allChildren.Add(ob.gameObject); GetChildren(ob.gameObject, ref allChildren); } } } #endif |
使い方は親オブジェクトを選択右クリックして、メニューからEnableとDisableを選択。
子オブジェクトに含まれるSkinnedMeshRendererのUpdateWhenOffscreenのtrue、falseを変更してくれる。