forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			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 |