public class WaitingView : MonoSingleton<WaitingView>, IPointerClickHandler
{
public static WaitingView mInstance;
Action<object> _CBTimeout;
object _Param;
Coroutine _TimeCounter;
private List<GameObject> _ExecutableGos = new List<GameObject>();
public GameObject _UIObject;
public GameObject _UIObjectText;
private bool _ForceWait;
public override void Awake()
{
mInstance = this;
base.Awake();
gameObject.SetActive(false);
}
public void StartWait(float timeout, Action<object> cb = null,object param = null,bool forceWait = false)
{
_UIObject.SetActive(true);
_UIObjectText.SetActive(false);
StartWaiting(timeout,cb,param,forceWait);
}
public void StartWaitWithoutImage(float timeout, Action<object> cb = null, object param = null, bool forceWait = false)
{
_UIObject.SetActive(false);
_UIObjectText.SetActive(false);
StartWaiting(timeout, cb, param, forceWait);
}
public void StartWaitAddText(float timeout,string title, Action<object> cb = null, object param = null, bool forceWait = false)
{
if (!String.IsNullOrEmpty(title))
{
_UIObjectText.GetComponentInChildren<LocalizedText>().SetLocalizationName(title);
}
_UIObjectText.SetActive(true);
_UIObject.SetActive(false);
StartWaiting(timeout, cb, param, forceWait);
}
void StartWaiting(float timeout, Action<object> cb, object param, bool forceWait)
{
gameObject.SetActive(true);
_CBTimeout = cb;
_Param = param;
_ForceWait = forceWait;
_TimeCounter = StartCoroutine(TimeCounter(timeout));
}
void CloseWaiting() {
gameObject.SetActive(false);
_ForceWait = false;
if (_TimeCounter != null)
{
StopCoroutine(_TimeCounter);
}
}
IEnumerator TimeCounter(float timeout)
{
yield return new WaitForSeconds(timeout);
if (_CBTimeout != null)
{
_CBTimeout(_Param);
}
CloseWaiting();
}
public void StopWait()
{
CloseWaiting();
}
public bool IsWaitingView() {
if (_UIObject.activeInHierarchy || _UIObjectText.activeInHierarchy)
{
return true;
}
else {
return false;
}
}
public bool IsForceWait() {
return _ForceWait;
}
#region EventData
public void AddExecutableObject(GameObject go) {
if (!_ExecutableGos.Contains(go))
{
_ExecutableGos.Add(go);
}
}
public void RemoveExecutableObject(GameObject go) {
if (!_ExecutableGos.Contains(go))
{
_ExecutableGos.Remove(go);
}
}
public void OnPointerClick(PointerEventData eventData)
{
PassEvent(eventData, ExecuteEvents.pointerClickHandler);
}
//把事件透下去
public void PassEvent<T>(PointerEventData data, ExecuteEvents.EventFunction<T> function) where T : IEventSystemHandler
{
if (_ExecutableGos.Count == 0)
{
return;
}
List<RaycastResult> results = new List<RaycastResult>();
EventSystem.current.RaycastAll(data, results);
for (int i = 0; i < results.Count; i++)
{
if (_ExecutableGos.Contains(results[i].gameObject))
{
ExecuteEvents.Execute(results[i].gameObject, data, function);
}
}
}
#endregion
}