增加A2WToolBox工具集,增加Launch场景核LaunchPanel

This commit is contained in:
Wurui
2025-11-08 11:06:48 +08:00
parent 3e92e5684a
commit 3b43829e85
726 changed files with 87807 additions and 215 deletions

View 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()获取更简洁的类型名
}
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 8cb03ae6dcf0a2849a53591352e1f3c2
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:

View 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();
}
}

View File

@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b10ac54938c69c44a88aa6b89590aee7
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: