Files
Fishing2/Assets/Scripts/NBC/UI/Runtime/Component/UIPanel.cs
2025-05-26 00:06:37 +08:00

283 lines
7.5 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
using System;
using System.Collections.Generic;
using FairyGUI;
using UnityEngine;
namespace NBC
{
public abstract class UIPanel : IUIPanel
{
public static Func<string, string> GetUIPackNameFunc = s => $"{s}/{s}";
/// <summary>
/// 是否显示在最顶层
/// </summary>
public bool IsTop => _ui.IsTop(this);
/// <summary>
/// 是否显示黑色背景蒙版
/// </summary>
public bool IsModal { get; protected set; }
public virtual bool IsShowing => ContentPane != null && ContentPane.parent != null;
public virtual bool IsCanVisible => ContentPane != null && ContentPane.parent != null && ContentPane.visible;
public bool IsDotDel { get; protected set; }
public virtual string UIPackRootUrl => string.Empty;
public virtual string UIPackName { get; set; }
public virtual string UIResName { get; set; }
/// <summary>
/// 模块id(可用于对模块编号实现一些特定功能,如新手引导)
/// </summary>
public virtual int Id { get; protected set; }
/// <summary>
/// 是否显示光标,屏蔽游戏内输入
/// </summary>
public virtual bool IsShowCursor { get; protected set; }
/// <summary>
/// 面板打开动画
/// </summary>
public NTask ShowAnim = null;
/// <summary>
/// 面板关闭动画
/// </summary>
public NTask HideAnim = null;
private object _paramData;
private bool _isInited;
public GComponent ContentPane { get; protected set; }
protected UIManager _ui;
public void SetUIManager(UIManager manager)
{
_ui = manager;
}
public void SetData(object args)
{
_paramData = args;
}
public object GetData()
{
return _paramData;
}
public virtual string[] GetDependPackages()
{
return new string[] { };
}
public virtual Dictionary<string, string> GetLanguageConfig()
{
return new Dictionary<string, string>();
}
public void Init()
{
try
{
var uiPackRootUrl = string.IsNullOrEmpty(UIPackRootUrl) ? UIConst.UIPackRootUrl : UIPackRootUrl;
//实例化预设
if (!_isInited)
{
var dependPackages = GetDependPackages();
if (dependPackages != null && dependPackages.Length > 0)
{
foreach (var package in dependPackages)
{
if (package != UIPackName)
{
_ui.AddPackage(uiPackRootUrl, GetUIPackNameFunc(package));
}
}
}
_ui.AddPackage(uiPackRootUrl, GetUIPackNameFunc(UIPackName));
GObject panelObj = UIPackage.CreateObject(UIPackName, UIResName);
if (panelObj == null)
{
throw new Exception("不存在包名:" + UIPackName + "/ResName=" + UIResName);
}
// panelObj.name = UIResName;
panelObj.SetSize(GRoot.inst.width, GRoot.inst.height);
panelObj.position = Vector3.zero;
panelObj.ToSafeArea();
panelObj.scale = Vector2.one;
panelObj.pivotX = 0.5f;
panelObj.pivotY = 0.5f;
ContentPane = panelObj.asCom;
ContentPane.name = UIResName;
this.AutoFindAllField();
OnInit();
// FairyBatching
GComponent panelObjCom = panelObj.asCom;
if (panelObjCom != null)
{
panelObjCom.fairyBatching = true;
}
_isInited = true;
}
}
catch (Exception e)
{
Log.Error(e);
throw;
}
}
public void Show()
{
try
{
if (!IsShowing)
{
GRoot.inst.AddChild(ContentPane);
_ui.AdjustModalLayer();
}
else
{
if (!IsTop) _ui.BringToFront(this);
}
if (ShowAnim != null)
{
ShowAnim.OnCompleted(OpenAnimFinished, true);
ShowAnim.Run(UIRunner.Def);
}
else
{
OpenAnimFinished(null);
}
}
catch (Exception e)
{
Log.Error($"UIPackName={UIPackName} UIResName={UIResName} e={e}");
throw;
}
}
public void Hide()
{
if (!IsShowing) return;
if (HideAnim != null)
{
HideAnim.OnCompleted(HideAnimFinished);
HideAnim.Run(UIRunner.Def);
}
else
{
HideAnimFinished(null);
}
}
public void Update()
{
OnUpdate();
}
public void Refresh()
{
Show();
}
public void HideImmediately()
{
// ContentPane.visible = false;
if (ContentPane.parent != null)
{
// UIKit.
GRoot.inst.RemoveChild(ContentPane);
_ui.AdjustModalLayer();
_ui?.DispatchEventWith(UIEvents.UIHide, this);
// UIKit.LayerManager.RemoveChild(this);
}
OnHide();
}
public void Dispose()
{
if (!IsDotDel)
{
HideImmediately();
ContentPane.Dispose();
OnDestroy();
}
else
{
Log.Error("当前panel标记为不可删除name=" + UIResName);
}
}
/// <summary>
/// 打开动画播放完成
/// </summary>
/// <param name="task"></param>
private void OpenAnimFinished(ITask task)
{
OnShow();
_ui?.DispatchEventWith(UIEvents.UIShow, this);
}
/// <summary>
/// 关闭动画播放完成
/// </summary>
/// <param name="task"></param>
private void HideAnimFinished(ITask task)
{
HideImmediately();
}
#region
/// <summary>
/// 界面初始化的时候
/// </summary>
protected virtual void OnInit()
{
}
/// <summary>
/// 显示界面显示完成
/// </summary>
/// <param name="param"></param>
protected virtual void OnShow()
{
}
protected virtual void OnUpdate()
{
}
/// <summary>
/// 界面隐藏的时候
/// </summary>
protected virtual void OnHide()
{
}
/// <summary>
/// 界面销毁的时候
/// </summary>
protected virtual void OnDestroy()
{
}
#endregion
}
}