369 lines
9.5 KiB
C#
369 lines
9.5 KiB
C#
using System;
|
||
using Framework;
|
||
using PhxhSDK;
|
||
using UnityEngine;
|
||
using UnityEngine.Events;
|
||
using UnityEngine.UI;
|
||
using UnityEngine.Serialization;
|
||
using Object = System.Object;
|
||
|
||
public abstract class UIWindow : MonoBehaviour
|
||
{
|
||
private string mWindowName;
|
||
|
||
// 是否播放默认的打开对话框的声音
|
||
public bool isPlayDefaultOpenAudio = true;
|
||
// 是否播放默认的关闭对话框的声音
|
||
public bool isPlayDefaultCloseAudio = true;
|
||
|
||
public string WindowName
|
||
{
|
||
set { mWindowName = value; }
|
||
get { return mWindowName; }
|
||
}
|
||
|
||
[HideInInspector]
|
||
public UIWindowType m_WindowType;
|
||
[HideInInspector]
|
||
public UIWindowLayer uiWindowLayer;
|
||
|
||
[HideInInspector]
|
||
public bool isOpen = false;
|
||
|
||
void Awake()
|
||
{
|
||
//todo : it is only a i18n check, remove it..
|
||
// Text[] labels = this.transform.GetComponentsInChildren<Text>(true);
|
||
// foreach (Text label in labels)
|
||
// {
|
||
//DebugUtil.Log("find label : /"+label.text+"/");
|
||
// if (LocalizationManager.Instance.TryGetLocalizedString(label.text.Trim(), out var result))
|
||
// {
|
||
// label.text = result;
|
||
// }
|
||
// else
|
||
// {
|
||
// if (Regex.IsMatch(label.text, "[a-zA-Z]+"))
|
||
// {
|
||
// DebugUtil.LogError($"[{name}:{label.name}] cannot get i18n, text:[{label.text}] " +
|
||
// $"if it is a local text, use locale text pro instead and add i18n");
|
||
// }
|
||
// }
|
||
|
||
//label.text = LocalizationManager.Instance.GetLocalizedString(label.text.Trim());
|
||
//}
|
||
|
||
OnAwake();
|
||
}
|
||
|
||
public void OpenWindow()
|
||
{
|
||
Show();
|
||
OnOpenWindow();
|
||
if (isPlayDefaultOpenAudio)
|
||
{
|
||
//AudioManager3.Instance.PlaySound("");
|
||
}
|
||
}
|
||
|
||
public void OpenWindow(object data)
|
||
{
|
||
Show();
|
||
OnOpenWindow(data);
|
||
if (isPlayDefaultOpenAudio)
|
||
{
|
||
//AudioManager3.Instance.PlaySound("");
|
||
}
|
||
}
|
||
|
||
public void CloseWindow(bool destroy = false)
|
||
{
|
||
OnCloseWindow(destroy);
|
||
|
||
if (isPlayDefaultCloseAudio && isOpen)
|
||
{
|
||
//AudioManager3.Instance.PlaySound("");
|
||
|
||
}
|
||
|
||
//Global.hideZhezhao();
|
||
|
||
if (destroy)
|
||
{
|
||
Destroy();
|
||
}
|
||
else
|
||
{
|
||
Hide();
|
||
}
|
||
}
|
||
|
||
public void CloseSelf(bool destroy = true)
|
||
{
|
||
UIManager.Instance.CloseWindow(WindowName, destroy);
|
||
}
|
||
|
||
public bool OnBack()
|
||
{
|
||
//AudioManager.Instance.PlaySound(SfxNameConst.button_s);
|
||
return UIManager.Instance.CloseWindow(mWindowName, true);
|
||
}
|
||
|
||
public void ReloadWindow()
|
||
{
|
||
Show();
|
||
OnReloadWindow();
|
||
}
|
||
|
||
public void ReloadWindow(object data)
|
||
{
|
||
Show();
|
||
OnReloadWindow(data);
|
||
}
|
||
|
||
private void Show()
|
||
{
|
||
isOpen = true;
|
||
if (gameObject == null)
|
||
{
|
||
DebugUtil.Log("UI已被销毁:{0}", WindowName);
|
||
}
|
||
else
|
||
{
|
||
gameObject.SetActive(true);
|
||
}
|
||
}
|
||
|
||
private void Hide()
|
||
{
|
||
isOpen = false;
|
||
gameObject.SetActive(false);
|
||
}
|
||
|
||
private void Destroy()
|
||
{
|
||
isOpen = false;
|
||
Destroy(gameObject);
|
||
AssetManager.Instance.Unload(string.Format(UIManager.UI_PREFAB_PATH, mWindowName));
|
||
}
|
||
|
||
/// <summary>
|
||
/// 打开界面时调用
|
||
/// </summary>
|
||
/// <param name="data"></param>
|
||
protected virtual void OnOpenWindow(object data) { }
|
||
protected virtual void OnOpenWindow() { }
|
||
|
||
/// <summary>
|
||
/// 关闭界面时调用
|
||
/// </summary>
|
||
protected virtual void OnCloseWindow(bool destroy = false) { }
|
||
|
||
/// <summary>
|
||
/// 重新加载界面时调用
|
||
/// </summary>
|
||
protected virtual void OnReloadWindow(object data) { }
|
||
protected virtual void OnReloadWindow() { }
|
||
/// <summary>
|
||
/// 私有Awake方法,会在基类Awake执行后调用
|
||
/// </summary>
|
||
public abstract void OnAwake();
|
||
|
||
public GameObject BindButton(string target, Action action, bool playAudio = true)
|
||
{
|
||
GameObject obj = transform.Find(target)?.gameObject;
|
||
if (obj != null)
|
||
{
|
||
Button button = obj.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
button.onClick.AddListener
|
||
(
|
||
delegate ()
|
||
{
|
||
if (playAudio)
|
||
{
|
||
//AudioManager.Instance.PlaySound(SfxNameConst.button_s);
|
||
}
|
||
action?.Invoke();
|
||
}
|
||
);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DebugUtil.LogError("未找到 {0}/{1}", gameObject.name, target);
|
||
}
|
||
|
||
return obj;
|
||
}
|
||
|
||
//增加一个可绑定对应变量的点击事件
|
||
//传入GameObject
|
||
public GameObject BindButton(GameObject obj, Action action, bool playAudio = true)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
Button button = obj.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
button.onClick.AddListener
|
||
(
|
||
delegate ()
|
||
{
|
||
if (playAudio)
|
||
{
|
||
//AudioManager.Instance.PlaySound(SfxNameConst.button_s);
|
||
}
|
||
action?.Invoke();
|
||
}
|
||
);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DebugUtil.LogError("未找到 {0}/{1}", gameObject.name, obj.name);
|
||
}
|
||
|
||
return obj;
|
||
}
|
||
|
||
//传入参数
|
||
public GameObject BindButton<T>(GameObject obj, Action<T> action, T parameter, bool playAudio = true)
|
||
{
|
||
if (obj != null)
|
||
{
|
||
Button button = obj.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
button.onClick.AddListener
|
||
(
|
||
delegate ()
|
||
{
|
||
if (playAudio)
|
||
{
|
||
//AudioManager.Instance.PlaySound(SfxNameConst.button_s);
|
||
}
|
||
action?.Invoke(parameter);
|
||
}
|
||
);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DebugUtil.LogError("未找到 {0}/{1}", gameObject.name, obj.name);
|
||
}
|
||
|
||
return obj;
|
||
}
|
||
|
||
//直接绑按钮
|
||
public GameObject BindButton(Button button, Action action, bool playAudio = true)
|
||
{
|
||
if (button != null)
|
||
{
|
||
//Button button = button.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
button.onClick.AddListener
|
||
(
|
||
delegate ()
|
||
{
|
||
if (playAudio)
|
||
{
|
||
//AudioManager.Instance.PlaySound(SfxNameConst.button_s);
|
||
}
|
||
action?.Invoke();
|
||
}
|
||
);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DebugUtil.LogError("传入按钮为空,请检查按钮绑定参数!!!");
|
||
//DebugUtil.LogError($"未找到 {gameObject.name}/{button.name}");
|
||
return null;
|
||
}
|
||
|
||
return button.gameObject;
|
||
}
|
||
|
||
//可传入参数
|
||
public GameObject BindButton<T>(Button button, Action<T> action, T parameter, bool playAudio = true)
|
||
{
|
||
if (button != null)
|
||
{
|
||
//Button button = obj.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
button.onClick.AddListener
|
||
(
|
||
delegate ()
|
||
{
|
||
if (playAudio)
|
||
{
|
||
//AudioManager.Instance.PlaySound(SfxNameConst.button_s);
|
||
}
|
||
|
||
if (parameter == null)
|
||
{
|
||
DebugUtil.LogError("=== 传入参数为空! ===");
|
||
}
|
||
action?.Invoke(parameter);
|
||
}
|
||
);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
DebugUtil.LogError("传入按钮为空,请检查按钮绑定参数!!!");
|
||
return null;
|
||
}
|
||
|
||
return button.gameObject;
|
||
}
|
||
|
||
public void ClearBind(Button button)
|
||
{
|
||
if (button != null)
|
||
{
|
||
button.onClick.RemoveAllListeners();
|
||
}
|
||
}
|
||
|
||
public void ClearBind(GameObject go)
|
||
{
|
||
var button = go.GetComponent<Button>();
|
||
if (button != null)
|
||
{
|
||
button.onClick.RemoveAllListeners();
|
||
}
|
||
}
|
||
|
||
public GameObject FindObj(string path)
|
||
{
|
||
GameObject obj = transform.Find(path)?.gameObject;
|
||
if (obj == null)
|
||
{
|
||
DebugUtil.LogError("{0}未找到 {1}/{2}", mWindowName, gameObject.name, path);
|
||
}
|
||
return obj;
|
||
}
|
||
|
||
public T GetComponent<T>(string path) where T : Behaviour
|
||
{
|
||
var component = transform.Find(path)?.GetComponent<T>();
|
||
if (component == null)
|
||
{
|
||
DebugUtil.LogError("{0}未找到组件{1}: {2}", mWindowName, typeof(T).Name, path);
|
||
}
|
||
return component;
|
||
}
|
||
|
||
public void HideWindow()
|
||
{
|
||
Hide();
|
||
}
|
||
|
||
}
|