增加A2WToolBox工具集,增加Launch场景核LaunchPanel
This commit is contained in:
141
Assets/A2WToolBox/Runtime/UIManager/UIManager.cs
Normal file
141
Assets/A2WToolBox/Runtime/UIManager/UIManager.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using A2W;
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System.Linq;
|
||||
|
||||
namespace A2W
|
||||
{
|
||||
public class UIManager : Singleton<UIManager>
|
||||
{
|
||||
public const string panel_prefabs_dir_path = "Assets/Gameplay/Prefabs/UIPanel/"; // UI面板预制体目录
|
||||
|
||||
// 这里保存IUIPanel的list
|
||||
List<UIPanel> panels;
|
||||
private Canvas mainCanvas;
|
||||
private GameObject canvasObject;
|
||||
|
||||
private string defaultPanelPath;
|
||||
|
||||
public void Init(string defaultPanelPath = panel_prefabs_dir_path)
|
||||
{
|
||||
this.defaultPanelPath = defaultPanelPath;
|
||||
|
||||
if (panels is null)
|
||||
{
|
||||
panels = new List<UIPanel>();
|
||||
}
|
||||
|
||||
// 生成canvas
|
||||
CreateCanvas();
|
||||
}
|
||||
|
||||
public void DestroyAllExceptLoading()
|
||||
{
|
||||
var panelsToRemove = panels.Where(panel => !(panel is ITransition)).ToList();
|
||||
|
||||
foreach (var panel in panelsToRemove)
|
||||
{
|
||||
Destroy(panel.gameObject);
|
||||
panels.Remove(panel);
|
||||
}
|
||||
}
|
||||
|
||||
private void CreateCanvas()
|
||||
{
|
||||
if (canvasObject is not null) return;
|
||||
|
||||
canvasObject = new GameObject("UICanvas");
|
||||
canvasObject.transform.SetParent(transform, false);
|
||||
|
||||
mainCanvas = canvasObject.AddComponent<Canvas>();
|
||||
mainCanvas.renderMode = RenderMode.ScreenSpaceOverlay;
|
||||
//mainCanvas.sortingOrder = 1000;
|
||||
|
||||
UnityEngine.UI.CanvasScaler canvasScaler = canvasObject.AddComponent<UnityEngine.UI.CanvasScaler>();
|
||||
canvasScaler.uiScaleMode = UnityEngine.UI.CanvasScaler.ScaleMode.ScaleWithScreenSize;
|
||||
canvasScaler.referenceResolution = new Vector2(Screen.width, Screen.height);
|
||||
|
||||
canvasObject.AddComponent<UnityEngine.UI.GraphicRaycaster>();
|
||||
}
|
||||
|
||||
public async UniTask<T> InitPanel<T>() where T : UIPanel
|
||||
{
|
||||
// 在这里加载对应panel的预制体
|
||||
T panel = (T)await Resources.LoadAsync<T>(GetPanelPath<T>());
|
||||
|
||||
// 加载完了以后存在panels里
|
||||
if (panel != null)
|
||||
{
|
||||
panel.transform.SetParent(mainCanvas.transform, false);
|
||||
panels.Add(panel);
|
||||
|
||||
panel.Init();
|
||||
}
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
public async UniTask<T> InitPanel<T>(string path) where T : UIPanel
|
||||
{
|
||||
// 在这里加载对应panel的预制体
|
||||
T panel = (T)await Resources.LoadAsync<T>(GetPanelPath<T>());
|
||||
|
||||
// 加载完了以后存在panels里
|
||||
if (panel != null)
|
||||
{
|
||||
panel.transform.SetParent(mainCanvas.transform, false);
|
||||
panels.Add(panel);
|
||||
|
||||
panel.Init();
|
||||
}
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
public async UniTask<T> ShowPanel<T>() where T : UIPanel
|
||||
{
|
||||
// 先判断panels里有没有对应的panel,没有就先调用InitPanel
|
||||
T panel = GetPanel<T>();
|
||||
if (panel == null)
|
||||
{
|
||||
await InitPanel<T>();
|
||||
panel = GetPanel<T>();
|
||||
}
|
||||
|
||||
// 播放Show动画 直接调用UIPanel的 public abstract UniTask Show();
|
||||
if (panel != null)
|
||||
{
|
||||
await panel.Show();
|
||||
}
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
public async UniTask<T> HidePanel<T>() where T : UIPanel
|
||||
{
|
||||
// 播放Hide动画 直接调用UIPanel的 public abstract UniTask Hide();
|
||||
T panel = GetPanel<T>();
|
||||
if (panel != null)
|
||||
{
|
||||
await panel.Hide();
|
||||
}
|
||||
|
||||
// 后续会增加回收机制,资源紧张时释放不需要的panel
|
||||
|
||||
return panel;
|
||||
}
|
||||
|
||||
public T GetPanel<T>() where T : UIPanel
|
||||
{
|
||||
if (panels == null) return null;
|
||||
return panels.OfType<T>().FirstOrDefault();
|
||||
}
|
||||
|
||||
private string GetPanelPath<T>() where T : UIPanel
|
||||
{
|
||||
return defaultPanelPath + typeof(T).Name; // 使用Name而不是ToString()获取更简洁的类型名
|
||||
}
|
||||
}
|
||||
}
|
||||
11
Assets/A2WToolBox/Runtime/UIManager/UIManager.cs.meta
Normal file
11
Assets/A2WToolBox/Runtime/UIManager/UIManager.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8cb03ae6dcf0a2849a53591352e1f3c2
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
19
Assets/A2WToolBox/Runtime/UIManager/UIPanel.cs
Normal file
19
Assets/A2WToolBox/Runtime/UIManager/UIPanel.cs
Normal file
@@ -0,0 +1,19 @@
|
||||
using Cysharp.Threading.Tasks;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
|
||||
namespace A2W
|
||||
{
|
||||
public abstract class UIPanel : MonoBehaviour
|
||||
{
|
||||
public abstract void Init();
|
||||
|
||||
public abstract UniTask Show();
|
||||
|
||||
public abstract UniTask Hide();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
11
Assets/A2WToolBox/Runtime/UIManager/UIPanel.cs.meta
Normal file
11
Assets/A2WToolBox/Runtime/UIManager/UIPanel.cs.meta
Normal file
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b10ac54938c69c44a88aa6b89590aee7
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
Reference in New Issue
Block a user