Gameplay Ingredients是一组用于 Unity 游戏的运行时和编辑器工具:一组脚本的集合,可在制作游戏和原型时简化简单的任务。
您最多选择25个主题 主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

106 行
3.8 KiB

using System.Linq;
using System.Collections.Generic;
using UnityEngine;
using System;
using System.Reflection;
namespace GameplayIngredients
{
[HelpURL(Help.URL + "managers")]
public abstract class Manager : MonoBehaviour
{
private static Dictionary<Type, Manager> s_Managers = new Dictionary<Type, Manager>();
public static bool TryGet<T>(out T manager) where T: Manager
{
manager = null;
if(s_Managers.ContainsKey(typeof(T)))
{
manager = (T)s_Managers[typeof(T)];
return true;
}
else
return false;
}
public static T Get<T>() where T: Manager
{
if(s_Managers.ContainsKey(typeof(T)))
return (T)s_Managers[typeof(T)];
else
{
Debug.LogError($"Manager of type '{typeof(T)}' could not be accessed. Check the excludedManagers list in your GameplayIngredientsSettings configuration file.");
return null;
}
}
public static bool Has<T>() where T:Manager
{
return(s_Managers.ContainsKey(typeof(T)));
}
static readonly Type[] kAllManagerTypes = TypeUtility.GetConcreteTypes<Manager>();
[RuntimeInitializeOnLoadMethod(RuntimeInitializeLoadType.BeforeSceneLoad)]
static void AutoCreateAll()
{
s_Managers.Clear();
var exclusionList = GameplayIngredientsSettings.currentSettings.excludedeManagers;
if(GameplayIngredientsSettings.currentSettings.verboseCalls)
Debug.Log("Initializing all Managers...");
foreach(var type in kAllManagerTypes)
{
// Check for any Do Not Create Attribute
var doNotCreateAttr = type.GetCustomAttribute<DoNotCreateManagerAttribute>();
if (doNotCreateAttr != null)
continue;
// Check for entries in exclusion List
if (exclusionList != null && exclusionList.ToList().Contains(type.Name))
{
Debug.LogWarning($"Manager : {type.Name} is in GameplayIngredientSettings.excludedeManagers List: ignoring Creation");
continue;
}
var prefabAttr = type.GetCustomAttribute<ManagerDefaultPrefabAttribute>();
GameObject gameObject;
if(prefabAttr != null)
{
var prefab = Resources.Load<GameObject>(prefabAttr.prefab);
if(prefab == null) // Try loading the "Default_" prefixed version of the prefab
{
prefab = Resources.Load<GameObject>("Default_"+prefabAttr.prefab);
}
if(prefab != null)
{
gameObject = GameObject.Instantiate(prefab);
}
else
{
Debug.LogError($"Could not instantiate default prefab for {type.ToString()} : No prefab '{prefabAttr.prefab}' found in resources folders. Ignoring...");
continue;
}
}
else
{
gameObject = new GameObject();
gameObject.AddComponent(type);
}
gameObject.name = type.Name;
GameObject.DontDestroyOnLoad(gameObject);
var comp = (Manager)gameObject.GetComponent(type);
s_Managers.Add(type,comp);
if (GameplayIngredientsSettings.currentSettings.verboseCalls)
Debug.Log(string.Format(" -> <{0}> OK", type.Name));
}
}
}
}