diff --git a/Assets/GameMain/Scripts/Base/Definition/DataStruct/StatModifier.cs b/Assets/GameMain/Scripts/Base/Definition/DataStruct/StatModifier.cs index 8614461..13827e9 100644 --- a/Assets/GameMain/Scripts/Base/Definition/DataStruct/StatModifier.cs +++ b/Assets/GameMain/Scripts/Base/Definition/DataStruct/StatModifier.cs @@ -7,61 +7,10 @@ namespace SepCore.Definition { public class StatModifier { - // None = 0, - // MaxHealth = 1, - // MovementSpeed = 2, - // Attack = 3, - // Defense = 4, - // AttackSpeed = 5, - // Critical = 6, - // CriticalDamage = 7, - // Dodge = 8, - // AbsorbRange = 9 - - private readonly string[] _statTypeNames = - { - "无效", - "最大生命", - "移动速度", - "伤害", - "防御", - "冷却", - "暴击率", - "暴击伤害", - "闪避", - "金币/经验吸收范围" - }; - public StatType StatType; public float Value; public bool IsPercent; - public override string ToString() - { - if (IsPercent) - { - if (Value > 0) - { - return $"{_statTypeNames[(int)StatType]}: +{Value * 100}%"; - } - else - { - return $"{_statTypeNames[(int)StatType]}: +{Value * 100}%"; - } - } - else - { - if (Value > 0) - { - return $"{_statTypeNames[(int)StatType]}: +{Value}"; - } - else - { - return $"{_statTypeNames[(int)StatType]}: +{Value}"; - } - } - } - public static StatModifier StringToModifier(string input) { if (string.IsNullOrEmpty(input)) diff --git a/Assets/GameMain/Scripts/Base/Event/LevelProcessEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/Combat/LevelProcessEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/LevelProcessEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/Combat/LevelProcessEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/LevelProcessEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/Combat/LevelProcessEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/LevelProcessEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/Combat/LevelProcessEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/DialogForm.meta b/Assets/GameMain/Scripts/Base/Event/DialogForm.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/DialogForm.meta rename to Assets/GameMain/Scripts/Base/Event/DialogForm.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/DialogForm/DialogEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/DialogForm/DialogEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/DialogForm/DialogEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/DialogForm/DialogEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/DialogForm/DialogEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/DialogForm/DialogEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/DialogForm/DialogEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/DialogForm/DialogEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm.meta b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm.meta new file mode 100644 index 0000000..401efa0 --- /dev/null +++ b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 3de64a3f2f644813b51e5145d0a9431c +timeCreated: 1781403042 \ No newline at end of file diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoHideEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoHideEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/DisplayItemInfoHideEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoHideEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoHideEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoHideEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/DisplayItemInfoHideEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoHideEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoLockEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoLockEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/DisplayItemInfoLockEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoLockEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoLockEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoLockEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/DisplayItemInfoLockEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemInfoLockEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemShowEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemShowEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/DisplayItemShowEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemShowEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/DisplayItemShowEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemShowEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/DisplayItemShowEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/DisplayItemInfoForm/DisplayItemShowEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/MenuForm.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm.meta new file mode 100644 index 0000000..5e9daab --- /dev/null +++ b/Assets/GameMain/Scripts/Base/Event/MenuForm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 458b35bb1d1848c598f1d318c6523a6a +timeCreated: 1781402959 \ No newline at end of file diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuAboutButtonClickEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuAboutButtonClickEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuAboutButtonClickEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuAboutButtonClickEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuAboutButtonClickEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuAboutButtonClickEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuAboutButtonClickEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuAboutButtonClickEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuFileButtonClickEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuFileButtonClickEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuFileButtonClickEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuFileButtonClickEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuFileButtonClickEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuFileButtonClickEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuFileButtonClickEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuFileButtonClickEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuGuideButtonClickEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuGuideButtonClickEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuGuideButtonClickEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuGuideButtonClickEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuGuideButtonClickEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuGuideButtonClickEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuGuideButtonClickEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuGuideButtonClickEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuQuitButtonClickEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuQuitButtonClickEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuQuitButtonClickEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuQuitButtonClickEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuQuitButtonClickEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuQuitButtonClickEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuQuitButtonClickEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuQuitButtonClickEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSettingButtonClickEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuSettingButtonClickEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSettingButtonClickEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuSettingButtonClickEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSettingButtonClickEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuSettingButtonClickEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSettingButtonClickEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuSettingButtonClickEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuStartGameEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuStartGameEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuStartGameEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuStartGameEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuStartGameEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/MenuForm/MenuStartGameEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuStartGameEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/MenuForm/MenuStartGameEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/SelectRoleForm.meta b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm.meta new file mode 100644 index 0000000..11aedf0 --- /dev/null +++ b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 15844be485c343f0a94e2e6fcd90022d +timeCreated: 1781403001 \ No newline at end of file diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleConfirmEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleConfirmEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleConfirmEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleConfirmEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleConfirmEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleConfirmEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleConfirmEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleConfirmEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleHoverEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleHoverEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleHoverEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleHoverEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleHoverEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleHoverEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/SelectRoleHoverEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleHoverEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSelectRoleReturnEventArgs.cs b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleReturnEventArgs.cs similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSelectRoleReturnEventArgs.cs rename to Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleReturnEventArgs.cs diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSelectRoleReturnEventArgs.cs.meta b/Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleReturnEventArgs.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Base/Event/UI/Menu/MenuSelectRoleReturnEventArgs.cs.meta rename to Assets/GameMain/Scripts/Base/Event/SelectRoleForm/SelectRoleReturnEventArgs.cs.meta diff --git a/Assets/GameMain/Scripts/Base/Event/UI/Menu.meta b/Assets/GameMain/Scripts/Base/Event/UI/Menu.meta deleted file mode 100644 index 56d13af..0000000 --- a/Assets/GameMain/Scripts/Base/Event/UI/Menu.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 8fc42c90ffa598d4e89c908ad82116d8 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Editor/UIRouterComponentEditor.cs b/Assets/GameMain/Scripts/Editor/UIRouterComponentEditor.cs index d5db972..f47d759 100644 --- a/Assets/GameMain/Scripts/Editor/UIRouterComponentEditor.cs +++ b/Assets/GameMain/Scripts/Editor/UIRouterComponentEditor.cs @@ -72,7 +72,7 @@ namespace SepCore.Editor private void BuildControllerTypeOptions() { List controllerTypes = new(); - foreach (Type type in TypeCache.GetTypesDerivedFrom()) + foreach (Type type in TypeCache.GetTypesDerivedFrom()) { if (type.IsAbstract || type.IsInterface || type.ContainsGenericParameters) { diff --git a/Assets/GameMain/Scripts/Presentation/Menu/SelectRole/SelectRoleController.cs b/Assets/GameMain/Scripts/Presentation/Menu/SelectRole/SelectRoleController.cs index 7860ebd..e4d0b61 100644 --- a/Assets/GameMain/Scripts/Presentation/Menu/SelectRole/SelectRoleController.cs +++ b/Assets/GameMain/Scripts/Presentation/Menu/SelectRole/SelectRoleController.cs @@ -1,6 +1,7 @@ using Cysharp.Threading.Tasks; using SepCore.Event; using SepCore.Definition; +using SepCore.CustomUtility; using GameFramework.Event; using UnityEngine; using UnityGameFramework.Runtime; @@ -61,7 +62,8 @@ namespace SepCore.UI propertyContext = new RolePropertyAreaContext { RoleName = rawData.SelectedRoleName, - InitialPropertyText = rawData.SelectedRoleInitialPropertyText + InitialPropertyText = ItemDescUtility.CreatePropDescription(rawData.SelectedRoleInitialProperties) + ?? string.Empty }; } @@ -78,6 +80,7 @@ namespace SepCore.UI if (userData is SelectRoleRawData rawData) { await OpenUIAsync(rawData, timeout); + return; } if (userData != null) diff --git a/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs b/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs index aa5be72..743fa92 100644 --- a/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs +++ b/Assets/GameMain/Scripts/Presentation/Utility/ItemDescUtility.cs @@ -25,7 +25,35 @@ namespace SepCore.CustomUtility {"attackDuration", "突刺时长"}, {"returnDuration", "收枪时长"} }; - + + private static readonly string[] _statTypeNames = + { + "无效", + "最大生命", + "移动速度", + "伤害", + "防御", + "冷却", + "暴击率", + "暴击伤害", + "闪避", + "金币/经验吸收范围" + }; + + public static string Describe(StatModifier modifier) + { + if (modifier == null) + { + return string.Empty; + } + + string name = _statTypeNames[(int)modifier.StatType]; + string colorTag = modifier.Value > 0 ? "green" : "red"; + string suffix = modifier.IsPercent ? "%" : string.Empty; + float displayValue = modifier.IsPercent ? modifier.Value * 100 : modifier.Value; + return $"{name}: +{displayValue}{suffix}"; + } + public static string CreatePropDescription(StatModifier[] modifiers) { if (modifiers == null || modifiers.Length == 0) @@ -36,7 +64,7 @@ namespace SepCore.CustomUtility StringBuilder sb = new StringBuilder(); foreach (StatModifier modifier in modifiers) { - sb.Append(modifier); + sb.Append(Describe(modifier)); sb.Append('\n'); } diff --git a/Assets/GameMain/Scripts/Procedure/ProcedureMenu.cs b/Assets/GameMain/Scripts/Procedure/ProcedureMenu.cs index 12a20ef..580be7a 100644 --- a/Assets/GameMain/Scripts/Procedure/ProcedureMenu.cs +++ b/Assets/GameMain/Scripts/Procedure/ProcedureMenu.cs @@ -7,7 +7,7 @@ using ProcedureOwner = GameFramework.Fsm.IFsm false; @@ -15,9 +15,9 @@ namespace SepCore.Procedure private int _selectedRoleId = 0; - public void StartGame(int selectedRoleId) + public void ConfirmSelectRole(int roleId) { - _selectedRoleId = selectedRoleId; + _selectedRoleId = roleId; _startGame = true; } @@ -29,7 +29,7 @@ namespace SepCore.Procedure GameEntry.UIRouter.OpenUIAsync(UIFormType.MenuForm); - var useCase = new SelectRoleUseCase(StartGame); + var useCase = new SelectRoleUseCase(this); GameEntry.UIRouter.BindUIUseCase(UIFormType.SelectRoleForm, useCase); QualitySettings.vSyncCount = 0; diff --git a/Assets/GameMain/Scripts/Runtime/CustomComponent/UIRouterComponent.cs b/Assets/GameMain/Scripts/Runtime/CustomComponent/UIRouterComponent.cs index c110278..68822d1 100644 --- a/Assets/GameMain/Scripts/Runtime/CustomComponent/UIRouterComponent.cs +++ b/Assets/GameMain/Scripts/Runtime/CustomComponent/UIRouterComponent.cs @@ -23,8 +23,8 @@ namespace SepCore.UIRouter [SerializeField] private List _controllerBindings = new(); - private readonly Dictionary _routeControllers = new(); - private readonly Dictionary> _controllerFactories = new(); + private readonly Dictionary _routeControllers = new(); + private readonly Dictionary> _controllerFactories = new(); protected override void Awake() { @@ -32,7 +32,7 @@ namespace SepCore.UIRouter RegisterSerializedBindings(); } - public void RegisterController(UIFormType uiFormType, Func controllerFactory) + public void RegisterController(UIFormType uiFormType, Func controllerFactory) { if (controllerFactory == null) { @@ -40,7 +40,7 @@ namespace SepCore.UIRouter return; } - if (_routeControllers.TryGetValue(uiFormType, out IUIFormController controller)) + if (_routeControllers.TryGetValue(uiFormType, out IUIController controller)) { controller.CloseUIAsync().Forget(); _routeControllers.Remove(uiFormType); @@ -50,14 +50,14 @@ namespace SepCore.UIRouter } public void RegisterController(UIFormType uiFormType) - where TController : IUIFormController, new() + where TController : IUIController, new() { RegisterController(uiFormType, () => new TController()); } public void BindUIUseCase(UIFormType uiFormType, IUIUseCase useCase) { - IUIFormController controller = GetOrCreateController(uiFormType); + IUIController controller = GetOrCreateController(uiFormType); if (controller == null) { return; @@ -68,7 +68,7 @@ namespace SepCore.UIRouter public UniTask OpenUIAsync(UIFormType uiFormType, object userData = null, float timeout = 30f) { - IUIFormController controller = GetOrCreateController(uiFormType); + IUIController controller = GetOrCreateController(uiFormType); if (controller == null) { return default; @@ -79,7 +79,7 @@ namespace SepCore.UIRouter public UniTask CloseUIAsync(UIFormType uiFormType, object userData = null, float timeout = 30f) { - IUIFormController controller = GetOrCreateController(uiFormType); + IUIController controller = GetOrCreateController(uiFormType); if (controller == null) { return UniTask.CompletedTask; @@ -88,14 +88,14 @@ namespace SepCore.UIRouter return controller.CloseUIAsync(userData, timeout); } - private IUIFormController GetOrCreateController(UIFormType uiFormType) + private IUIController GetOrCreateController(UIFormType uiFormType) { - if (_routeControllers.TryGetValue(uiFormType, out IUIFormController controller)) + if (_routeControllers.TryGetValue(uiFormType, out IUIController controller)) { return controller; } - if (!_controllerFactories.TryGetValue(uiFormType, out Func controllerFactory)) + if (!_controllerFactories.TryGetValue(uiFormType, out Func controllerFactory)) { Log.Error("UIRouterComponent requires a controller binding for '{0}'.", uiFormType.ToString()); return null; @@ -141,7 +141,7 @@ namespace SepCore.UIRouter continue; } - if (!typeof(IUIFormController).IsAssignableFrom(controllerType)) + if (!typeof(IUIController).IsAssignableFrom(controllerType)) { Log.Warning("UIRouter binding type '{0}' does not implement IUIFormController.", binding.ControllerTypeName); @@ -152,10 +152,10 @@ namespace SepCore.UIRouter } } - private static IUIFormController CreateController(Type controllerType) + private static IUIController CreateController(Type controllerType) { object instance = Activator.CreateInstance(controllerType); - if (instance is IUIFormController controller) + if (instance is IUIController controller) { return controller; } @@ -165,7 +165,7 @@ namespace SepCore.UIRouter private void OnDestroy() { - foreach (KeyValuePair pair in _routeControllers) + foreach (KeyValuePair pair in _routeControllers) { pair.Value.CloseUIAsync().Forget(); } diff --git a/Assets/GameMain/Scripts/Base/Event/UI.meta b/Assets/GameMain/Scripts/Runtime/ProcedureInterface.meta similarity index 77% rename from Assets/GameMain/Scripts/Base/Event/UI.meta rename to Assets/GameMain/Scripts/Runtime/ProcedureInterface.meta index 2d4e5ac..26f5533 100644 --- a/Assets/GameMain/Scripts/Base/Event/UI.meta +++ b/Assets/GameMain/Scripts/Runtime/ProcedureInterface.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: f52f9694158bfda42a01330b373cbfe9 +guid: f58e0f571a80e674991b1dca13aa02cb folderAsset: yes DefaultImporter: externalObjects: {} diff --git a/Assets/GameMain/Scripts/Runtime/ProcedureInterface/IProcedureMenu.cs b/Assets/GameMain/Scripts/Runtime/ProcedureInterface/IProcedureMenu.cs new file mode 100644 index 0000000..1a3fc10 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/ProcedureInterface/IProcedureMenu.cs @@ -0,0 +1,7 @@ +namespace SepCore.Procedure +{ + public interface IProcedureMenu + { + public void ConfirmSelectRole(int roleId); + } +} diff --git a/Assets/GameMain/Scripts/Runtime/ProcedureInterface/IProcedureMenu.cs.meta b/Assets/GameMain/Scripts/Runtime/ProcedureInterface/IProcedureMenu.cs.meta new file mode 100644 index 0000000..6c20f07 --- /dev/null +++ b/Assets/GameMain/Scripts/Runtime/ProcedureInterface/IProcedureMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: beecddd20d3655541a86aafa1d1e31df +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIFormController.cs b/Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIController.cs similarity index 87% rename from Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIFormController.cs rename to Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIController.cs index d73d09f..e7d516f 100644 --- a/Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIFormController.cs +++ b/Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIController.cs @@ -2,7 +2,7 @@ using Cysharp.Threading.Tasks; namespace SepCore.UI { - public interface IUIFormController + public interface IUIController { UniTask OpenUIAsync(object userData = null, float timeout = 30f); diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIFormController.cs.meta b/Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIController.cs.meta similarity index 100% rename from Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIFormController.cs.meta rename to Assets/GameMain/Scripts/Runtime/UIBase/Base/IUIController.cs.meta diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Base/UIControllerBase.cs b/Assets/GameMain/Scripts/Runtime/UIBase/Base/UIControllerBase.cs index 92f4bde..09b53f2 100644 --- a/Assets/GameMain/Scripts/Runtime/UIBase/Base/UIControllerBase.cs +++ b/Assets/GameMain/Scripts/Runtime/UIBase/Base/UIControllerBase.cs @@ -5,7 +5,7 @@ using SepCore.AsyncTask; namespace SepCore.UI { - public abstract class UIControllerBase : IUIFormController + public abstract class UIControllerBase : IUIController where TContext : UIContext where TForm : UGuiForm { diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleRawData.cs b/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleRawData.cs index b01ea0c..bb4d6e9 100644 --- a/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleRawData.cs +++ b/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleRawData.cs @@ -1,3 +1,5 @@ +using SepCore.Definition; + namespace SepCore.UI { public class SelectRoleRawData @@ -6,6 +8,6 @@ namespace SepCore.UI public string[] RoleIconNames; public int SelectedRoleId; public string SelectedRoleName; - public string SelectedRoleInitialPropertyText; + public StatModifier[] SelectedRoleInitialProperties; } } diff --git a/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleUseCase.cs b/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleUseCase.cs index 39d3edd..24c6f39 100644 --- a/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleUseCase.cs +++ b/Assets/GameMain/Scripts/Runtime/UIBase/Menu/SelectRoleForm/SelectRoleUseCase.cs @@ -1,7 +1,6 @@ -using System; -using System.Text; using SepCore.DataTable; using GameFramework.DataTable; +using SepCore.Procedure; using Random = UnityEngine.Random; namespace SepCore.UI @@ -10,13 +9,13 @@ namespace SepCore.UI { private readonly IDataTable _roleDataTable; - private readonly Action _onStartGame; + private readonly IProcedureMenu _procedureMenu; public int SelectedRoleId { get; private set; } - public SelectRoleUseCase(Action onStartGame) + public SelectRoleUseCase(IProcedureMenu procedureMenu) { - _onStartGame = onStartGame; + _procedureMenu = procedureMenu; _roleDataTable = GameEntry.DataTable.GetDataTable(); } @@ -48,7 +47,7 @@ namespace SepCore.UI bool result = SelectedRoleId >= 0; if (result) { - _onStartGame?.Invoke(SelectedRoleId); + _procedureMenu.ConfirmSelectRole(SelectedRoleId); } return result; @@ -73,27 +72,8 @@ namespace SepCore.UI RoleIconNames = iconNames, SelectedRoleId = selectedRole?.Id ?? -1, SelectedRoleName = selectedRole?.RoleName, - SelectedRoleInitialPropertyText = selectedRole != null - ? BuildRoleInitialPropertyText(selectedRole) - : null + SelectedRoleInitialProperties = selectedRole?.InitialProperties }; } - - private static string BuildRoleInitialPropertyText(DRRole role) - { - if (role == null || role.InitialProperties == null || role.InitialProperties.Length == 0) - { - return string.Empty; - } - - StringBuilder sb = new StringBuilder(); - for (int i = 0; i < role.InitialProperties.Length; i++) - { - sb.Append(role.InitialProperties[i]); - sb.Append('\n'); - } - - return sb.ToString(); - } } } diff --git a/Assets/GameMain/UI/UIForms/MenuForm.prefab b/Assets/GameMain/UI/UIForms/MenuForm.prefab index dd8d626..fa49d09 100644 --- a/Assets/GameMain/UI/UIForms/MenuForm.prefab +++ b/Assets/GameMain/UI/UIForms/MenuForm.prefab @@ -255,6 +255,11 @@ PrefabInstance: propertyPath: m_TargetGraphic value: objectReference: {fileID: 345099064574680782} + - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, + type: 3} + propertyPath: m_Navigation.m_Mode + value: 3 + objectReference: {fileID: 0} - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, type: 3} propertyPath: m_Colors.m_SelectedColor.b @@ -661,6 +666,11 @@ PrefabInstance: propertyPath: m_TargetGraphic value: objectReference: {fileID: 637634966344259004} + - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, + type: 3} + propertyPath: m_Navigation.m_Mode + value: 3 + objectReference: {fileID: 0} - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, type: 3} propertyPath: m_Colors.m_SelectedColor.b @@ -1062,6 +1072,11 @@ PrefabInstance: propertyPath: m_TargetGraphic value: objectReference: {fileID: 990282440119873477} + - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, + type: 3} + propertyPath: m_Navigation.m_Mode + value: 3 + objectReference: {fileID: 0} - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, type: 3} propertyPath: m_Colors.m_SelectedColor.b @@ -1463,6 +1478,11 @@ PrefabInstance: propertyPath: m_TargetGraphic value: objectReference: {fileID: 915430015319378619} + - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, + type: 3} + propertyPath: m_Navigation.m_Mode + value: 3 + objectReference: {fileID: 0} - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, type: 3} propertyPath: m_Colors.m_SelectedColor.b @@ -1870,6 +1890,11 @@ PrefabInstance: propertyPath: m_TargetGraphic value: objectReference: {fileID: 6148722132083568899} + - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, + type: 3} + propertyPath: m_Navigation.m_Mode + value: 3 + objectReference: {fileID: 0} - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, type: 3} propertyPath: m_Colors.m_SelectedColor.b @@ -2271,6 +2296,11 @@ PrefabInstance: propertyPath: m_TargetGraphic value: objectReference: {fileID: 4891246053961263497} + - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, + type: 3} + propertyPath: m_Navigation.m_Mode + value: 3 + objectReference: {fileID: 0} - target: {fileID: 4005815405540692376, guid: 0722cd253d6bf014eb4134a2151ec7e3, type: 3} propertyPath: m_Colors.m_SelectedColor.b diff --git a/docs/UI-5层架构设计规范.md b/docs/UI-5层架构设计规范.md index 43b1454..13acfb3 100644 --- a/docs/UI-5层架构设计规范.md +++ b/docs/UI-5层架构设计规范.md @@ -76,7 +76,7 @@ View 约束: - 实现 `IUIUseCase` -- 命名:`XXXFormUseCase` +- 命名:`XXXUseCase` - 对外提供语义化方法,例如 `CreateInitialModel`、`TryRefresh`、`Select`、`Confirm` - 返回值只能是 `RawData` 或纯业务结果对象,例如 `XXXResult`、`XXXActionResult` - 不依赖 `Context`、`View`、`UGuiForm`、`MonoBehaviour` 等 UI 类型 @@ -95,12 +95,12 @@ View 约束: -- 命名:`XXXFormRawData` +- 命名:`XXXRawData` - 只描述业务数据,不包含 UI 展示行为 - 可以包含领域对象、配置对象、标识符、枚举、数值和纯数据集合 - **轻量场景下可携带回调委托**,由 Controller 在构建 Context 前完成注册 - 不允许依赖 `Context`、`View`、`Sprite`、`TMP_Text` 等展示相关类型 -- 不允许直接使用 `XXXItemContext`、`XXXFormContext` 作为字段类型 +- 不允许直接使用 `XXXItemContext`、`XXXContext` 作为字段类型 说明: @@ -116,7 +116,7 @@ View - 对启用 `UIRouterComponent` 管理的 UIForm,必须存在可实例化的 Controller 绑定;未绑定时 Router 应直接失败并输出 Error,不允许 fallback 到 `GameEntry.UI.OpenUIForm(...)` - 命名:`XXXFormController` -- 可基于 `UIFormControllerBase` 实现 +- 可基于 `UIControllerBase` 实现 - 通过 `BindUseCase(IUIUseCase)` 注入用例并做类型校验 - 当前对外入口为 `OpenUIAsync(object userData = null, float timeout = 30f)` 与 `CloseUIAsync(...)` - `OpenUIAsync` 只允许外部传入 `RawData` 或可转换为 `RawData` 的参数,不接受外部传入 `Context` @@ -146,7 +146,7 @@ View 约束: - 继承 `UIContext` -- 命名:`XXXFormContext`、`XXXItemContext`、`XXXAreaContext` +- 命名:`XXXContext`、`XXXItemContext`、`XXXAreaContext` - 只能由 `Controller` 构建和更新 - 字段以展示友好为目标,例如标题、描述、图标、颜色、状态、列表、按钮文案 - **不允许携带回调委托或行为**,交互行为由 Controller 注册,View 通过 UI 专用事件通知 Controller