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) { if (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() { 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