65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C#
		
	
	
	
| namespace SRF
 | |
| {
 | |
|     using System;
 | |
|     using System.Collections.Generic;
 | |
|     using System.Linq;
 | |
|     using UnityEngine;
 | |
| 
 | |
|     public class Hierarchy
 | |
|     {
 | |
|         private static readonly char[] Seperator = {'/'};
 | |
|         private static readonly Dictionary<string, Transform> Cache = new Dictionary<string, Transform>();
 | |
| 
 | |
|         [Obsolete("Use static Get() instead")]
 | |
|         public Transform this[string key]
 | |
|         {
 | |
|             get { return Get(key); }
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Pass in a path (e.g. /Test/Me/One) and get a transform with the hierarchy Test->Me->One.
 | |
|         /// Any Transforms required below this path will be auto-created.
 | |
|         /// This is a very slow method, so use only on initialisation.
 | |
|         /// </summary>
 | |
|         /// <param name="key"></param>
 | |
|         /// <returns></returns>
 | |
|         public static Transform Get(string key)
 | |
|         {
 | |
|             Transform t;
 | |
| 
 | |
|             // Check cache
 | |
|             if (Cache.TryGetValue(key, out t))
 | |
|             {
 | |
|                 return t;
 | |
|             }
 | |
| 
 | |
|             var find = GameObject.Find(key);
 | |
| 
 | |
|             if (find)
 | |
|             {
 | |
|                 t = find.transform;
 | |
|                 Cache.Add(key, t);
 | |
| 
 | |
|                 return t;
 | |
|             }
 | |
| 
 | |
|             // Find container parent
 | |
|             var elements = key.Split(Seperator, StringSplitOptions.RemoveEmptyEntries);
 | |
| 
 | |
|             // Create new container
 | |
|             t = new GameObject(elements.Last()).transform;
 | |
|             Cache.Add(key, t);
 | |
| 
 | |
|             // If root
 | |
|             if (elements.Length == 1)
 | |
|             {
 | |
|                 return t;
 | |
|             }
 | |
| 
 | |
|             t.parent = Get(string.Join("/", elements, 0, elements.Length - 1));
 | |
| 
 | |
|             return t;
 | |
|         }
 | |
|     }
 | |
| }
 |