ãã®èšäºã§ã¯ãããŸããŸãªãã£ãã·ã¥ãªãã·ã§ã³ããããã®éèªæãªæ©èœããã³ããã©ãŒãã³ã¹ã«ã€ããŠèª¬æããŸãã
äž»ã«ãå éšããã£ãã·ã³ã°ãã€ãŸããå éšã®ããŒãºã«å¿ããŠçŸåšã®ãªããžã§ã¯ãäžã«ããã³ã³ããŒãã³ããååŸããããšã«ã€ããŠèª¬æããããšã«æ³šæããŠãã ããã ãããããã€ã³ã¹ãã¯ã¿ãŒã§ã®äŸåé¢ä¿ã®çŽæ¥å²ãåœãŠãæåŠããŸããããã¯äœ¿çšããã«ã¯äžäŸ¿ã§ãããã¹ã¯ãªããã®èšå®ãè©°ãŸããããšãã£ã¿ãŒãã¯ã©ãã·ã¥ãããšãã«ãªã³ã¯ãå£ããå¯èœæ§ããããŸãã ãããã£ãŠãGetComponentïŒïŒã䜿çšããŸãã
åºæ¬çãªã³ã³ããŒãã³ãã®ç¥èãšç°¡åãªãã£ãã·ã¥ã®äŸ
Unity3Dã§ã¯ãã²ãŒã ã·ãŒã³äžã®ãã¹ãŠã®ãªããžã§ã¯ãã¯ããŸããŸãªã³ã³ããŒãã³ãïŒã³ã³ããŒãã³ãïŒã®ã³ã³ãããŒïŒGameObjectïŒã§ããããšã³ãžã³ïŒTransformãAudioSourceãªã©ïŒãŸãã¯ãŠãŒã¶ãŒã¹ã¯ãªããïŒMonoBehaviourïŒã«çµã¿èŸŒãããšãã§ããŸãã
ã³ã³ããŒãã³ãã¯ãšãã£ã¿ãŒã§çŽæ¥å²ãåœãŠãããšãã§ããGetComponentïŒïŒã¡ãœããã䜿çšããŠãã¹ã¯ãªããå ã®ã³ã³ãããŒããã³ã³ããŒãã³ããååŸããŸãã
ã³ã³ããŒãã³ããè€æ°å䜿çšããå¿ èŠãããå ŽåãåŸæ¥ã®ã¢ãããŒãã§ã¯ã䜿çšããã¹ã¯ãªããã§ãã®å€æ°ã宣èšããå¿ èŠãªã³ã³ããŒãã³ãã1åååŸããŠãããååŸããå€ã䜿çšããŸãã äŸïŒ
ã³ã³ããŒãã³ãã¯ãšãã£ã¿ãŒã§çŽæ¥å²ãåœãŠãããšãã§ããGetComponentïŒïŒã¡ãœããã䜿çšããŠãã¹ã¯ãªããå ã®ã³ã³ãããŒããã³ã³ããŒãã³ããååŸããŸãã
ã³ã³ããŒãã³ããè€æ°å䜿çšããå¿ èŠãããå ŽåãåŸæ¥ã®ã¢ãããŒãã§ã¯ã䜿çšããã¹ã¯ãªããã§ãã®å€æ°ã宣èšããå¿ èŠãªã³ã³ããŒãã³ãã1åååŸããŠãããååŸããå€ã䜿çšããŸãã äŸïŒ
public class Example : MonoBehaviour { Rigidbody _rigidbody; void Start () { _rigidbody = GetComponent<Rigidbody>(); } void Update () { _rigidbody.AddForce(Vector3.up * Time.deltaTime); } }
åæãã£ãã·ã¥ã¯ã.transformã.renderãªã©ãGameObjectãæäŸããããã©ã«ãããããã£ã«ãé¢é£ããŠããŸãã ãããã«ã¢ã¯ã»ã¹ããã«ã¯ãæ瀺çãªãã£ãã·ã¥ãããã«é«éã«ãªããŸãïŒUnity 5ã®ã»ãšãã©ã¯éæšå¥šãšããŠããŒã¯ãããŠããããã䜿çšãæåŠããããšããå§ãããŸãïŒã
æãæçœãªãã£ãã·ã³ã°æ¹æ³ïŒã³ã³ããŒãã³ãã®çŽæ¥åä¿¡ïŒã¯ãäžè¬çãªå Žåã«æåã¯æãçç£çã§ãããä»ã®ãªãã·ã§ã³ã¯ããã䜿çšããã ãã§ãã³ã³ããŒãã³ããžã®ã¢ã¯ã»ã¹ã容æã«ãããããæ¯ååãã¿ã€ãã®ã³ãŒããèšè¿°ããããèŠæ±ã«å¿ããŠã³ã³ããŒãã³ããåä¿¡ãããããå¿ èŠããããŸããã
ãã£ãã·ã³ã°ã«ã€ããŠã®å°ãã¯ãã€ã³ãã§ã¯ãããŸãã
ãŸããéåžžã«é«äŸ¡ãªæäœïŒã¹ããŒãžäžã§ã®ãªããžã§ã¯ãã®äœæãåé€ãªã©ïŒããããã³ã³ããŒãã³ãã«æ³šæãæããã«ãã£ãã·ã¥ããããšã¯æéã®æµªè²»ã«ãªãããšã«ã泚æããŠãã ããã ããšãã°ãã²ãŒã ã«ã¯åŒŸäžžãçºå°ãããã·ã³ã¬ã³ãããããããããå¥åã®ãªããžã§ã¯ãã§ãïŒããèªäœã¯ééã£ãŠããŸãããããã¯çäœã®äŸã§ãïŒã ãªããžã§ã¯ãããã£ãã·ã¥ã³ã©ã€ããŒãããŒãã£ã¯ã«ã·ã¹ãã ãããã³ãã®äžã®ãã¹ãŠãäœæããŸããã匟䞞ã¯ç©ºã«é£ãã§3ç§åŸã«æ®ºããããããã®ã³ã³ããŒãã³ãã¯ãŸã£ãã䜿çšãããŸããã
ãããåé¿ããã«ã¯ããªããžã§ã¯ãããŒã«ã䜿çšããŸããHabrÃ©ïŒ 1ã2 ïŒã«ã¯ããã«é¢ããèšäºãããã æ¢æã®ãœãªã¥ãŒã·ã§ã³ããããŸãã ãã®å Žåããªããžã§ã¯ãã絶ããäœæããŠåé€ããããäœåºŠããã£ãã·ã¥ãããããããšã¯ãããŸããããããã¯åå©çšããããã£ãã·ã¥ã¯1åã ãçºçããŸãã
ãããåé¿ããã«ã¯ããªããžã§ã¯ãããŒã«ã䜿çšããŸããHabrÃ©ïŒ 1ã2 ïŒã«ã¯ããã«é¢ããèšäºãããã æ¢æã®ãœãªã¥ãŒã·ã§ã³ããããŸãã ãã®å Žåããªããžã§ã¯ãã絶ããäœæããŠåé€ããããäœåºŠããã£ãã·ã¥ãããããããšã¯ãããŸããããããã¯åå©çšããããã£ãã·ã¥ã¯1åã ãçºçããŸãã
説æãããã¹ãŠã®ãã£ãã·ã¥ãªãã·ã§ã³ã®ããã©ãŒãã³ã¹ããããããã£ãŒãã«è¡šç€ºãããŸãã
åºæ¬
GetComponentã¡ãœããã«ã¯ããã³ãã¬ãŒãGetComponentïŒïŒãšãè¿œå ã®ãã£ã¹ããå¿ èŠãªéåžžã®GetComponentïŒtypeïŒïŒcompãšããŠTïŒã®2ã€ã®çšéããããŸãã ããã©ãŒãã³ã¹æŠèŠãã£ãŒãã§ã¯ããããã®ãªãã·ã§ã³ã®äž¡æ¹ãèæ ®ãããŸããããã³ãã¬ãŒãã¡ãœããã®æ¹ã䜿ããããããšãèæ ®ãã䟡å€ããããŸãã åæ§ã®ãªãã·ã§ã³ãæã€GetComponentsã³ã³ããŒãã³ãã®ãªã¹ããååŸãããªãã·ã§ã³ãããããããããã§ãã¯ãããŸãã å³ã§ã¯ãåãã©ãããã©ãŒã ã§ã®GetComponentã®å®è¡æéã¯ãæ©åšã®æ©èœãå¹³æºåããããã«100ïŒ ãšã¿ãªãããŠããŸãããŸãããã䟿å©ãªã€ã³ã¿ã©ã¯ãã£ãããŒãžã§ã³ããããŸãã
ããããã£ã䜿çšãã
ãã£ãã·ã¥ã«ããããã£ã䜿çšã§ããŸãã ãã®ã¡ãœããã®å©ç¹ã¯ãããããã£ãæå¹ã«ãããšãã«ã®ã¿ãã£ãã·ã¥ãçºçãããã®ããããã£ã䜿çšããããšãã«ãã£ãã·ã¥ãçºçããªãããšã§ãã æ¬ ç¹ã¯ããã®å Žåãåãçš®é¡ã®ã³ãŒããããå€ãèšè¿°ããŠããããšã§ãã
æãç°¡åãªãªãã·ã§ã³ïŒ
Transform _transform = null; public Transform CachedTransform { get { if( !_transform ) { _transform = GetComponent<Transform>(); } return _transform; } }
ãã®ãªãã·ã§ã³ã¯ãã³ã³ããŒãã³ãããªãããšã確èªãããããããã©ãŒãã³ã¹ã®åé¡ããããŸãã
ïŒã³ã³ããŒãã³ããããã¯äœã§ããïŒ
Unity3Dã¯ã«ã¹ã¿ã æ¯èŒæŒç®åã䜿çšãããããã³ã³ããŒãã³ãïŒïŒïŒComponentïŒïŒããã£ãã·ã¥ãããŠãããã©ãããå®å
šã«ç¢ºèªãããšããšã³ãžã³ã¯å®éã«ãã€ãã£ãã³ãŒãã«ãªããŸããããã¯ãªãœãŒã¹ã倧éã«æ¶è²»ããããããã®èšäºã§è©³çŽ°ãèªãããšãã§ããŸãã
ãã®åé¡ã«ã¯2ã€ã®è§£æ±ºçããããŸãã
ãã£ãã·ã³ã°ãè¡ããããã©ããã瀺ãè¿œå ã®ãã©ã°ã䜿çšããŸãã
Transform _transform = null; bool _transformCached = false; public Transform CachedTransform { get { if( !_transformCached ) { _transformCached = true; _transform = GetComponent<Transform>(); } return _transform; } }
ã³ã³ããŒãã³ãããªããžã§ã¯ãã«æ瀺çã«ãã£ã¹ãããŸãã
Transform _transform = null; public Transform CachedTransform { get { if( (object)_transform == null ) { _transform = GetComponent<Transform>(); } return _transform; } }
ãã ãããã®ãªãã·ã§ã³ã¯ããªããžã§ã¯ãã®ã³ã³ããŒãã³ããåé€ãããªãå Žåã«ã®ã¿å®å šã§ããããšã«æ³šæããŠãã ããïŒéåžžã¯ãŸãã«çºçããŸãïŒã
Unityãç Žå£ããããªããžã§ã¯ãã«ã¢ã¯ã»ã¹ã§ããã®ã¯ãªãã§ããïŒ
äžèšã®ãªã³ã¯ã®èšäºããã®æç²ïŒ
ããã§ã®åé¡ã¯ããã€ãã£ãã³ãŒããžã®é«äŸ¡ãªåŒã³åºãããã€ãã¹ããããšã¯ã§ããŸãããåæã«ãªããžã§ã¯ãã®ååšã確èªããããã®ã«ã¹ã¿ã ãªãã¬ãŒã¿ãŒã奪ãããšã¯ã§ããŸããããªããžã§ã¯ããžã®ãã£ã¹ãã§ãã å®éã«ã¯ãªããžã§ã¯ããæ¢ã«ç Žæ£ãããŠããå Žåã§ããCïŒã©ãããŒã¯ååšãç¶ããããšãã§ããŸãã
ãGameObjectãã¿ã€ãã®acïŒãªããžã§ã¯ããååŸãããšãã»ãšãã©äœãå«ãŸããŠããŸããã ããã¯ãUnityãC / C ++ãšã³ãžã³ã§ããããã§ãã ãã®GameObjectã®å®éã®æ å ±ïŒååãã³ã³ããŒãã³ãã®ãªã¹ããHideFlagsãªã©ïŒã¯ãã¹ãŠc ++åŽã«ãããŸãã cïŒãªããžã§ã¯ãã«ããå¯äžã®ãã®ã¯ããã€ãã£ããªããžã§ã¯ããžã®ãã€ã³ã¿ã§ãã ãããã®cïŒãªããžã§ã¯ãããã©ãããŒãªããžã§ã¯ãããšåŒã³ãŸãã GameObjectãUnityEngine.Objectãã掟çããä»ã®ãã¹ãŠã®ãããªãããã®c ++ãªããžã§ã¯ãã®ã©ã€ãã¿ã€ã ã¯ãæ瀺çã«ç®¡çãããŸãã ãããã®ãªããžã§ã¯ãã¯ãæ°ããã·ãŒã³ãããŒããããšç Žæ£ãããŸãã ãŸãã¯ãObject.DestroyïŒmyObjectïŒãåŒã³åºããšã; ãããã«ã cïŒãªããžã§ã¯ãã®æå¹æéã¯ãã¬ããŒãžã³ã¬ã¯ã¿ãŒã䜿çšããŠcïŒæ¹æ³ã§ç®¡çãããŸãã ããã¯ãæ¢ã«ç Žå£ãããŠããc ++ãªããžã§ã¯ããã©ããããããŸã ååšããacïŒã©ãããŒãªããžã§ã¯ããæã€ããšãã§ããããšãæå³ããŸãã ãã®ãªããžã§ã¯ããnullãšæ¯èŒãããšãå®éã®cïŒå€æ°ãå®éã«ã¯nullã§ã¯ãªãå Žåã§ããã«ã¹ã¿ã ==æŒç®åã¯ãã®å Žåãtrueããè¿ããŸãã
ããã§ã®åé¡ã¯ããã€ãã£ãã³ãŒããžã®é«äŸ¡ãªåŒã³åºãããã€ãã¹ããããšã¯ã§ããŸãããåæã«ãªããžã§ã¯ãã®ååšã確èªããããã®ã«ã¹ã¿ã ãªãã¬ãŒã¿ãŒã奪ãããšã¯ã§ããŸããããªããžã§ã¯ããžã®ãã£ã¹ãã§ãã å®éã«ã¯ãªããžã§ã¯ããæ¢ã«ç Žæ£ãããŠããå Žåã§ããCïŒã©ãããŒã¯ååšãç¶ããããšãã§ããŸãã
ç¶æ¿
ã¿ã¹ã¯ãç°¡çŽ åããããã«ãæã䜿çšãããããããã£ããã£ãã·ã¥ããã³ã³ããŒãã³ãããã¯ã©ã¹ãç¶æ¿ã§ããŸããããã®ãªãã·ã§ã³ã¯æ®éçã§ã¯ãªãïŒå¿ èŠãªãã¹ãŠã®ããããã£ã®äœæãšå€æŽãå¿ èŠã§ãïŒãå¿ èŠã«å¿ããŠä»ã®ã³ã³ããŒãã³ãããã®ç¶æ¿ãèš±å¯ããŸããïŒCïŒã§ã¯å€éç¶æ¿ã¯ãããŸããïŒã
æåã®åé¡ã¯ãã³ãã¬ãŒãã䜿çšããŠè§£æ±ºã§ããŸãã
public class InnerCache : MonoBehaviour { Dictionary<Type, Component> cache = new Dictionary<Type, Component>(); public T Get<T>() where T : Component { var type = typeof(T); Component item = null; if (!cache.TryGetValue(type, out item)) { item = GetComponent<T>(); cache.Add(type, item); } return item as T; } }
2çªç®ã®åé¡ã¯ããã£ãã·ã³ã°çšã®åå¥ã®ã³ã³ããŒãã³ããäœæããã¹ã¯ãªãããžã®ãªã³ã¯ã䜿çšããããšã§åé¿ã§ããŸãã
éçãã£ãã·ã¥
æ¡åŒµæ©èœãªã©ã®CïŒæ©èœã䜿çšãããªãã·ã§ã³ããããŸãã ã¡ãœãããå€æŽããã³ç¶æ¿ããããšãªããæ¢åã®ã¯ã©ã¹ã«ã¡ãœãããè¿œå ã§ããŸãã ããã¯æ¬¡ã®ããã«è¡ãããŸãã
public static class ExternalCache { static Dictionary<GameObject, TestComponent> test = new Dictionary<GameObject, TestComponent>(); public static TestComponent GetCachedTestComponent(this GameObject owner) { TestComponent item = null; if (!test.TryGetValue(owner, out item)) { item = owner.GetComponent<TestComponent>(); test.Add(owner, item); } return item; } }
ãã®åŸãä»»æã®ã¹ã¯ãªããã§ããã®ã³ã³ããŒãã³ããååŸã§ããŸãã
gameObject.GetCachedTestComponent();
ãã ãããã®ãªãã·ã§ã³ã§ã¯ãå¿ èŠãªãã¹ãŠã®ã³ã³ããŒãã³ããäºåã«èšå®ããå¿ èŠããããŸãã ãã³ãã¬ãŒãã䜿çšããŠããã解決ã§ããŸãã
public static class ExternalCache { static Dictionary<GameObject, Dictionary<Type, Component>> cache = new Dictionary<GameObject, Dictionary<Type, Component>>(); public static T GetCachedComponent<T>(this GameObject owner) where T : Component { var type = typeof(T); Dictionary<Type, Component> container = null; if (!cache.TryGetValue(owner, out container)) { container = new Dictionary<Type, Component>(); cache.Add(owner, container); } Component item = null; if (!container.TryGetValue(type, out item)) { item = owner.GetComponent<T>(); container.Add(type, item); } return item as T; } }
ãããã®ãªãã·ã§ã³ã®æ¬ ç¹ã¯ãããããªã³ã¯ã远跡ããããšã§ãã ãã£ãã·ã¥ãã¯ãªã¢ããªãå ŽåïŒããšãã°ãã·ãŒã³ãããŒããããšãïŒããã®ããªã¥ãŒã ã¯æé·ããæ¢ã«ç Žå£ããããªããžã§ã¯ããžã®ãªã³ã¯ã§ã¡ã¢ãªãè©°ãŸãããŸãã
æ§èœæ¯èŒ
ã€ã³ã¿ã©ã¯ãã£ããªãã·ã§ã³
ã芧ã®ãšãããç¹å¹è¬ã¯ãªããæãæé©ãªãã£ãã·ã¥ãªãã·ã§ã³ã¯ãåæåäžã«ã³ã³ããŒãã³ããçŽæ¥ååŸããããšã§ãã è¿œå ã®ã³ãŒããèšè¿°ããå¿ èŠãããããããã£ãé€ããåé¿çã¯æé©ã§ã¯ãããŸããã
å±æ§ã䜿çšãã
å±æ§ã䜿çšãããšãã¯ã©ã¹ã¡ã³ããªã©ã®ã³ãŒãèŠçŽ ã®ã¡ã¿æ å ±ãè¿œå ã§ããŸãã å±æ§èªäœã¯æºããããŠããªãããããªãã¬ã¯ã·ã§ã³ã䜿çšããŠäœ¿çšããå¿ èŠããããŸãããããã¯ããªãé«äŸ¡ãªæäœã§ãã
ãã£ãã·ã³ã°çšã«ç¬èªã®å±æ§ã宣èšã§ããŸãã
[AttributeUsage(AttributeTargets.Field)] public class CachedAttribute : Attribute { }
ãããŠããããã¯ã©ã¹ã®ãã£ãŒã«ãã«äœ¿çšããŸãïŒ
[Cached] public TestComponent Test;
ãããããããŸã§ã®ãšãããããã¯äœãæäŸããŸããããã®æ å ±ã¯æ±ºããŠäœ¿çšãããŸããã
ç¶æ¿
ãã®å±æ§ãæã€ã¯ã©ã¹ã®ã¡ã³ããŒãåãåããåæåäžã«æ瀺çã«åãåãç¬èªã®ã¯ã©ã¹ãäœæã§ããŸãã
public class AttributeCacheInherit : MonoBehaviour { protected virtual void Awake () { CacheAll(); } void CacheAll() { var type = GetType(); CacheFields(GetFieldsToCache(type)); } List<FieldInfo> GetFieldsToCache(Type type) { var fields = new List<FieldInfo>(); foreach (var field in type.GetFields()) { foreach (var a in field.GetCustomAttributes(false)) { if (a is CachedAttribute) { fields.Add(field); } } } return fields; } void CacheFields(List<FieldInfo> fields) { var iter = fields.GetEnumerator(); while (iter.MoveNext()) { var type = iter.Current.FieldType; iter.Current.SetValue(this, GetComponent(type)); } } }
ãã®ã³ã³ããŒãã³ãã®ç¶æ¿è ãäœæããå Žåããã®ã¡ã³ããŒã[Cached]å±æ§ã§ããŒã¯ã§ãããããæ瀺çãªãã£ãã·ã¥ãå¿é ããå¿ èŠã¯ãããŸããã
ãã ããããã©ãŒãã³ã¹ã®åé¡ãšç¶æ¿ã®å¿ èŠæ§ã«ããããã®ã¡ãœããã®å©äŸ¿æ§ãåäžããŸãã
éçåãã£ãã·ã¥
ã¯ã©ã¹ã¡ã³ããŒã®ãªã¹ãã¯ãã³ãŒãã®å®è¡æã«å€æŽãããªããããé«äŸ¡ãªãªãã¬ã¯ã·ã§ã³ã«ã»ãšãã©é ŒãããšãªããäžåºŠååŸããŠãã®ã¿ã€ãçšã«ä¿åããå°æ¥äœ¿çšããããšãã§ããŸãã ãããè¡ãã«ã¯ãååæã®çµæãä¿åããéçã¯ã©ã¹ãå¿ èŠã§ãã
åãã£ãã·ã³ã°
public static class CacheHelper { static Dictionary<Type, List<FieldInfo>> cachedTypes = new Dictionary<Type, List<FieldInfo>>(); public static void CacheAll(MonoBehaviour instance, bool internalCache = true) { var type = instance.GetType(); if ( internalCache ) { List<FieldInfo> fields = null; if ( !cachedTypes.TryGetValue(type, out fields) ) { fields = GetFieldsToCache(type); cachedTypes[type] = fields; } CacheFields(instance, fields); } else { CacheFields(instance, GetFieldsToCache(type)); } } static List<FieldInfo> GetFieldsToCache(Type type) { var fields = new List<FieldInfo>(); foreach ( var field in type.GetFields() ) { foreach ( var a in field.GetCustomAttributes(false) ) { if ( a is CachedAttribute ) { fields.Add(field); } } } return fields; } static void CacheFields(MonoBehaviour instance, List<FieldInfo> fields) { var iter = fields.GetEnumerator(); while(iter.MoveNext()) { var type = iter.Current.FieldType; iter.Current.SetValue(instance, instance.GetComponent(type)); } } }
ãããŠä»ãã¹ã¯ãªããã§ãã£ãã·ã¥ããããã«ããããžã®åŒã³åºãã䜿çšããŸãïŒ
void Awake() { CacheHelper.CacheAll(this); }
ãã®åŸã[Cached]ã§ããŒã¯ããããã¹ãŠã®ã¯ã©ã¹ã¡ã³ããŒãGetComponentã䜿çšããŠååŸãããŸãã
å±æ§ãã£ãã·ã¥ã®ããã©ãŒãã³ã¹
1ã€ãŸãã¯5ã€ã®ãã£ãã·ã¥ã³ã³ããŒãã³ãããããªãã·ã§ã³ã®ããã©ãŒãã³ã¹ãæ¯èŒããŸãã
ã€ã³ã¿ã©ã¯ãã£ããªãã·ã§ã³
ã€ã³ã¿ã©ã¯ãã£ããªãã·ã§ã³
ã芧ã®ãšããããã®æ¹æ³ã¯ã³ã³ããŒãã³ãã®çŽæ¥çç£ã«æ¯ã¹ãŠããã©ãŒãã³ã¹ãå£ããŸãïŒã³ã³ããŒãã³ãã®æ°ãå¢ãããšã®ã£ããããããã«æžå°ããŸãïŒããå€ãã®æ©èœããããŸãã
- ã¯ã©ã¹ã®æåã®ã€ã³ã¹ã¿ã³ã¹ãåæåãããšãã«ã®ã¿ãé倧ãªããã©ãŒãã³ã¹ã®äœäžãçºçããŸã
- ãã®ã¯ã©ã¹ã®åŸç¶ã®ã€ã³ã¹ã¿ã³ã¹ã®åæåã¯ã¯ããã«é«éã§ãããçŽæ¥ãã£ãã·ã¥ã»ã©é«éã§ã¯ãããŸãã
- åæååŸã®ã³ã³ããŒãã³ãã®ååŸã®ããã©ãŒãã³ã¹ã¯ãã¯ã©ã¹ã®ã¡ã³ããŒã®ååŸãšåãã§ãããGetComponentããã³ããããã£ãæã€ããŸããŸãªãªãã·ã§ã³ã®ã¡ã³ããŒã®ååŸãããé«ãã§ãã
- ãããåæã«ãå°æ¥äœ¿çšããããã©ããã«é¢ä¿ãªããã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãåæåãããŸã
æ»ããããšãã£ã¿ãŒã䜿çšãã
ç§ããã®èšäºãçµãããšãã圌ãã¯ç§ã«ãã£ãã·ã¥ã®ããã®èå³æ·±ããœãªã¥ãŒã·ã§ã³ãä¿ããŸããã ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã®å®è¡ç¶æ ã§ã³ã³ããŒãã³ããä¿åããå¿ èŠãæ¬åœã«ãããŸããïŒ ã€ã³ã¹ã¿ã³ã¹ããšã«1åã ããããè¡ããããæ©èœçã«ã¯ãã¢ããªã±ãŒã·ã§ã³ãèµ·åããåã«ãšãã£ã¿ãŒã§ã€ã³ã¹ã¿ã³ã¹ãå²ãåœãŠãã®ãšåãã§ãã ãããŠããšãã£ã¿ãŒã§ã§ããããšã¯ãã¹ãŠèªååã§ããŸãã
ãã®ãããã¡ãã¥ãŒã®å¥ã®ãªãã·ã§ã³ã䜿çšããŠã¹ã¯ãªããã®äŸåé¢ä¿ããã£ãã·ã¥ããããã«äœ¿çšããããã«ã·ãŒã³äžã®ã€ã³ã¹ã¿ã³ã¹ãæºåãããšããã¢ã€ãã¢ãçãŸããŸããã
ä»æ¥ã®æåŸã®ã³ãŒãã·ãŒã
using UnityEngine; using UnityEditor; using System; using System.Reflection; using System.Collections; using System.Collections.Generic; namespace UnityCache { public static class PreCacheEditor { public static bool WriteToLog = true; [MenuItem("UnityCache/PreCache")] public static void PreCache() { var items = GameObject.FindObjectsOfType<MonoBehaviour>(); foreach(var item in items) { if(PreCacheAll(item)) { EditorUtility.SetDirty(item); if(WriteToLog) { Debug.LogFormat("PreCached: {0} [{1}]", item.name, item.GetType()); } } } } static bool PreCacheAll(MonoBehaviour instance) { var type = instance.GetType(); return CacheFields(instance, GetFieldsToCache(type)); } static List<FieldInfo> GetFieldsToCache(Type type) { var fields = new List<FieldInfo>(); foreach (var field in type.GetFields()) { foreach (var a in field.GetCustomAttributes(false)) { if (a is PreCachedAttribute) { fields.Add(field); } } } return fields; } static bool CacheFields(MonoBehaviour instance, List<FieldInfo> fields) { bool cached = false; UnityEditor.SerializedObject serObj = null; var iter = fields.GetEnumerator(); while (iter.MoveNext()) { if(serObj == null) { serObj = new UnityEditor.SerializedObject(instance); cached = true; } var type = iter.Current.FieldType; var name = iter.Current.Name; var property = serObj.FindProperty(name); property.objectReferenceValue = instance.GetComponent(type); Debug.Log(property.objectReferenceValue); } if(cached) { serObj.ApplyModifiedProperties(); } return cached; } } }
ãã®ã¡ãœããã«ã¯ç¬èªã®ç¹æ§ããããŸãã
- æ瀺çãªåæåã«ãªãœãŒã¹ã¯å¿ èŠãããŸããã
- ãªããžã§ã¯ãã¯æ瀺çã«æºåãããŸãïŒã³ãŒãã®åã³ã³ãã€ã«ã§ã¯äžååã§ãïŒ
- æºåäžã®ãªããžã§ã¯ãã¯ã¹ããŒãžäžã«ããå¿ èŠããããŸã
- æºåã¯ããããžã§ã¯ãã®ãã¬ããïŒã·ãŒã³ããæ瀺çã«ä¿åããªãéãïŒããã³ä»ã®ã·ãŒã³ã®ãªããžã§ã¯ãã«ã¯åœ±é¿ããŸãã
çŸåšã®å¶éã¯å°æ¥åé€ãããå¯èœæ§ããããŸãã
èªã¿åãããŒãã¹
èå³æ·±ãæ©èœã¯ãäžè¶³ããŠããã³ã³ããŒãã³ããååŸããããšãããšãæ¢åã®ã³ã³ããŒãã³ããååŸãããããæéããããããšã§ãã åæã«ããšãã£ã¿ãŒã§é¡èãªç°åžžã芳å¯ããããã®åäœã確èªããããã«ä¿ãããŸããã ãã®ããããšãã£ã¿ãŒã®ãããã¡ã€ãªã³ã°çµæã«äŸåããªãã§ãã ããã
ã€ã³ã¿ã©ã¯ãã£ããªãã·ã§ã³
äžè¶³ããŠããã³ã³ããŒãã³ããååŸããæ©èœ
èå³æ·±ãæ©èœã¯ãäžè¶³ããŠããã³ã³ããŒãã³ããååŸããããšãããšãæ¢åã®ã³ã³ããŒãã³ããååŸãããããæéããããããšã§ãã åæã«ããšãã£ã¿ãŒã§é¡èãªç°åžžã芳å¯ããããã®åäœã確èªããããã«ä¿ãããŸããã ãã®ããããšãã£ã¿ãŒã®ãããã¡ã€ãªã³ã°çµæã«äŸåããªãã§ãã ããã
ã€ã³ã¿ã©ã¯ãã£ããªãã·ã§ã³
ãããã«
ãã®èšäºã§ã¯ãã³ã³ããŒãã³ãããã£ãã·ã¥ããããã®ããŸããŸãªæ¹æ³ã®è©äŸ¡ãèŠãŸããããŸããå±æ§ã®æçšãªäœ¿çšæ³ã®1ã€ã«ã€ããŠãåŠã³ãŸããã ååãšããŠãUnity3Dã§ãããžã§ã¯ããäœæãããšãã«ããã®æ©èœãèæ ®ããŠããªãã¬ã¯ã·ã§ã³ã«åºã¥ãã¡ãœããã䜿çšã§ããŸãã ãããã®1ã€ã䜿çšãããšãåãã¿ã€ãã®ã³ãŒããããå°ãªãæžãããšãã§ããŸããããœãªã¥ãŒã·ã§ã³ã®ãæ£é¢ããããçç£æ§ãå°ãäœäžããŸãã çŸæç¹ã§2çªç®ã®ãã®ã¯ããå°ã泚æãå¿ èŠã§ãããæçµçãªããã©ãŒãã³ã¹ã«ã¯åœ±é¿ããŸããã
å±æ§ã䜿çšãããã¹ãããã³æŠå¿µå®èšŒã®ãã£ãã·ã¥çšã®ã¹ã¯ãªãããœãŒã¹ã³ãŒããå«ããããžã§ã¯ãã¯ã GitHubã§å ¥æã§ããŸã ïŒæçµããŒãžã§ã³ã¯ãã¡ã ïŒã æ¹åã®ããã®ææ¡ããããããããŸããã
ãæž èŽããããšãããããŸãããæçãªã³ã¡ã³ãããåŸ ã¡ããŠãããŸãã 確ãã«ãã®åé¡ã¯å€ãã®äººã«ãã£ãŠæ€èšãããŠãããããã«ã€ããŠäœãèšãããããšããããŸãã
æŽæ°
å©çšå¯èœãªææ°ããŒãžã§ã³ïŒ0.32ïŒã«ã¯ã2ã€ã®æ°ããæ©èœãè¿œå ãããŸããã
- ãã£ãã·ã³ã°ããããã£ã®åå¥ã®ã¯ã©ã¹ ïŒïŒ
- ããšãã£ã¿ãŒã§ãã¢ãŒãã䜿çšããå Žåãã·ãŒã³ãçµã¿ç«ãŠãåã«ãå¿ èŠãªã³ã³ããŒãã³ãããã£ãã·ã¥ãããã¡ãã¥ãŒé ç®ã䜿çšããŠäºåã«äœãããã£ãã·ã¥ãããŠããªãå Žåã¯èŠåã衚瀺ãããŸãïŒæ®å¿µãªãããOnPostProcessSceneã§ã·ãŒã³ãä¿åããããšã¯ã§ããŸããïŒã