diff --git a/Assets/06.UIFarme/Editor.meta b/Assets/06.UIFarme/Editor.meta
new file mode 100644
index 0000000..293a95e
--- /dev/null
+++ b/Assets/06.UIFarme/Editor.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 07a23b2035fb4e9429f158b54adfc2c7
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/06.UIFarme/Editor/UIFarme.Editor.asmdef b/Assets/06.UIFarme/Editor/UIFarme.Editor.asmdef
new file mode 100644
index 0000000..58838e4
--- /dev/null
+++ b/Assets/06.UIFarme/Editor/UIFarme.Editor.asmdef
@@ -0,0 +1,16 @@
+{
+ "name": "UIFarme.Editor",
+ "rootNamespace": "",
+ "references": [],
+ "includePlatforms": [
+ "Editor"
+ ],
+ "excludePlatforms": [],
+ "allowUnsafeCode": false,
+ "overrideReferences": false,
+ "precompiledReferences": [],
+ "autoReferenced": true,
+ "defineConstraints": [],
+ "versionDefines": [],
+ "noEngineReferences": false
+}
\ No newline at end of file
diff --git a/Assets/06.UIFarme/Editor/UIFarme.Editor.asmdef.meta b/Assets/06.UIFarme/Editor/UIFarme.Editor.asmdef.meta
new file mode 100644
index 0000000..1ca21e3
--- /dev/null
+++ b/Assets/06.UIFarme/Editor/UIFarme.Editor.asmdef.meta
@@ -0,0 +1,7 @@
+fileFormatVersion: 2
+guid: 7993b466f8c5d9649a198003062d5429
+AssemblyDefinitionImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/06.UIFarme/RunTime.meta b/Assets/06.UIFarme/RunTime.meta
new file mode 100644
index 0000000..e5dcd05
--- /dev/null
+++ b/Assets/06.UIFarme/RunTime.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: 5e343365c5f97e647bc8d60d842c49bd
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/06.UIFarme/RunTime/Base.meta b/Assets/06.UIFarme/RunTime/Base.meta
new file mode 100644
index 0000000..75e6435
--- /dev/null
+++ b/Assets/06.UIFarme/RunTime/Base.meta
@@ -0,0 +1,8 @@
+fileFormatVersion: 2
+guid: da2206dfe63228d4983a39725c0e940c
+folderAsset: yes
+DefaultImporter:
+ externalObjects: {}
+ userData:
+ assetBundleName:
+ assetBundleVariant:
diff --git a/Assets/06.UIFarme/RunTime/Base/BasePanel.cs b/Assets/06.UIFarme/RunTime/Base/BasePanel.cs
new file mode 100644
index 0000000..0484544
--- /dev/null
+++ b/Assets/06.UIFarme/RunTime/Base/BasePanel.cs
@@ -0,0 +1,218 @@
+using System.Collections.Generic;
+using System.Threading.Tasks;
+using DG.Tweening;
+using UnityEngine;
+using UnityEngine.UI;
+using YooAsset;
+
+namespace Stary.Evo.UIFarme
+{
+ public interface IBasePanel : IController
+ {
+ ///
+ /// UI信息
+ ///
+ string UIPath { get; set; }
+
+ ///
+ /// 绑定这个面板的实例
+ ///
+ void Initialize(GameObject panelGo);
+
+ ///
+ /// 初始化面板管理器
+ ///
+ ///
+ void Initialize(IPanelSystem sysytem);
+
+ ///
+ /// 虚方法,UI进入时执行的操作,只会执行一次
+ ///
+ void OnEnter();
+
+ ///
+ /// 虚方法,UI暂停时执行的操作,只会执行一次
+ ///
+ void OnPause();
+
+ ///
+ /// 虚方法,UI继续时执行的操作,只会执行一次
+ ///
+ void OnResume();
+
+ ///
+ /// 虚方法,UI退出时执行的操作,只会执行一次
+ ///
+ void OnExit(float delay = 0f);
+
+ void OnDestroy();
+
+
+ ///
+ /// 生成/获取一个UI对象
+ ///
+ /// ui信息
+ ///
+ Task CreatePanel();
+
+ ///
+ /// 销毁一个Ui对象
+ ///
+ ///
+ void DestoryUI();
+
+ void SetPanelParent(Transform parent);
+ }
+
+ ///
+ ///所有UI面板的父类,包含UI面板的状态信息
+ ///
+ public abstract class BasePanel : IBasePanel
+ {
+ ///
+ /// UI信息
+ ///
+ public string UIPath { get; set; }
+
+ ///
+ /// 面板管理器
+ ///
+ protected IPanelSystem PanelSystem { get; private set; }
+
+ ///
+ /// 生成的父物体
+ ///
+ protected Transform panelParent{get; private set;}
+
+
+ ///
+ /// 缓存该面板所有的Button,Toggle,Slider,InputField,Dropdown,ScroolBar
+ ///
+ private Dictionary selectableDict;
+
+ protected CanvasGroup canvasGroup{get;private set;}
+
+ protected GameObject activePanel{get;private set;}
+
+ protected BasePanel(string uiPath)
+ {
+ UIPath = uiPath;
+ selectableDict = new Dictionary();
+ }
+
+ public virtual void Initialize(GameObject panelGo)
+ {
+ activePanel = panelGo;
+ Selectable[] selectables = activePanel.GetComponentsInChildren(true);
+ foreach (Selectable item in selectables)
+ {
+ selectableDict[item.name] = item;
+ }
+
+ canvasGroup = UITool.GetOrAddComponent(activePanel);
+ canvasGroup.alpha = 0f;
+ }
+
+ public virtual void Initialize(IPanelSystem sysytem)
+ {
+ PanelSystem = sysytem;
+ }
+
+
+ public virtual void OnEnter()
+ {
+ activePanel.SetActive(true);
+ canvasGroup.blocksRaycasts = true;
+ canvasGroup.DOFade(1f, 1f);
+ }
+
+ public virtual void OnPause()
+ {
+ canvasGroup.blocksRaycasts = false;
+ }
+
+ public virtual void OnResume()
+ {
+ canvasGroup.blocksRaycasts = true;
+ }
+
+ public virtual void OnExit(float delay = 0f)
+ {
+ canvasGroup.DOFade(0f, delay).OnComplete(() =>
+ {
+ activePanel.SetActive(false);
+ canvasGroup.blocksRaycasts = false;
+ });
+ }
+
+ public virtual void OnDestroy()
+ {
+ DestoryUI();
+ }
+
+
+ public async Task CreatePanel()
+ {
+ if (panelParent == null)
+ {
+ Debug.LogError($"UnityEvo:parent为空,{this.UIPath}无法创建,进程已中断,请检查!!!!!");
+ return null;
+ }
+
+ if (!panelParent.GetComponent