您的位置:首页 > 移动开发 > Unity3D

Unity3D自学笔记——UGUI前台架构

2016-10-30 15:38 429 查看


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 e
ce64
vent 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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: