NLDClient-yudde/ProjectNLD/Assets/Code/Scripts/Framework/UI/UIWindow.cs

498 lines
12 KiB
C#
Raw Normal View History

2023-08-22 19:08:45 +08:00
using System;
2023-11-21 13:31:06 +08:00
using Cysharp.Threading.Tasks;
2023-10-19 15:00:19 +08:00
using Framework;
using PhxhSDK;
2023-08-22 19:08:45 +08:00
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.Serialization;
using Object = System.Object;
public abstract class UIWindow : MonoBehaviour
{
2023-11-21 13:31:06 +08:00
private const string DEFAULT_SHOW_ANIM = "show";
private const string DEFAULT_HIDE_ANIM = "hide";
2023-08-22 19:08:45 +08:00
private string mWindowName;
private ScreenOrientation _lastOrientation;
private Vector2 _offsets; //x,y代表左右的偏移量
2023-08-22 19:08:45 +08:00
// 是否播放默认的打开对话框的声音
public bool isPlayDefaultOpenAudio = true;
// 是否播放默认的关闭对话框的声音
public bool isPlayDefaultCloseAudio = true;
public string WindowName
{
set { mWindowName = value; }
get { return mWindowName; }
}
2023-11-21 13:31:06 +08:00
2023-08-22 19:08:45 +08:00
[HideInInspector]
public UIWindowLayer uiWindowLayer;
2023-10-19 15:00:19 +08:00
[HideInInspector]
private bool isOpen = false;
2023-08-22 19:08:45 +08:00
void Awake()
{
2024-01-23 12:25:47 +08:00
OnInit();
2023-08-22 19:08:45 +08:00
}
protected void OnStart()
{
_lastOrientation = Screen.orientation;
InitScreenUIOffset();
UpdateScreenAdaption();
}
protected void OnUpdate()
{
if (_lastOrientation != Screen.orientation)
{
//Debug.Log("Screen orientation has changed!");
// Add your orientation-specific actions here
// Update the last orientation for the next frame
_lastOrientation = Screen.orientation;
UpdateScreenAdaption();
//左右分别找到指定节点移动,当前的方案
//刘海屏适配
}
}
/// <summary>
/// 屏幕适配,目前方案是左右固定名称的节点下的各个物体需要适配,其他的不管
/// </summary>
protected void UpdateScreenAdaption()
{
2023-12-29 18:22:22 +08:00
var goLeft = transform.Find("UI_LiuHaiLeft")?.gameObject;
var goRight = transform.Find("UI_LiuHaiRight")?.gameObject;
if (goLeft)
{
var rectTrans = goLeft.GetComponent<RectTransform>();
var originPos = rectTrans.anchoredPosition;
rectTrans.anchoredPosition = new Vector2(_offsets.x, originPos.y);
}
if (goRight)
{
var rectTrans = goRight.GetComponent<RectTransform>();
var originPos = rectTrans.anchoredPosition;
rectTrans.anchoredPosition = new Vector2(_offsets.y, originPos.y);
}
}
protected void SetScreenOffsets(Vector2 offset)
{
_offsets = offset;
}
protected void InitScreenUIOffset()
{
var offset = DeviceHelper.GetWidthOffset();
2023-12-29 18:22:22 +08:00
var goLeft = transform.Find("UI_LiuHaiLeft")?.gameObject;
if (goLeft)
{
var rectTrans = goLeft.GetComponent<RectTransform>();
var originPos = rectTrans.anchoredPosition;
SetScreenOffsets(new Vector2(originPos.x + offset.x, 0));
}
2023-12-29 18:22:22 +08:00
GameObject goRight = transform.Find("UI_LiuHaiRight")?.gameObject;
if (goRight)
{
var rectTrans = goRight.GetComponent<RectTransform>();
var originPos = rectTrans.anchoredPosition;
SetScreenOffsets(new Vector2(_offsets.x, originPos.x - offset.y));
}
}
2023-11-16 15:32:40 +08:00
public void OpenWindow(object data)
2023-08-22 19:08:45 +08:00
{
Show(data);
2023-08-22 19:08:45 +08:00
if (isPlayDefaultOpenAudio)
{
//AudioManager3.Instance.PlaySound("");
}
}
2024-01-15 15:33:10 +08:00
public void CloseWindow(UIWindowCloseType closeType = UIWindowCloseType.HideAndDestroy)
2023-08-22 19:08:45 +08:00
{
2023-08-22 19:08:45 +08:00
if (isPlayDefaultCloseAudio && isOpen)
{
//AudioManager3.Instance.PlaySound("");
}
2023-11-21 13:31:06 +08:00
if (closeType == UIWindowCloseType.HideAndDestroy)
2023-08-22 19:08:45 +08:00
{
2024-01-15 15:33:10 +08:00
Close();
2023-08-22 19:08:45 +08:00
Destroy();
2023-11-21 13:31:06 +08:00
UIManager.Instance.RemoveWindow(mWindowName);
2023-08-22 19:08:45 +08:00
}
2024-01-15 15:33:10 +08:00
else if(closeType == UIWindowCloseType.OnlyHide)
{
Hide();
}
2023-08-22 19:08:45 +08:00
else
{
Hide();
2023-11-21 13:31:06 +08:00
if (closeType == UIWindowCloseType.HideAndPush)
{
UIManager.Instance.PushWindow(this);
}
2023-08-22 19:08:45 +08:00
}
}
2023-10-27 16:47:42 +08:00
public virtual async UniTask<bool> OnBack(object data = null)
2023-08-22 19:08:45 +08:00
{
var window = UIManager.Instance.PopWindow();
if (!window)
{
CloseWindow(UIWindowCloseType.HideAndDestroy);
return true;
}
await UIManager.AnimSwitchWindow(this, UIWindowCloseType.HideAndDestroy, window, data);
2023-11-21 13:31:06 +08:00
return true;
2023-08-22 19:08:45 +08:00
}
public void ReloadWindow()
{
2024-01-15 16:19:09 +08:00
if (isOpen)
{
OnShow();
OnReloadWindow();
return;
}
Show(null);
2023-08-22 19:08:45 +08:00
OnReloadWindow();
}
2023-10-19 15:00:19 +08:00
public void ReloadWindow(object data)
{
2024-01-15 16:19:09 +08:00
if (isOpen)
{
OnShow();
OnReloadWindow(data);
return;
}
Show(data);
2023-10-19 15:00:19 +08:00
OnReloadWindow(data);
}
public bool IsOpen()
2023-08-22 19:08:45 +08:00
{
return isOpen;
}
private void Show(object data)
{
var toTrue = (isOpen == false);
2023-08-22 19:08:45 +08:00
isOpen = true;
if (gameObject == null)
{
2023-10-19 15:00:19 +08:00
DebugUtil.Log("UI已被销毁:{0}", WindowName);
2023-08-22 19:08:45 +08:00
}
else
{
gameObject.SetActive(true);
}
if (toTrue)
{
2024-01-23 12:25:47 +08:00
OnOpenWindow(data);
2023-12-29 15:03:59 +08:00
}
2023-08-22 19:08:45 +08:00
}
2023-12-29 15:03:59 +08:00
private void ShowAgain()
2023-08-22 19:08:45 +08:00
{
2023-12-29 15:03:59 +08:00
gameObject.SetActive(true);
2024-01-15 15:33:10 +08:00
OnShow();
2023-12-29 15:03:59 +08:00
}
private void Hide(bool isOnlyHide = false)
{
2024-01-15 15:33:10 +08:00
gameObject.SetActive(false);
OnHide();
}
private void Close()
{
if (isOpen)
{
2024-01-15 15:33:10 +08:00
isOpen = false;
OnCloseWindow();
}
2023-08-22 19:08:45 +08:00
}
private void Destroy()
{
if (isOpen)
{
OnCloseWindow();
}
2023-08-22 19:08:45 +08:00
isOpen = false;
Destroy(gameObject);
2023-10-19 15:00:19 +08:00
AssetManager.Instance.Unload(string.Format(UIManager.UI_PREFAB_PATH, mWindowName));
2023-08-22 19:08:45 +08:00
}
2023-12-08 18:41:26 +08:00
2023-08-22 19:08:45 +08:00
/// <summary>
/// 打开界面时调用
/// </summary>
2023-10-19 15:00:19 +08:00
/// <param name="data"></param>
protected virtual void OnOpenWindow(object data) { }
2024-01-23 12:25:47 +08:00
//protected virtual void OnOpenWindow() { }
2023-08-22 19:08:45 +08:00
/// <summary>
/// 关闭界面时调用
/// </summary>
2023-11-21 13:31:06 +08:00
protected virtual void OnCloseWindow() { }
2023-08-22 19:08:45 +08:00
2024-01-15 15:12:51 +08:00
/// <summary>
/// 隐藏界面时调用
/// </summary>
protected virtual void OnHide()
{
2024-01-15 15:33:10 +08:00
}
/// <summary>
/// 重新展示界面时调用
/// </summary>
protected virtual void OnShow()
{
2024-01-15 15:12:51 +08:00
}
2023-08-22 19:08:45 +08:00
/// <summary>
/// 重新加载界面时调用
/// </summary>
2023-10-19 15:00:19 +08:00
protected virtual void OnReloadWindow(object data) { }
2023-08-22 19:08:45 +08:00
protected virtual void OnReloadWindow() { }
/// <summary>
/// 私有Awake方法会在基类Awake执行后调用
/// </summary>
2024-01-23 12:25:47 +08:00
public abstract void OnInit();
2023-08-22 19:08:45 +08:00
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
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("未找到 {0}/{1}", gameObject.name, target);
2023-08-22 19:08:45 +08:00
}
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
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("未找到 {0}/{1}", gameObject.name, obj.name);
2023-08-22 19:08:45 +08:00
}
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
{
2023-10-19 15:00:19 +08:00
DebugUtil.LogError("未找到 {0}/{1}", gameObject.name, obj.name);
2023-08-22 19:08:45 +08:00
}
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;
}
2023-10-19 15:00:19 +08:00
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();
}
}
2023-08-22 19:08:45 +08:00
public GameObject FindObj(string path)
{
GameObject obj = transform.Find(path)?.gameObject;
2023-10-19 15:00:19 +08:00
if (obj == null)
{
DebugUtil.LogError("{0}未找到 {1}/{2}", mWindowName, gameObject.name, path);
}
2023-08-22 19:08:45 +08:00
return obj;
}
public T GetComponent<T>(string path) where T : Behaviour
{
2023-10-19 15:00:19 +08:00
var component = transform.Find(path)?.GetComponent<T>();
if (component == null)
{
DebugUtil.LogError("{0}未找到组件{1} {2}", mWindowName, typeof(T).Name, path);
}
return component;
2023-08-22 19:08:45 +08:00
}
2023-12-29 15:03:59 +08:00
public void HideWindow(bool isOnlyHide = false)
{
Hide(isOnlyHide);
}
public void ShowWindow()
2023-08-22 19:08:45 +08:00
{
2023-12-29 15:03:59 +08:00
ShowAgain();
2023-08-22 19:08:45 +08:00
}
2023-11-21 15:12:51 +08:00
public async UniTask PlayAnimation(string name)
2023-11-21 13:31:06 +08:00
{
}
2023-11-21 15:12:51 +08:00
public async UniTask AnimShow()
{
await PlayAnimation(DEFAULT_SHOW_ANIM);
2023-11-21 13:31:06 +08:00
}
2023-11-21 15:12:51 +08:00
public async UniTask AnimHide()
2023-11-21 13:31:06 +08:00
{
2023-11-21 15:12:51 +08:00
await PlayAnimation(DEFAULT_HIDE_ANIM);
2023-11-21 13:31:06 +08:00
}
2023-08-22 19:08:45 +08:00
}