原文:https://www.bilibili.com/video/BV1aE41117dN?p=12&spm_id_from=pageDriver
public class UIWindow : MonoBehaviour
{
public CanvasGroup canvasGroup;
void Awake()
{
canvasGroup = GetComponent<CanvasGroup>();
}
void Start()
{
SetVisible(false,5);
}
/// <summary>
///
/// </summary>
/// <param name="state">设置状态</param>
/// <param name="delay">延迟时间</param>
public void SetVisible(bool state, float delay = 0)
{
StartCoroutine(SetVisibleDelay(state, delay));
//SetVisible(true);等待一帧
//SetVisible(true,2);等待2秒
}
private IEnumerator SetVisibleDelay(bool state,float delay)
{
yield return new WaitForSeconds(delay);
canvasGroup.alpha = state ? 1 : 0;
}
}
public class UIManager : MonoSingleton<UIManager>
{
private Dictionary<string, UIWindow> dic_uiwindow;
void Start()
{
}
public override void Init()
{
base.Init();
dic_uiwindow = new Dictionary<string, UIWindow>();
UIWindow[] uiwindowArr = FindObjectsOfType<UIWindow>();
for (int i = 0; i < uiwindowArr.Length; i++)
{
uiwindowArr[i].SetVisible(false);
AddWindow(uiwindowArr[i]);
}
}
/// <summary>
/// 动态添加新窗口
/// </summary>
/// <param name="uiwindow"></param>
public void AddWindow(UIWindow uiwindow)
{
dic_uiwindow.Add(uiwindow.GetType().Name, uiwindow);
}
/// <summary>
/// 根据类型查找窗口
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
public T GetWindow<T>() where T:class
{
string key = typeof(T).Name;
if (!dic_uiwindow.ContainsKey(key)) return null;
return dic_uiwindow[key] as T;
}
}
public class MonoSingleton<T> : MonoBehaviour where T :MonoSingleton<T>
{
private static T _instance;
public static T Instance
{
get
{
if (_instance == null)
{
_instance = FindObjectOfType<T>();
if (_instance == null)
{
_instance = new GameObject("Singleton of" + typeof(T)).AddComponent<T>();
}
else
{
_instance.Init();
}
}
return _instance;
}
}
protected void Awake()
{
if (_instance == null)
{
_instance = this as T;
Init();
}
}
public virtual void Init()
{
}
}
public class GameManager : MonoBehaviour
{
void Start()
{
UIManager.Instance.GetWindow<UIMainWindow>().SetVisible(true);
}
}