Files
2026-02-21 16:45:37 +08:00

97 lines
2.0 KiB
C#

using System;
using System.Reflection;
using UnityEngine;
namespace EnergyBarToolkit
{
[Serializable]
public class ObjectFinder
{
[Flags]
public enum Method
{
ByPath = 1,
ByTag = 2,
ByType = 4,
ByReference = 8
}
public Method chosenMethod = Method.ByType;
public string path;
public string tag;
public GameObject reference;
public string typeString;
public string assembly;
public ObjectFinder(Type type, string defaultPath = "", string defaultTag = "", Method defaultMethod = Method.ByType)
{
path = defaultPath;
tag = defaultTag;
chosenMethod = defaultMethod;
typeString = type.ToString();
assembly = Assembly.GetExecutingAssembly().FullName;
}
public T Lookup<T>(UnityEngine.Object parent) where T : Component
{
switch (chosenMethod)
{
case Method.ByPath:
{
GameObject gameObject = GameObject.Find(path);
if (gameObject != null)
{
return GetComponent<T>(gameObject);
}
Debug.LogError("Cannot find object on path " + path, parent);
return (T)null;
}
case Method.ByTag:
{
GameObject gameObject2 = GameObject.FindWithTag(tag);
if (gameObject2 != null)
{
return GetComponent<T>(gameObject2);
}
Debug.LogError("Cannot find object by tag " + tag, parent);
return (T)null;
}
case Method.ByType:
{
Type type = GetType();
UnityEngine.Object obj = UnityEngine.Object.FindObjectOfType(type);
if (obj == null)
{
Debug.LogError("Cannot find object of type " + type, parent);
}
return obj as T;
}
case Method.ByReference:
return GetComponent<T>(reference);
default:
throw new ArgumentOutOfRangeException();
}
}
private T GetComponent<T>(GameObject go) where T : Component
{
T component = go.GetComponent<T>();
if (component == null)
{
Debug.LogError("Cannot find component " + typeString + " on " + go, go);
}
return component;
}
private new Type GetType()
{
return Type.GetType(typeString + ", " + assembly);
}
}
}