using System;
using Cysharp.Threading.Tasks;
using Framework;
using PhxhSDK;
using UnityEngine;
using UnityEngine.Events;
using UnityEngine.UI;
using UnityEngine.Serialization;
using Object = System.Object;
public abstract class UIWindow
{
public GameObject gameObject;
public Transform transform;
public RectTransform rectTransform;
public string name;
private const string DEFAULT_SHOW_ANIM = "show";
private const string DEFAULT_HIDE_ANIM = "hide";
private string mWindowName;
private ScreenOrientation _lastOrientation;
private Vector2 _offsets; //x,y代表左右的偏移量
private bool _isNeedScreenAdaption;
// 是否播放默认的打开对话框的声音
public bool isPlayDefaultOpenAudio = true;
// 是否播放默认的关闭对话框的声音
public bool isPlayDefaultCloseAudio = true;
public string WindowName
{
set { mWindowName = value; }
get { return mWindowName; }
}
[HideInInspector]
public UIWindowLayer uiWindowLayer;
[HideInInspector]
private bool isOpen = false;
private bool _isHideAndPush = false;
protected void RegisterScreenAdaption()
{
_lastOrientation = Screen.orientation;
InitScreenUIOffset();
UpdateScreenAdaption();
_isNeedScreenAdaption = true;
}
protected virtual void OnUpdate()
{
if (_isNeedScreenAdaption && _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();
//左右分别找到指定节点移动,当前的方案
//刘海屏适配
}
}
public void Update()
{
OnUpdate();
}
#region MonoBehaviour Methods Override
protected void Destroy(GameObject obj)
{
UnityEngine.Object.Destroy(obj);
}
protected void DestroyImmediate(GameObject obj)
{
UnityEngine.Object.DestroyImmediate(obj);
}
protected void Destroy(Component cmp)
{
UnityEngine.Object.Destroy(cmp);
}
protected void DestroyImmediate(Component cmp)
{
UnityEngine.Object.DestroyImmediate(cmp);
}
protected GameObject Instantiate(GameObject prefab)
{
return UnityEngine.Object.Instantiate(prefab, transform);
}
protected GameObject Instantiate(GameObject prefab, Transform trans)
{
return UnityEngine.Object.Instantiate(prefab, trans);
}
#endregion
#region #ScreenAdaption
///
/// 屏幕适配,目前方案是左右固定名称的节点下的各个物体需要适配,其他的不管
///
protected void UpdateScreenAdaption()
{
var goLeft = transform.Find("UI_LiuHaiLeft")?.gameObject;
var goRight = transform.Find("UI_LiuHaiRight")?.gameObject;
if (goLeft)
{
var rectTrans = goLeft.GetComponent();
var originPos = rectTrans.anchoredPosition;
rectTrans.anchoredPosition = new Vector2(_offsets.x, originPos.y);
}
if (goRight)
{
var rectTrans = goRight.GetComponent();
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();
var goLeft = transform.Find("UI_LiuHaiLeft")?.gameObject;
if (goLeft)
{
var rectTrans = goLeft.GetComponent();
var originPos = rectTrans.anchoredPosition;
SetScreenOffsets(new Vector2(originPos.x + offset.x, 0));
}
GameObject goRight = transform.Find("UI_LiuHaiRight")?.gameObject;
if (goRight)
{
var rectTrans = goRight.GetComponent();
var originPos = rectTrans.anchoredPosition;
SetScreenOffsets(new Vector2(_offsets.x, originPos.x - offset.y));
}
}
#endregion
public void OpenWindow(object data = null)
{
PreLoad(data);
if (!isOpen)
{
OnInit();
}
Show(data);
if (isPlayDefaultOpenAudio)
{
//AudioManager3.Instance.PlaySound("");
}
}
public void CloseWindow(UIWindowCloseType closeType = UIWindowCloseType.HideAndDestroy)
{
if (isPlayDefaultCloseAudio && isOpen)
{
//AudioManager3.Instance.PlaySound("");
}
if (closeType == UIWindowCloseType.HideAndDestroy)
{
var last = UIManager.Instance.GetLast();
if (last == this)
{
UIManager.Instance.PopWindow();
}
_OnClose();
DestroyWindow();
UIManager.Instance.RemoveWindow(mWindowName);
}
else if(closeType == UIWindowCloseType.OnlyHide)
{
Hide();
}
else if(closeType == UIWindowCloseType.HideAndPush)
{
Hide();
//UIManager.Instance.PushWindow(this);
}
else
{
//强制清除所有界面时使用
DestroyWindow();
UIManager.Instance.RemoveWindow(mWindowName);
}
}
public virtual async UniTask OnBack(object data = null)
{
var window = UIManager.Instance.PopWindow();
if (window == null)
{
CloseWindow(UIWindowCloseType.HideAndDestroy);
return true;
}
await UIManager.AnimSwitchWindow(this, UIWindowCloseType.HideAndDestroy, window, data);
return true;
}
public void ReloadWindow(object data)
{
if (isOpen)
{
OnReloadWindow(data);
return;
}
Show(data);
OnReloadWindow(data);
}
public bool IsOpen()
{
return isOpen;
}
private void Show(object data)
{
var toTrue = (isOpen == false);
isOpen = true;
_isHideAndPush = false;
if (gameObject == null)
{
DebugUtil.Log("UI已被销毁:{0}", WindowName);
}
else
{
gameObject.SetActive(true);
}
// if (toTrue)
// {
OnShowWindow(data);
//}
}
private void ShowAgain()
{
if (gameObject)
{
gameObject.SetActive(true);
}
//OnShow();
}
private void Hide(bool isOnlyHide = false)
{
gameObject.SetActive(false);
if (!isOnlyHide)
{
OnHideWindow();
_isHideAndPush = true;
}
}
private void _OnClose()
{
if (UIManager.Instance.UiWindowStack.Count <= 0)
{
return;
}
if (UIManager.Instance.CheckWindowIsFullScreen(this))
{
var window = UIManager.Instance.GetLastFullScreen();
if (window != null && window != this)
{
if (UIManager.Instance.CheckIsWindowInStack(this))
{
UIManager.Instance.ForceRemoveWindow(this);
}
}
for (int i = UIManager.Instance.UiWindowStack.Count - 1; i >= 0; i--)
{
var latestWindow = UIManager.Instance.UiWindowStack[i];
latestWindow.OpenWindow();
if (UIManager.Instance.CheckWindowIsFullScreen(latestWindow))
break;
}
}
else
{
UIManager.Instance.ForceRemoveWindow(this);
}
}
private void DestroyWindow()
{
if (isOpen)
{
OnHideWindow();
OnRelease();
}
isOpen = false;
UnityEngine.Object.Destroy(gameObject);
AssetManager.Instance.Unload(string.Format(UIManager.UI_PREFAB_PATH, mWindowName));
}
///
///预加载,传入参数,不能添加监听
///
public virtual void PreLoad(object data = null)
{
}
///
/// 打开界面时调用
///
///
protected virtual void OnShowWindow(object data) { }
//protected virtual void OnOpenWindow() { }
///
/// 关闭界面时调用
///
protected virtual void OnHideWindow() { }
///
/// 重新加载界面时调用
///
protected virtual void OnReloadWindow(object data) { }
///
/// 私有Awake方法,会在基类Awake执行后调用
///
public abstract void OnInit();
///
/// 对应OnInit,在销毁掉界面时调用
///
public virtual void OnRelease(){}
#region #Bind Component
public GameObject BindButton(string target, Action action, bool playAudio = true)
{
GameObject obj = transform.Find(target)?.gameObject;
if (obj != null)
{
Button button = obj.GetComponent