创建开始菜单面板和设置面板

- 添加 MenuForm 与 SettingForm
- 为带左右按钮的水平选择界面添加HorizonSelectGroup预制件。
- 添加游戏核心可配置项
This commit is contained in:
SepComet
2026-02-10 15:10:31 +08:00
parent 7ac832f74b
commit 13583354f9
111 changed files with 11247 additions and 755 deletions
@@ -0,0 +1,96 @@
using CustomComponent;
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace UI
{
public class CombineFormController : IFormController<CombineFormContext>
{
private CombineComponent _controller;
private CombineForm _combineForm;
private int? _formSerialId;
private CombineFormContext _context;
public CombineFormController(CombineComponent controller)
{
_controller = controller;
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OpenUIFormSuccess);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, CloseUIFormComplete);
}
public int? OpenUI(CombineFormContext context)
{
if (_controller == null)
{
_controller = GameEntry.Combine;
}
if (_controller == null)
{
Log.Warning("CombineFormController open failed. Controller is null.");
return null;
}
if (context != null)
{
_controller.SetFormContext(context);
}
_context = _controller.GetFormContext();
if (_context == null)
{
Log.Warning("CombineFormController open failed. Form context is null.");
return null;
}
_formSerialId = GameEntry.UI.OpenUIForm(UIFormId.CombineForm, _context);
return _formSerialId;
}
public void CloseUI()
{
if (_formSerialId.HasValue)
{
GameEntry.UI.CloseUIForm(_formSerialId.Value);
return;
}
if (_combineForm != null)
{
_combineForm.Close();
}
}
~CombineFormController()
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OpenUIFormSuccess);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, CloseUIFormComplete);
}
private void OpenUIFormSuccess(object sender, GameEventArgs e)
{
if (!(e is OpenUIFormSuccessEventArgs args)) return;
if (args.UserData == _context)
{
_combineForm = args.UIForm.Logic as CombineForm;
}
}
private void CloseUIFormComplete(object sender, GameEventArgs e)
{
if (!(e is CloseUIFormCompleteEventArgs args)) return;
if (args.SerialId == _formSerialId)
{
_combineForm = null;
_formSerialId = null;
_context = null;
}
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: ff5681c108fbc6c4680287e385ddaa12
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,168 @@
using System;
using Definition.Enum;
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace UI
{
public class DialogFormController : IFormController<DialogFormContext>
{
private DialogFormContext _context;
private DialogFormBase _dialogForm;
private int? _formSerialId;
private bool _pendingRefresh;
public DialogFormController()
{
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnCloseUIFormComplete);
}
public int? OpenUI(DialogFormContext context)
{
if (context == null)
{
Log.Warning("DialogFormController open failed. context is null.");
return null;
}
_context = context;
UIFormId targetFormId = MapDialogFormId(context.DialogUIMode);
if (targetFormId == UIFormId.Undefined)
{
Log.Warning("DialogFormController open failed. Unsupported mode '{0}'.", context.DialogUIMode.ToString());
return null;
}
if (_dialogForm != null && _dialogForm.UIMode == context.DialogUIMode)
{
_dialogForm.StartDialog(context);
return _formSerialId;
}
CloseUI();
_pendingRefresh = true;
_formSerialId = GameEntry.UI.OpenUIForm(targetFormId, context);
return _formSerialId;
}
public void CloseUI()
{
_pendingRefresh = false;
if (_formSerialId.HasValue)
{
GameEntry.UI.CloseUIForm(_formSerialId.Value);
return;
}
if (_dialogForm != null)
{
_dialogForm.Close();
}
}
public void OnDialogStarted(DialogFormContext context)
{
_context = context;
TryRefreshUI();
}
public void OnDialogLineChanged(DialogFormContext context)
{
_context = context;
TryRefreshUI();
}
public void OnDialogEnded(DialogFormContext context)
{
_context = context;
}
~DialogFormController()
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnCloseUIFormComplete);
}
private void TryRefreshUI()
{
if (_context == null)
{
return;
}
if (_dialogForm == null)
{
_pendingRefresh = true;
return;
}
_dialogForm.StartDialog(_context);
_pendingRefresh = false;
}
private static UIFormId MapDialogFormId(DialogFormMode mode)
{
switch (mode)
{
case DialogFormMode.Mask:
return UIFormId.MaskDialogForm;
case DialogFormMode.BottomBox:
return UIFormId.BottomBoxDialogForm;
case DialogFormMode.Bubble:
throw new NotImplementedException("BubbleBox 对话框尚未实现");
default:
return UIFormId.Undefined;
}
}
private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
if (!(e is OpenUIFormSuccessEventArgs args))
{
return;
}
if (!_formSerialId.HasValue)
{
return;
}
if (args.UIForm == null || args.UIForm.SerialId != _formSerialId.Value || args.UserData != _context)
{
return;
}
_dialogForm = args.UIForm.Logic as DialogFormBase;
if (_dialogForm == null)
{
Log.Warning("DialogFormController open success but form logic is invalid.");
return;
}
if (_pendingRefresh)
{
TryRefreshUI();
}
}
private void OnCloseUIFormComplete(object sender, GameEventArgs e)
{
if (!(e is CloseUIFormCompleteEventArgs args))
{
return;
}
if (args.SerialId != _formSerialId)
{
return;
}
_dialogForm = null;
_formSerialId = null;
_pendingRefresh = false;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 52cc4e85f8030334689fdcff90748161
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,8 @@
namespace UI
{
public interface IFormController<T> where T : UIContext
{
int? OpenUI(T context);
void CloseUI();
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: b7754184093b2d14cb03dd9c8e6bbe03
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,132 @@
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace UI
{
public class MenuFormController : IFormController<MenuFormContext>
{
private MenuFormContext _context;
private MenuForm _menuForm;
private int? _menuFormSerialId;
private bool _pendingRefresh;
public MenuFormController()
{
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OpenUIFormSuccess);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, CloseUIFormComplete);
}
public int? OpenUI(MenuFormContext context)
{
if (context == null)
{
Log.Warning("MenuFormController open failed. context is null.");
return null;
}
_context = context;
if (_menuForm != null)
{
_menuForm.RefreshUI(_context);
return _menuFormSerialId;
}
CloseUI();
_pendingRefresh = true;
_menuFormSerialId = GameEntry.UI.OpenUIForm(UIFormId.MenuForm, context);
return _menuFormSerialId;
}
public void CloseUI()
{
_pendingRefresh = false;
if (_menuFormSerialId.HasValue)
{
GameEntry.UI.CloseUIForm(_menuFormSerialId.Value);
return;
}
if (_menuForm != null)
{
_menuForm.Close();
}
}
private void TryRefreshUI()
{
if (_context == null)
{
return;
}
if (_menuForm == null)
{
_pendingRefresh = true;
return;
}
_menuForm.RefreshUI(_context);
_pendingRefresh = false;
}
~MenuFormController()
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OpenUIFormSuccess);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, CloseUIFormComplete);
}
#region EventHanlders
private void OpenUIFormSuccess(object sender, GameEventArgs e)
{
if (!(e is OpenUIFormSuccessEventArgs args))
{
return;
}
if (!_menuFormSerialId.HasValue)
{
return;
}
if (args.UIForm == null || args.UIForm.SerialId != _menuFormSerialId.Value || args.UserData != _context)
{
return;
}
_menuForm = args.UIForm.Logic as MenuForm;
if (_menuForm == null)
{
Log.Warning("DialogFormController open success but form logic is invalid.");
return;
}
if (_pendingRefresh)
{
TryRefreshUI();
}
}
private void CloseUIFormComplete(object sender, GameEventArgs e)
{
if (!(e is CloseUIFormCompleteEventArgs args))
{
return;
}
if (args.SerialId != _menuFormSerialId)
{
return;
}
_menuForm = null;
_menuFormSerialId = null;
}
#endregion
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: 38fe84430afbe554f8f8c81e3f6ac47b
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant:
@@ -0,0 +1,129 @@
using System;
using GameFramework.Event;
using UnityGameFramework.Runtime;
namespace UI
{
public class SettingFormController : IFormController<SettingFormContext>
{
private SettingFormContext _context;
private SettingForm _settingForm;
private int? _formSerialId;
private bool _pendingRefresh;
public SettingFormController()
{
GameEntry.Event.Subscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
GameEntry.Event.Subscribe(CloseUIFormCompleteEventArgs.EventId, OnCloseUIFormComplete);
}
public int? OpenUI(SettingFormContext context)
{
if (context == null)
{
Log.Warning("SettingFormController open failed. context is null.");
return null;
}
_context = context;
if (_settingForm != null)
{
_settingForm.RefreshUI(context);
return _formSerialId;
}
CloseUI();
_pendingRefresh = true;
_formSerialId = GameEntry.UI.OpenUIForm(UIFormId.SettingForm, context);
return _formSerialId;
}
public void CloseUI()
{
_pendingRefresh = false;
if (_formSerialId.HasValue)
{
GameEntry.UI.CloseUIForm(_formSerialId.Value);
return;
}
if (_settingForm != null)
{
_settingForm.Close();
}
}
~SettingFormController()
{
GameEntry.Event.Unsubscribe(OpenUIFormSuccessEventArgs.EventId, OnOpenUIFormSuccess);
GameEntry.Event.Unsubscribe(CloseUIFormCompleteEventArgs.EventId, OnCloseUIFormComplete);
}
private void TryRefreshUI()
{
if (_context == null)
{
return;
}
if (_settingForm == null)
{
_pendingRefresh = true;
return;
}
_settingForm.RefreshUI(_context);
_pendingRefresh = false;
}
private void OnOpenUIFormSuccess(object sender, GameEventArgs e)
{
if (!(e is OpenUIFormSuccessEventArgs args))
{
return;
}
if (!_formSerialId.HasValue)
{
return;
}
if (args.UIForm == null || args.UIForm.SerialId != _formSerialId.Value || args.UserData != _context)
{
return;
}
_settingForm = args.UIForm.Logic as SettingForm;
if (_settingForm == null)
{
Log.Warning("SettingFormController open success but form logic is invalid.");
return;
}
if (_pendingRefresh)
{
TryRefreshUI();
}
}
private void OnCloseUIFormComplete(object sender, GameEventArgs e)
{
if (!(e is CloseUIFormCompleteEventArgs args))
{
return;
}
if (args.SerialId != _formSerialId)
{
return;
}
_settingForm = null;
_formSerialId = null;
_pendingRefresh = false;
}
}
}
@@ -0,0 +1,11 @@
fileFormatVersion: 2
guid: fe89c33ff996c344a911bcee3293f439
MonoImporter:
externalObjects: {}
serializedVersion: 2
defaultReferences: []
executionOrder: 0
icon: {instanceID: 0}
userData:
assetBundleName:
assetBundleVariant: