为了能让DoozyUI与项目本身可以兼容,至少需要做到以下两点:
1、通过DoozyUI 触发一个自定义的事件(比如通过点击按钮来开始游戏)。
2、通过其他模块的事件来触发DoozyUI(比如游戏失败弹出提示框)。
所以需要我们做的就是使DoozyUI与自己的逻辑互通,需要有一个中间类来传递消息。
1、使用UnityEvent
我们通过观察DoozyUI的结构,发现其预留了一个事件给我们:
例如在UI Button中就有这么一个事件,我们可以像给普通按钮赋值一样给他赋值一个UnityEvent,然后就可以点击触发。我们可以以此为基础来实现从Doozy UI到项目的事件传递。
2、关于 UI Button的事件传递
DoozyUI给UI Button设定了7个事件,分别是:
OnPointerEnter(鼠标进入)、OnPointerExit(鼠标退出)、OnClick(单击)、OnPointerDown(按下)、OnPointerUp(抬起)、OnDoubleClick(双击)和OnLongClick(长按)。
因此我们写一个类,挂载到含有 UI Button的gameObject上面:
///
/// Dooozy UI 的事件帮助脚本;
/// 通过在UnityEvent来触发;
///
public class DoozyUIEventHelper_Button : MonoBehaviour
{
UIButton mUIButton;
private void OnEnable()
{
}
private void Awake()
{
mUIButton = GetComponent();
if (mUIButton != null)
{
InitEvent();
//Debug.Log("添加各个事件!");
}
else
{
Debug.LogError("需要先添加DoozyUI.UIButton组件!");
}
}
void InitEvent()
{
mUIButton.OnPointerEnter.AddListener(OnPointerEnter);
mUIButton.OnPointerExit.AddListener(OnPointerExit);
mUIButton.OnClick.AddListener(OnPointerClick);
mUIButton.OnPointerDown.AddListener(OnPointerDown);
mUIButton.OnPointerUp.AddListener(OnPointerUp);
mUIButton.OnDoubleClick.AddListener(OnDoubleClick);
mUIButton.OnLongClick.AddListener(OnLongClick);
}
private void OnDestroy()
{
if (mUIButton != null)
RemoveEvent();
}
void RemoveEvent()
{
}
public List ListPointerEnter = new List();
///
/// 进入;
///
public void OnPointerEnter()
{
if (mUIButton.useOnPointerEnter)
DispatchCMD(ListPointerEnter);
}
public List ListPointerExit = new List();
///
/// 退出;
///
public void OnPointerExit()
{
if (mUIButton.useOnPointerExit)
DispatchCMD(ListPointerExit);
}
public List ListPointerUp = new List();
///
/// 抬起;
///
public void OnPointerUp()
{
if (mUIButton.useOnPointerUp)
DispatchCMD(ListPointerUp);
}
public List ListPointerDown = new List();
///
/// 按下;
///
public void OnPointerDown()
{
if (mUIButton.useOnPointerDown)
DispatchCMD(ListPointerDown);
}
public List ListPointerClick = new List();
///
/// 点击事件;
///
public void OnPointerClick()
{
if (mUIButton.Interactable)
DispatchCMD(ListPointerClick);
}
public List ListDoublePointerClick = new List();
///
/// 双击;
///
public void OnDoubleClick()
{
if (mUIButton.useOnDoubleClick)
DispatchCMD(ListDoublePointerClick);
}
public List ListPointerLongClick = new List();
///
/// 长按;
///
public void OnLongClick()
{
if (mUIButton.useOnLongClick)
DispatchCMD(ListPointerLongClick);
}
void DispatchCMD(List list)
{
int length = list.Count;
for (int i = 0; i < length; i++)
{
Debug.log("触发:"+list[i]);
}
}
}
这里的原理就是用代码给 UI Button的各个UnityEvent添加事件。
其中E_UIEvent是我自己定义的一个枚举,用来当做各个事件的唯一ID。这样就可以通过UI Button来触发自定义的事件了,而且还可以一次性触发多个事件。
3、关于UI Element的事件传递
同理 UI Button,但是事件类型有些不一样。UI Element有四个事件:
OnInAnimationsStart(进入动画开始),OnInAnimationsFinish(进入动画结束),OnOutAnimationsStart(退出动画开始),OnOutAnimationsFinish(退出动画结束)。
代码如下:
///
/// Dooozy UI 的事件帮助脚本;
/// 通过在UnityEvent来触发;
///
public class DoozyUIEventHelper_Element : SerializedMonoBehaviour
{
UIElement mUIElement;
private void Awake()
{
mUIElement = GetComponent();
if (mUIElement != null)
{
InitEvent();
//Debug.Log("添加各个事件!");
}
else
{
Debug.LogError("需要先添加DoozyUI.UIElement!");
}
}
void InitEvent()
{
mUIElement.OnInAnimationsStart.AddListener(OnInAnimationsStart);
mUIElement.OnInAnimationsFinish.AddListener(OnInAnimationsFinish);
mUIElement.OnOutAnimationsStart.AddListener(OnOutAnimationsStart);
mUIElement.OnOutAnimationsFinish.AddListener(OnOutAnimationsFinish);
}
private void OnDestroy()
{
if (mUIElement != null)
RemoveEvent();
}
void RemoveEvent()
{
}
public List ListInAnimationsStart = new List();
///
/// 进入动画开始;
///
public void OnInAnimationsStart()
{
if (mUIElement.InAnimationsEnabled)
DispatchCMD(ListInAnimationsStart);
}
public List ListInAnimationsFinish = new List();
///
/// 进入动画结束;
///
public void OnInAnimationsFinish()
{
if (mUIElement.InAnimationsEnabled)
DispatchCMD(ListInAnimationsFinish);
}
public List ListOutAnimationsStart = new List();
///
/// 退出动画开始;
///
public void OnOutAnimationsStart()
{
if (mUIElement.OutAnimationsEnabled)
DispatchCMD(ListOutAnimationsStart);
}
public List ListOutAnimationsFinish = new List();
///
/// 退出动画结束;
///
public void OnOutAnimationsFinish()
{
if (mUIElement.OutAnimationsEnabled)
DispatchCMD(ListOutAnimationsFinish);
}
void DispatchCMD(List list)
{
int length = list.Count;
for (int i = 0; i < length; i++)
{
Debug.Log(list[i].ToString());
}
}
}
目前只看了一下如何打开/关闭一个UI元素。原理就是发消息至DoozyUI 的 UIMangaer,比较简单。
代码示例如下:
///
/// 展示一个UI元素;
///
/// 元素名
/// 元素分类
public static void ShowUIElement(string elementName, string elementCategory = DUI.UNCATEGORIZED_CATEGORY_NAME)
{
UIElement.ShowUIElement(elementName, elementCategory);
}
///
/// 隐藏一个UI元素;
///
/// 元素名
/// 元素分类
/// 隐藏动画是否立即播放
public void HideUIElement(string elementName, string elementCategory = DUI.UNCATEGORIZED_CATEGORY_NAME, bool instantAction = false)
{
UIElement.HideUIElement(elementName, elementCategory, instantAction);
}