216 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			216 lines
		
	
	
		
			7.9 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| #if UNITY_EDITOR
 | |
| using FishNet.Utility.Constant;
 | |
| using System.Collections.Generic;
 | |
| using UnityEditor;
 | |
| using UnityEngine;
 | |
| using UnityEngine.SceneManagement;
 | |
| 
 | |
| namespace FishNet.Editing
 | |
| {
 | |
|     public static class Finding
 | |
|     {
 | |
|         #region Private.
 | |
|         /// <summary>
 | |
|         /// Path where the FishNet.Runtime assembly is.
 | |
|         /// </summary>
 | |
|         [System.NonSerialized]
 | |
|         private static string _fishNetRuntimePath = string.Empty;
 | |
|         /// <summary>
 | |
|         /// Path where the FishNet.Generated assembly is.
 | |
|         /// </summary>
 | |
|         private static string _fishNetGeneratedPath = string.Empty;
 | |
|         #endregion
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Sets FishNet assembly paths.
 | |
|         /// </summary>
 | |
|         /// <param name="error"></param>
 | |
|         private static void SetPaths(bool error)
 | |
|         {
 | |
|             if (_fishNetGeneratedPath != string.Empty && _fishNetRuntimePath != string.Empty)
 | |
|                 return;
 | |
| 
 | |
|             string[] guids = AssetDatabase.FindAssets("t:asmdef", new string[] { "Assets" });
 | |
|             string[] objectPaths = new string[guids.Length];
 | |
|             for (int i = 0; i < guids.Length; i++)
 | |
|                 objectPaths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
 | |
| 
 | |
|             string runtimeName = (UtilityConstants.RUNTIME_ASSEMBLY_NAME + ".asmdef").ToLower();
 | |
|             string generatedName = (UtilityConstants.GENERATED_ASSEMBLY_NAME + ".asmdef").ToLower();
 | |
|             /* Find all network managers which use Single prefab linking
 | |
|              * as well all network object prefabs. */
 | |
|             foreach (string item in objectPaths)
 | |
|             {
 | |
|                 //Found directory to create object in.
 | |
|                 if (item.ToLower().Contains(runtimeName))
 | |
|                     _fishNetRuntimePath = System.IO.Path.GetDirectoryName(item);
 | |
|                 else if (item.ToLower().Contains(generatedName))
 | |
|                     _fishNetGeneratedPath = System.IO.Path.GetDirectoryName(item);
 | |
| 
 | |
|                 if (_fishNetGeneratedPath != string.Empty && _fishNetRuntimePath != string.Empty)
 | |
|                     return;
 | |
|             }
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Gets path for where the FishNet.Runtime assembly is.
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         public static string GetFishNetRuntimePath(bool error)
 | |
|         {
 | |
|             SetPaths(error);
 | |
|             return _fishNetRuntimePath;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Gets path for where the FishNet.Generated assembly is.
 | |
|         /// </summary>
 | |
|         /// <param name="error"></param>
 | |
|         /// <returns></returns>
 | |
|         public static string GetFishNetGeneratedPath(bool error)
 | |
|         {
 | |
|             SetPaths(error);
 | |
|             return _fishNetGeneratedPath;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets all GameObjects in Assets and optionally scenes.
 | |
|         /// </summary>
 | |
|         /// <typeparam name="T"></typeparam>
 | |
|         /// <returns></returns>
 | |
|         public static List<GameObject> GetGameObjects(bool userAssemblies, bool fishNetAssembly, bool includeScenes, string[] ignoredPaths = null)
 | |
|         {
 | |
|             List<GameObject> results = new List<GameObject>();
 | |
| 
 | |
|             string[] guids;
 | |
|             string[] objectPaths;
 | |
| 
 | |
|             guids = AssetDatabase.FindAssets("t:GameObject", null);
 | |
|             objectPaths = new string[guids.Length];
 | |
|             for (int i = 0; i < guids.Length; i++)
 | |
|                 objectPaths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
 | |
| 
 | |
|             foreach (string item in objectPaths)
 | |
|             {
 | |
|                 bool inFishNet = item.Contains(_fishNetRuntimePath);
 | |
|                 if (inFishNet && !fishNetAssembly)
 | |
|                     continue;
 | |
|                 if (!inFishNet && !userAssemblies)
 | |
|                     continue;
 | |
|                 if (ignoredPaths != null)
 | |
|                 {
 | |
|                     bool ignore = false;
 | |
|                     foreach (string path in ignoredPaths)
 | |
|                     {
 | |
|                         if (item.Contains(path))
 | |
|                         {
 | |
|                             ignore = true;
 | |
|                             break;
 | |
|                         }
 | |
|                     }
 | |
|                     if (ignore)
 | |
|                         continue;
 | |
|                 }
 | |
| 
 | |
|                 GameObject go = (GameObject)AssetDatabase.LoadAssetAtPath(item, typeof(GameObject));
 | |
|                 results.Add(go);
 | |
|             }
 | |
| 
 | |
|             if (includeScenes)
 | |
|                 results.AddRange(GetSceneGameObjects());
 | |
| 
 | |
|             return results;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets all GameObjects in all open scenes.
 | |
|         /// </summary>
 | |
|         /// <returns></returns>
 | |
|         private static List<GameObject> GetSceneGameObjects()
 | |
|         {
 | |
|             List<GameObject> results = new List<GameObject>();
 | |
| 
 | |
|             for (int i = 0; i < SceneManager.sceneCount; i++)
 | |
|                 results.AddRange(GetSceneGameObjects(SceneManager.GetSceneAt(i)));
 | |
| 
 | |
|             return results;
 | |
|         }
 | |
|         /// <summary>
 | |
|         /// Gets all GameObjects in a scene.
 | |
|         /// </summary>
 | |
|         private static List<GameObject> GetSceneGameObjects(Scene s)
 | |
|         {
 | |
|             List<GameObject> results = new List<GameObject>();
 | |
|             List<Transform> buffer = new List<Transform>();
 | |
|             //Iterate all root objects for the scene.
 | |
|             GameObject[] gos = s.GetRootGameObjects();
 | |
|             for (int i = 0; i < gos.Length; i++)
 | |
|             {
 | |
|                 /* Get GameObjects within children of each
 | |
|                  * root object then add them to the cache. */
 | |
|                 gos[i].GetComponentsInChildren<Transform>(true, buffer);
 | |
|                 foreach (Transform t in buffer)
 | |
|                     results.Add(t.gameObject);
 | |
|             }
 | |
| 
 | |
|             return results;
 | |
|         }
 | |
| 
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Gets created ScriptableObjects of T.
 | |
|         /// </summary>
 | |
|         /// <typeparam name="T"></typeparam>
 | |
|         /// <returns></returns>
 | |
|         public static List<UnityEngine.Object> GetScriptableObjects<T>(bool fishNetAssembly, bool breakOnFirst = false)
 | |
|         {
 | |
|             System.Type tType = typeof(T);
 | |
|             List<UnityEngine.Object> results = new List<UnityEngine.Object>();
 | |
| 
 | |
|             string[] guids = AssetDatabase.FindAssets("t:ScriptableObject", new string[] { "Assets" });
 | |
|             string[] objectPaths = new string[guids.Length];
 | |
|             for (int i = 0; i < guids.Length; i++)
 | |
|                 objectPaths[i] = AssetDatabase.GUIDToAssetPath(guids[i]);
 | |
| 
 | |
| 
 | |
|             /* This might be faster than using directory comparers.
 | |
|              * Don't really care since this occurs only at edit. */
 | |
|             List<string> fishNetPaths = new List<string>();
 | |
|             fishNetPaths.Add(_fishNetGeneratedPath.Replace(@"/", @"\"));
 | |
|             fishNetPaths.Add(_fishNetGeneratedPath.Replace(@"\", @"/"));
 | |
|             fishNetPaths.Add(_fishNetRuntimePath.Replace(@"/", @"\"));
 | |
|             fishNetPaths.Add(_fishNetRuntimePath.Replace(@"\", @"/"));
 | |
|             /* Find all network managers which use Single prefab linking
 | |
|              * as well all network object prefabs. */
 | |
|             foreach (string item in objectPaths)
 | |
|             {
 | |
|                 //This will skip hidden unity types.
 | |
|                 if (!item.EndsWith(".asset"))
 | |
|                     continue;
 | |
|                 if (fishNetAssembly)
 | |
|                 {
 | |
|                     bool found = false;
 | |
|                     foreach (string path in fishNetPaths)
 | |
|                     {
 | |
|                         if (item.Contains(path))
 | |
|                         {
 | |
|                             found = true;
 | |
|                             break;
 | |
|                         }
 | |
|                     }
 | |
|                     if (!found)
 | |
|                         continue;
 | |
|                 }
 | |
|                 UnityEngine.Object obj = AssetDatabase.LoadAssetAtPath(item, tType);
 | |
|                 if (obj != null && tType != null && obj.GetType() == tType)
 | |
|                 {
 | |
|                     results.Add(obj);
 | |
|                     if (breakOnFirst)
 | |
|                         return results;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             return results;
 | |
|         }
 | |
| 
 | |
|     }
 | |
| }
 | |
| #endif |