UISingleton
UI组件单例模式
public class UISingleton<T> : MonoBehaviour where T : UISingleton<T>
{
private static T instance = null;
public static T Instance
{
get
{
if (instance == null)
{
instance = FindObjectOfType(typeof(T)) as T;
if (instance == null)
{
instance = new GameObject("_" + typeof(T).Name).AddComponent<T>();
DontDestroyOnLoad(instance);
}
if (instance == null)
Debug.LogError("Failed to create instance of " + typeof(T).FullName + ".");
}
return instance;
}
}
void OnApplicationQuit() { if (instance != null) instance = null; }
public static T CreateInstance()
{
if (Instance != null) Instance.OnCreate();
return Instance;
}
protected virtual void OnCreate()
{
}
}
UIInfo
置于UGUI顶级节点,即Cavans的组件,其作用是初始化UIManager和PotonManger及调用UIManagr初始化UIScene的显示
public class UIInfo : UISingleton<UIInfo> {
private UIManager uiManager;
private PhotonManager photonManager;
void Awake()
{
InitUIManager();
InitPhotonManger();
}
void InitUIManager()
{
Object obj = FindObjectOfType(typeof(UIManager));
if (obj != null)
uiManager = obj as UIManager;
if (uiManager == null)
{
GameObject manger = new GameObject("UIManager");
uiManager = manger.AddComponent<UIManager>();
}
uiManager.InitializeUIs(); //初始化UIManager
uiManager.SetTitleVisible(true);//显示开始游戏一级界面
}
void InitPhotonManger()
{
Object obj = FindObjectOfType(typeof(PhotonManager));
if (obj != null)
photonManager = obj as PhotonManager;
if (photonManager == null)
{
GameObject manger = new GameObject("PhotonManager");
photonManager = manger.AddComponent<PhotonManager>();
}
}
}
UIManager
UIScene管理类,首先将所有UIScene加入缓存,再动态的负责加载,显示或隐藏UIScene
public class UIManager : UISingleton<UIManager>
{
private Dictionary<string, UIScene> mUIScene = new Dictionary<string, UIScene>();
public void InitializeUIs()
{
mUIScene.Clear();
Object[] uis = FindObjectsOfType(typeof(UIScene));
if (uis != null)
{
foreach (Object obj in uis)
{
UIScene ui = obj as UIScene;
ui.SetVisible(false);
mUIScene.Add(ui.gameObject.name, ui);
}
}
}
public UIScene SetVisible(string name, bool visible)
{
if (visible && !IsVisible(name))
{
return OpenScene(name);
}
else if (!visible && IsVisible(name))
{
return CloseScene(name);
}
return mUIScene[name]; ;
}
public bool IsVisible(string name)
{
UIScene ui = GetUI(name);
if (ui != null)
return ui.IsVisible();
return false;
}
private UIScene GetUI(string name)
{
UIScene ui;
return mUIScene.TryGetValue(name, out ui) ? ui : null;
}
public T GetUI<T>(string name) where T : UIScene
{
return GetUI(name) as T;
}
private bool isLoaded(string name)
{
if (mUIScene.ContainsKey(name))
{
return true;
}
return false;
}
private UIScene OpenScene(string name)
{
if (isLoaded(name))
{
mUIScene[name].SetVisible(true);
}
return mUIScene[name];
}
private UIScene CloseScene(string name)
{
if (isLoaded(name))
{
mUIScene[name].SetVisible(false);
}
return mUIScene[name];
}
//显示一级界面
public UIScene SetTitleVisible(bool visible)
{
return SetVisible(UIName.UILogin, visible);
}
}
UIScene
管理UIScene下的所有UISceneWidget, 同样先缓存,在动态管理
public class UIScene : MonoBehaviour
{
protected string mUIName = "";
private Dictionary<string, UISceneWidget> mUIWidgets = new Dictionary<string, UISceneWidget>();
public ESceneType type = ESceneType.Nomal;
protected virtual void Start()
{
this.FindChildWidgets(gameObject.transform);
}
protected virtual void Update()
{
}
public virtual bool IsVisible()
{
return gameObject.activeSelf;
}
public virtual void SetVisible(bool visible)
{
gameObject.SetActive(visible);
}
protected UISceneWidget GetWidget(string name)
{
// If allready find out, return
if (mUIWidgets.ContainsKey(name))
return mUIWidgets[name];
// Find out widget with name and add to dictionary
Transform t = gameObject.transform.FindChild(name);
if (t == null) return null;
UISceneWidget widget = t.gameObject.GetComponent<UISceneWidget>();
if (widget != null)
{
mUIWidgets.Add(widget.gameObject.name, widget);
}
return t.gameObject.GetComponent<UISceneWidget>();
}
protected T GetWidget<T>(string name) where T : Component
{
// Find out widget with name and add to dictionary
GameObject go = GameObject.Find(name);
if (go == null) return null;
T widget = go.GetComponent<T>();
return widget;
}
private void FindChildWidgets(Transform t)
{
UISceneWidget widget = t.gameObject.GetComponent<UISceneWidget>();
if (widget != null)
{
string name = t.gameObject.name;
if (!mUIWidgets.ContainsKey(name))
{
mUIWidgets.Add(name, widget);
}
}
for (int i = 0; i < t.childCount; ++i)
{
Transform child = t.GetChild(i);
FindChildWidgets(child);
}
}
}
UISceneWidget
界面控件类,用户捕获触发事件
public class UISceneWidget : EventTrigger
{
public event Action<PointerEventData> BeginDrag;
public event Action<BaseEventData> Cancel;
public event Action<BaseEventData> Deselect;
public event Action<PointerEventData> Drag;
public event Action<PointerEventData> Drop;
public event Action<PointerEventData> EndDrag;
public event Action<PointerEventData> InitializePotentialDrag;
public event Action<AxisEventData> Move;
public event Action<PointerEventData> PointerClick;
public event Action<PointerEventData> PointerDown;
public event Action<PointerEventData> PointerEnter;
public event Action<PointerEventData> PointerExit;
public event Action<PointerEventData> PointerUp;
public event Action<PointerEventData> Scroll;
public event Action<BaseEventData> Select;
public event Action<BaseEventData> Submit;
public event Action<BaseEventData> UpdateSelected;
/// <summary>
/// 获取指定UGUI游戏物体的事件监听器
/// </summary>
/// <param name="go"></param>
/// <returns></returns>
public static UISceneWidget Get(GameObject go)
{
UISceneWidget widget = go.GetComponent<UISceneWidget>();
if (!widget) widget = go.AddComponent<UISceneWidget>();
return widget;
}
public override void OnBeginDrag(PointerEventData eventData)
{
if (BeginDrag != null) BeginDrag(eventData);
}
public override void OnCancel(BaseEventData eventData)
{
if (Cancel != null) Cancel(eventData);
}
public override void OnDeselect(BaseEventData eventData)
{
if (Deselect != null) Deselect(eventData);
}
public override void OnDrag(PointerEventData eventData)
{
if (Drag != null) Drag(eventData);
}
public override void OnDrop(PointerEventData eventData)
{
if (Drop != null) Drop(eventData);
}
public override void OnEndDrag(PointerEventData eventData)
{
if (EndDrag != null) EndDrag(eventData);
}
public override void OnInitializePotentialDrag(PointerEventData eventData)
{
if (InitializePotentialDrag != null) InitializePotentialDrag(eventData);
}
public override void OnMove(AxisEventData eventData)
{
if (Move != null) Move(eventData);
}
public override void OnPointerClick(PointerEventData eventData)
{
if (PointerClick != null) PointerClick(eventData);
}
public override void OnPointerDown(PointerEventData eventData)
{
if (PointerDown != null) PointerDown(eventData);
}
public override void OnPointerEnter(PointerEventData eventData)
{
if (PointerEnter != null) PointerEnter(eventData);
}
public override void OnPointerExit(PointerEventData eventData)
{
if (PointerExit != null) PointerExit(eventData);
}
public override void OnPointerUp(PointerEventData eventData)
{
if (PointerUp != null) PointerUp(eventData);
}
public override void OnScroll(PointerEventData eventData)
{
if (Scroll != null) Scroll(eventData);
}
public override void OnSelect(BaseEventData eventData)
{
if (Select != null) Select(eventData);
}
public override void OnSubmit(BaseEventData eventData)
{
if (Submit != null) Submit(eventData);
}
public override void OnUpdateSelected(BaseEventData eventData)
{
if (UpdateSelected != null) UpdateSelected(eventData);
}
}