This repository has been archived on 2023-09-13. You can view files and clone it, but cannot push or open issues or pull requests.
station_obscurum_unity/Assets/FishNet/Runtime/Editor/Finding.cs

216 lines
7.9 KiB
C#
Raw Normal View History

2023-05-31 17:32:21 +02:00
#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