补充相关 UI
- 事件 UI:EventForm
- 选项:OptionItem
- 仓库 UI:RepoForm
- 组装槽:CombineSlotItem
- 组件列表槽:RepoItem
This commit is contained in:
@@ -5,6 +5,7 @@
|
||||
// Feedback: mailto:ellan@gameframework.cn
|
||||
//------------------------------------------------------------
|
||||
|
||||
using CustomComponent;
|
||||
using GeometryTD.CustomComponent;
|
||||
using UnityEngine;
|
||||
|
||||
@@ -19,6 +20,8 @@ public partial class GameEntry : MonoBehaviour
|
||||
|
||||
public static EnemyManagerComponent EnemyManager { get; private set; }
|
||||
|
||||
public static UIRouterComponent UIRouter { get; private set; }
|
||||
|
||||
public static EventNodeComponent EventNode { get; private set; }
|
||||
|
||||
public static CombatNodeComponent CombatNode { get; private set; }
|
||||
@@ -28,6 +31,7 @@ public partial class GameEntry : MonoBehaviour
|
||||
BuiltinData = UnityGameFramework.Runtime.GameEntry.GetComponent<BuiltinDataComponent>();
|
||||
HPBar = UnityGameFramework.Runtime.GameEntry.GetComponent<HPBarComponent>();
|
||||
EnemyManager = UnityGameFramework.Runtime.GameEntry.GetComponent<EnemyManagerComponent>();
|
||||
UIRouter = UnityGameFramework.Runtime.GameEntry.GetComponent<UIRouterComponent>();
|
||||
EventNode = UnityGameFramework.Runtime.GameEntry.GetComponent<EventNodeComponent>();
|
||||
CombatNode = UnityGameFramework.Runtime.GameEntry.GetComponent<CombatNodeComponent>();
|
||||
}
|
||||
|
||||
@@ -9,6 +9,8 @@ namespace CustomComponent
|
||||
public class UIRouterComponent : GameFrameworkComponent
|
||||
{
|
||||
private readonly Dictionary<UIFormType, IUIFormController> _routeControllers = new();
|
||||
|
||||
private const string UINameSpace = "GeometryTD.UI";
|
||||
|
||||
public void BindUIUseCase(UIFormType uiFormType, IUIUseCase useCase)
|
||||
{
|
||||
@@ -35,11 +37,12 @@ namespace CustomComponent
|
||||
return controller;
|
||||
}
|
||||
|
||||
string typename = $"UI.{uiFormType}Controller";
|
||||
string typename = $"{UINameSpace}.{uiFormType}Controller";
|
||||
Type controllerType = Type.GetType(typename);
|
||||
if (controllerType == null)
|
||||
{
|
||||
controller = new DefaultUIFormController(uiFormType);
|
||||
Log.Warning("Can not find UI Controller for type '{0}'.", typename);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
@@ -0,0 +1,37 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace GeometryTD.Definition
|
||||
{
|
||||
/// <summary>
|
||||
/// 玩家背包聚合数据。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public sealed class BackpackInventoryData
|
||||
{
|
||||
/// <summary>
|
||||
/// 背包金币。
|
||||
/// </summary>
|
||||
public int Gold { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 背包中的枪口组件实例。
|
||||
/// </summary>
|
||||
public List<MuzzleCompItemData> MuzzleComponents { get; set; } = new List<MuzzleCompItemData>();
|
||||
|
||||
/// <summary>
|
||||
/// 背包中的轴承组件实例。
|
||||
/// </summary>
|
||||
public List<BearingCompItemData> BearingComponents { get; set; } = new List<BearingCompItemData>();
|
||||
|
||||
/// <summary>
|
||||
/// 背包中的底座组件实例。
|
||||
/// </summary>
|
||||
public List<BaseCompItemData> BaseComponents { get; set; } = new List<BaseCompItemData>();
|
||||
|
||||
/// <summary>
|
||||
/// 背包中的防御塔实例。
|
||||
/// </summary>
|
||||
public List<DefenseTowerItemData> Towers { get; set; } = new List<DefenseTowerItemData>();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c39f9ad23ee94de9af2b3d9729f47d7f
|
||||
timeCreated: 1772105403
|
||||
@@ -0,0 +1,68 @@
|
||||
using System;
|
||||
|
||||
namespace GeometryTD.Definition
|
||||
{
|
||||
/// <summary>
|
||||
/// 防御塔独立属性快照。
|
||||
/// 注意:这里是塔实例的独立值,不通过组件引用实时计算。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public sealed class DefenseTowerStatsData
|
||||
{
|
||||
public int AttackDamage { get; set; }
|
||||
public float DamageRandomRate { get; set; }
|
||||
public float RotateSpeed { get; set; }
|
||||
public float AttackRange { get; set; }
|
||||
public float AttackSpeed { get; set; }
|
||||
public AttackMethodType AttackMethodType { get; set; }
|
||||
public AttackPropertyType AttackPropertyType { get; set; }
|
||||
public TagType[] Tags { get; set; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 背包内防御塔实例数据。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public sealed class DefenseTowerItemData
|
||||
{
|
||||
/// <summary>
|
||||
/// 防御塔实例唯一 Id。
|
||||
/// </summary>
|
||||
public long InstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 防御塔显示名称。
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 防御塔品质。
|
||||
/// </summary>
|
||||
public RarityType Rarity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 当前耐久(0~100)。
|
||||
/// </summary>
|
||||
public float Endurance { get; set; } = 100f;
|
||||
|
||||
/// <summary>
|
||||
/// 构成该防御塔的枪口组件实例 Id。
|
||||
/// </summary>
|
||||
public long MuzzleComponentInstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 构成该防御塔的轴承组件实例 Id。
|
||||
/// </summary>
|
||||
public long BearingComponentInstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 构成该防御塔的底座组件实例 Id。
|
||||
/// </summary>
|
||||
public long BaseComponentInstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 防御塔独立属性,不依赖组件对象引用。
|
||||
/// </summary>
|
||||
public DefenseTowerStatsData Stats { get; set; } = new DefenseTowerStatsData();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ca5782ae52464616bf2b45704feea0d5
|
||||
timeCreated: 1772105402
|
||||
@@ -0,0 +1,97 @@
|
||||
using System;
|
||||
|
||||
namespace GeometryTD.Definition
|
||||
{
|
||||
/// <summary>
|
||||
/// 背包内组件实例基类(非 DataTable,表示玩家持有物)。
|
||||
/// </summary>
|
||||
[Serializable]
|
||||
public abstract class TowerCompItemData
|
||||
{
|
||||
/// <summary>
|
||||
/// 组件实例唯一 Id。
|
||||
/// </summary>
|
||||
public long InstanceId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 组件配置 Id(对应 DataTable Id)。
|
||||
/// </summary>
|
||||
public int ConfigId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 组件槽位类型。
|
||||
/// </summary>
|
||||
public TowerCompSlotType SlotType { get; protected set; }
|
||||
|
||||
/// <summary>
|
||||
/// 组件名称。
|
||||
/// </summary>
|
||||
public string Name { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 组件品质。
|
||||
/// </summary>
|
||||
public RarityType Rarity { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 组件当前耐久(0~100)。
|
||||
/// </summary>
|
||||
public float Endurance { get; set; } = 100f;
|
||||
|
||||
/// <summary>
|
||||
/// 组件约束(先沿用 DataTable 原定义)。
|
||||
/// </summary>
|
||||
public string Constraint { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 组件当前 Tag(实例态)。
|
||||
/// </summary>
|
||||
public TagType[] Tags { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class MuzzleCompItemData : TowerCompItemData
|
||||
{
|
||||
public MuzzleCompItemData()
|
||||
{
|
||||
SlotType = TowerCompSlotType.Muzzle;
|
||||
}
|
||||
|
||||
public int[] AttackDamage { get; set; }
|
||||
public float DamageRandomRate { get; set; }
|
||||
public AttackMethodType AttackMethodType { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class BearingCompItemData : TowerCompItemData
|
||||
{
|
||||
public BearingCompItemData()
|
||||
{
|
||||
SlotType = TowerCompSlotType.Bearing;
|
||||
}
|
||||
|
||||
public float[] RotateSpeed { get; set; }
|
||||
public float[] AttackRange { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class BaseCompItemData : TowerCompItemData
|
||||
{
|
||||
public BaseCompItemData()
|
||||
{
|
||||
SlotType = TowerCompSlotType.Base;
|
||||
}
|
||||
|
||||
public float[] AttackSpeed { get; set; }
|
||||
public AttackPropertyType AttackPropertyType { get; set; }
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public sealed class AccessoryItemData : TowerCompItemData
|
||||
{
|
||||
public AccessoryItemData()
|
||||
{
|
||||
SlotType = TowerCompSlotType.Accessory;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 9f95a29d5bcf484aa053af1462365936
|
||||
timeCreated: 1772105401
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace GeometryTD.Definition
|
||||
{
|
||||
public enum TowerCompSlotType : byte
|
||||
{
|
||||
None = 0,
|
||||
Muzzle = 1,
|
||||
Bearing = 2,
|
||||
Base = 3,
|
||||
Accessory = 4,
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: a34cbb64aede4531b1d0e178352006bb
|
||||
timeCreated: 1772105400
|
||||
@@ -31,5 +31,10 @@
|
||||
/// 事件节点界面。
|
||||
/// </summary>
|
||||
EventForm = 200,
|
||||
|
||||
/// <summary>
|
||||
/// 仓库界面。
|
||||
/// </summary>
|
||||
RepoForm = 201,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
using GameFramework;
|
||||
using GameFramework.Event;
|
||||
|
||||
namespace GeometryTD.CustomEvent
|
||||
{
|
||||
public class CombineSlotClickedEventArgs : GameEventArgs
|
||||
{
|
||||
public static int EventId => typeof(CombineSlotClickedEventArgs).GetHashCode();
|
||||
|
||||
public override int Id => EventId;
|
||||
|
||||
public int SlotIndex { get; private set; } = -1;
|
||||
|
||||
public static CombineSlotClickedEventArgs Create(int slotIndex)
|
||||
{
|
||||
CombineSlotClickedEventArgs args = ReferencePool.Acquire<CombineSlotClickedEventArgs>();
|
||||
args.SlotIndex = slotIndex;
|
||||
return args;
|
||||
}
|
||||
|
||||
public override void Clear()
|
||||
{
|
||||
SlotIndex = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba4b42e0bcec06040b873823cf1be8d8
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,26 @@
|
||||
using GameFramework;
|
||||
using GameFramework.Event;
|
||||
|
||||
namespace GeometryTD.CustomEvent
|
||||
{
|
||||
public class RepoItemSelectedEventArgs : GameEventArgs
|
||||
{
|
||||
public static int EventId => typeof(RepoItemSelectedEventArgs).GetHashCode();
|
||||
|
||||
public override int Id => EventId;
|
||||
|
||||
public long ItemId { get; private set; }
|
||||
|
||||
public static RepoItemSelectedEventArgs Create(long itemId)
|
||||
{
|
||||
RepoItemSelectedEventArgs args = ReferencePool.Acquire<RepoItemSelectedEventArgs>();
|
||||
args.ItemId = itemId;
|
||||
return args;
|
||||
}
|
||||
|
||||
public override void Clear()
|
||||
{
|
||||
ItemId = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c5c0e535b0c3a4c4fa2a9e12f57c77ae
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,28 @@
|
||||
using GameFramework;
|
||||
using GameFramework.ObjectPool;
|
||||
using GeometryTD.UI;
|
||||
using UnityEngine;
|
||||
|
||||
namespace GeometryTD.PoolObjectBase
|
||||
{
|
||||
public class RepoItemObject : ObjectBase
|
||||
{
|
||||
public static RepoItemObject Create(object target)
|
||||
{
|
||||
RepoItemObject itemObject = ReferencePool.Acquire<RepoItemObject>();
|
||||
itemObject.Initialize(target);
|
||||
return itemObject;
|
||||
}
|
||||
|
||||
protected override void Release(bool isShutdown)
|
||||
{
|
||||
RepoItem item = (RepoItem)Target;
|
||||
if (item == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
Object.Destroy(item.gameObject);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ebb8e70bb59842de9695893d7794983f
|
||||
timeCreated: 1772106311
|
||||
@@ -1,6 +1,7 @@
|
||||
using GameFramework.Fsm;
|
||||
using GameFramework.Procedure;
|
||||
using GeometryTD.Definition;
|
||||
using GeometryTD.UI;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace GeometryTD.Procedure
|
||||
@@ -9,6 +10,8 @@ namespace GeometryTD.Procedure
|
||||
{
|
||||
public override bool UseNativeDialog => false;
|
||||
|
||||
private RepoFormUseCase _repoFormUseCase;
|
||||
|
||||
public bool GameStart { get; set; }
|
||||
|
||||
#region FSM
|
||||
@@ -25,6 +28,12 @@ namespace GeometryTD.Procedure
|
||||
GameStart = false;
|
||||
GameEntry.EventNode.OnInit();
|
||||
GameEntry.CombatNode.OnInit(LevelThemeType.Plain);
|
||||
|
||||
//GameEntry.EventNode.StartEvent();
|
||||
|
||||
_repoFormUseCase = new RepoFormUseCase();
|
||||
GameEntry.UIRouter.BindUIUseCase(UIFormType.RepoForm, _repoFormUseCase);
|
||||
GameEntry.UIRouter.OpenUI(UIFormType.RepoForm);
|
||||
}
|
||||
|
||||
protected override void OnUpdate(IFsm<IProcedureManager> procedureOwner, float elapseSeconds,
|
||||
|
||||
@@ -108,10 +108,6 @@ namespace GeometryTD.UI
|
||||
foreach (var text in tmp_texts)
|
||||
{
|
||||
text.font = _mainTMPFont;
|
||||
if (!string.IsNullOrEmpty(text.text))
|
||||
{
|
||||
text.text = GameEntry.Localization.GetString(text.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -125,10 +121,6 @@ namespace GeometryTD.UI
|
||||
foreach (var text in texts)
|
||||
{
|
||||
text.font = _mainFont;
|
||||
if (!string.IsNullOrEmpty(text.text))
|
||||
{
|
||||
text.text = GameEntry.Localization.GetString(text.text);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,6 +22,22 @@ namespace GeometryTD.UI
|
||||
|
||||
[SerializeField] private bool _allowFade = true;
|
||||
|
||||
private bool _interactive = true;
|
||||
|
||||
public bool Interactive
|
||||
{
|
||||
get => _interactive;
|
||||
set
|
||||
{
|
||||
_interactive = value;
|
||||
if (!value)
|
||||
{
|
||||
StopAllCoroutines();
|
||||
_canvasGroup.alpha = 1f;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private CanvasGroup _canvasGroup = null;
|
||||
|
||||
private void Awake()
|
||||
@@ -36,6 +52,8 @@ namespace GeometryTD.UI
|
||||
|
||||
public void OnPointerEnter(PointerEventData eventData)
|
||||
{
|
||||
if (!Interactive) return;
|
||||
|
||||
if (eventData.button != PointerEventData.InputButton.Left)
|
||||
{
|
||||
return;
|
||||
@@ -49,6 +67,8 @@ namespace GeometryTD.UI
|
||||
|
||||
public void OnPointerExit(PointerEventData eventData)
|
||||
{
|
||||
if (!Interactive) return;
|
||||
|
||||
if (eventData.button != PointerEventData.InputButton.Left)
|
||||
{
|
||||
return;
|
||||
@@ -62,6 +82,8 @@ namespace GeometryTD.UI
|
||||
|
||||
public void OnPointerDown(PointerEventData eventData)
|
||||
{
|
||||
if (!Interactive) return;
|
||||
|
||||
if (eventData.button != PointerEventData.InputButton.Left)
|
||||
{
|
||||
return;
|
||||
@@ -73,6 +95,8 @@ namespace GeometryTD.UI
|
||||
|
||||
public void OnPointerUp(PointerEventData eventData)
|
||||
{
|
||||
if (!Interactive) return;
|
||||
|
||||
if (eventData.button != PointerEventData.InputButton.Left)
|
||||
{
|
||||
return;
|
||||
|
||||
@@ -0,0 +1,6 @@
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class CombineAreaContext
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 8b1bd513fdab4dc8b8b0a26fccbe44a2
|
||||
timeCreated: 1772106303
|
||||
@@ -0,0 +1,7 @@
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class CompAreaContext
|
||||
{
|
||||
public RepoItemContext[] Items;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5c3c289363eb4ef0a591d4fcaf1ad293
|
||||
timeCreated: 1772106302
|
||||
@@ -0,0 +1,10 @@
|
||||
using GeometryTD.UI;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoFormContext : UIContext
|
||||
{
|
||||
public CombineAreaContext CombineAreaContext;
|
||||
public CompAreaContext CompAreaContext;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: bf3353a1d70c48f79fcbc64611e0085a
|
||||
timeCreated: 1772106304
|
||||
@@ -0,0 +1,11 @@
|
||||
using GeometryTD.Definition;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoItemContext
|
||||
{
|
||||
public string Title;
|
||||
public long InstanceId;
|
||||
public TowerCompSlotType ComponentSlotType;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 3f20599444b448b1933d3b0cfb94ade2
|
||||
timeCreated: 1772106301
|
||||
@@ -0,0 +1,198 @@
|
||||
using System.Collections.Generic;
|
||||
using GeometryTD.CustomEvent;
|
||||
using GeometryTD.Definition;
|
||||
using GameFramework.Event;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoFormController : UIFormControllerCommonBase<RepoFormContext, RepoForm>
|
||||
{
|
||||
private RepoFormUseCase _useCase;
|
||||
private readonly Dictionary<long, RepoItemContext> _itemContextMap = new Dictionary<long, RepoItemContext>();
|
||||
|
||||
protected override UIFormType UIFormTypeId => UIFormType.RepoForm;
|
||||
|
||||
protected override void RefreshUI(RepoForm form, RepoFormContext context)
|
||||
{
|
||||
form.RefreshUI(context);
|
||||
}
|
||||
|
||||
protected override void SubscribeCustomEvents()
|
||||
{
|
||||
GameEntry.Event.Subscribe(RepoItemSelectedEventArgs.EventId, OnRepoItemSelected);
|
||||
GameEntry.Event.Subscribe(CombineSlotClickedEventArgs.EventId, OnCombineSlotClicked);
|
||||
}
|
||||
|
||||
protected override void UnsubscribeCustomEvents()
|
||||
{
|
||||
GameEntry.Event.Unsubscribe(RepoItemSelectedEventArgs.EventId, OnRepoItemSelected);
|
||||
GameEntry.Event.Unsubscribe(CombineSlotClickedEventArgs.EventId, OnCombineSlotClicked);
|
||||
}
|
||||
|
||||
public override int? OpenUI(object userData = null)
|
||||
{
|
||||
if (userData is RepoFormContext repoFormContext)
|
||||
{
|
||||
return OpenUIInternal(repoFormContext);
|
||||
}
|
||||
|
||||
if (userData is RepoFormRawData rawDataFromUserData)
|
||||
{
|
||||
return OpenUI(rawDataFromUserData);
|
||||
}
|
||||
|
||||
if (userData != null)
|
||||
{
|
||||
Log.Warning("RepoFormController.OpenUI() userData type is invalid.");
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_useCase == null)
|
||||
{
|
||||
Log.Error("RepoFormController.OpenUI() useCase is null.");
|
||||
return null;
|
||||
}
|
||||
|
||||
RepoFormRawData rawData = _useCase.CreateInitialModel();
|
||||
return OpenUI(rawData);
|
||||
}
|
||||
|
||||
public int? OpenUI(RepoFormRawData rawData)
|
||||
{
|
||||
RepoFormContext context = BuildContext(rawData);
|
||||
return OpenUIInternal(context);
|
||||
}
|
||||
|
||||
public override void BindUseCase(IUIUseCase useCase)
|
||||
{
|
||||
if (!(useCase is RepoFormUseCase repoFormUseCase))
|
||||
{
|
||||
Log.Error("RepoFormController.BindUseCase() useCase is invalid.");
|
||||
return;
|
||||
}
|
||||
|
||||
_useCase = repoFormUseCase;
|
||||
}
|
||||
|
||||
private RepoFormContext BuildContext(RepoFormRawData rawData)
|
||||
{
|
||||
_itemContextMap.Clear();
|
||||
if (rawData?.Inventory == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
List<RepoItemContext> items = new List<RepoItemContext>();
|
||||
|
||||
if (rawData.Inventory.Towers != null)
|
||||
{
|
||||
foreach (var tower in rawData.Inventory.Towers)
|
||||
{
|
||||
AddItemContext(items, new RepoItemContext
|
||||
{
|
||||
Title = $"[Tower] {tower.Name} ({tower.Rarity})",
|
||||
InstanceId = tower.InstanceId,
|
||||
ComponentSlotType = TowerCompSlotType.None
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (rawData.Inventory.MuzzleComponents != null)
|
||||
{
|
||||
foreach (var item in rawData.Inventory.MuzzleComponents)
|
||||
{
|
||||
AddItemContext(items, new RepoItemContext
|
||||
{
|
||||
Title = $"[Muzzle] {item.Name} ({item.Rarity})",
|
||||
InstanceId = item.InstanceId,
|
||||
ComponentSlotType = TowerCompSlotType.Muzzle
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (rawData.Inventory.BearingComponents != null)
|
||||
{
|
||||
foreach (var item in rawData.Inventory.BearingComponents)
|
||||
{
|
||||
AddItemContext(items, new RepoItemContext
|
||||
{
|
||||
Title = $"[Bearing] {item.Name} ({item.Rarity})",
|
||||
InstanceId = item.InstanceId,
|
||||
ComponentSlotType = TowerCompSlotType.Bearing
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
if (rawData.Inventory.BaseComponents != null)
|
||||
{
|
||||
foreach (var item in rawData.Inventory.BaseComponents)
|
||||
{
|
||||
AddItemContext(items, new RepoItemContext
|
||||
{
|
||||
Title = $"[Base] {item.Name} ({item.Rarity})",
|
||||
InstanceId = item.InstanceId,
|
||||
ComponentSlotType = TowerCompSlotType.Base
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return new RepoFormContext
|
||||
{
|
||||
CombineAreaContext = new CombineAreaContext(),
|
||||
CompAreaContext = new CompAreaContext
|
||||
{
|
||||
Items = items.ToArray()
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
private void AddItemContext(List<RepoItemContext> items, RepoItemContext itemContext)
|
||||
{
|
||||
if (itemContext == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
items.Add(itemContext);
|
||||
_itemContextMap[itemContext.InstanceId] = itemContext;
|
||||
}
|
||||
|
||||
private void OnRepoItemSelected(object sender, GameEventArgs e)
|
||||
{
|
||||
if (!(e is RepoItemSelectedEventArgs args))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Form == null || !_itemContextMap.TryGetValue(args.ItemId, out RepoItemContext itemContext))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
bool assigned = Form.TryAssignItemToCombineArea(itemContext);
|
||||
if (assigned)
|
||||
{
|
||||
Form.SetRepoItemSelected(args.ItemId, true);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnCombineSlotClicked(object sender, GameEventArgs e)
|
||||
{
|
||||
if (!(e is CombineSlotClickedEventArgs args))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Form == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Form.TryClearCombineSlot(args.SlotIndex, out long removedItemId) && removedItemId > 0)
|
||||
{
|
||||
Form.SetRepoItemSelected(removedItemId, false);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 6c2172dd10a54c2dbbf6d01632ba6a8b
|
||||
timeCreated: 1772106306
|
||||
@@ -0,0 +1,9 @@
|
||||
using GeometryTD.Definition;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoFormRawData
|
||||
{
|
||||
public BackpackInventoryData Inventory;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: efed1063c6334c90b09475548c2b560e
|
||||
timeCreated: 1772106300
|
||||
@@ -0,0 +1,115 @@
|
||||
using System.Collections.Generic;
|
||||
using GeometryTD.Definition;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoFormUseCase : IUIUseCase
|
||||
{
|
||||
public RepoFormRawData CreateInitialModel()
|
||||
{
|
||||
BackpackInventoryData sample = BuildSampleInventory();
|
||||
return new RepoFormRawData
|
||||
{
|
||||
Inventory = sample
|
||||
};
|
||||
}
|
||||
|
||||
private static BackpackInventoryData BuildSampleInventory()
|
||||
{
|
||||
BackpackInventoryData inventory = new BackpackInventoryData
|
||||
{
|
||||
Gold = 500
|
||||
};
|
||||
|
||||
MuzzleCompItemData muzzle = new MuzzleCompItemData
|
||||
{
|
||||
InstanceId = 10001,
|
||||
ConfigId = 1,
|
||||
Name = "元素枪口",
|
||||
Rarity = RarityType.Green,
|
||||
Endurance = 90f,
|
||||
AttackDamage = new[] { 20, 30, 40, 50, 80 },
|
||||
DamageRandomRate = 0.05f,
|
||||
AttackMethodType = AttackMethodType.NormalBullet,
|
||||
Constraint = string.Empty,
|
||||
Tags = new[] { TagType.Fire }
|
||||
};
|
||||
inventory.MuzzleComponents.Add(muzzle);
|
||||
|
||||
BearingCompItemData bearing = new BearingCompItemData
|
||||
{
|
||||
InstanceId = 20001,
|
||||
ConfigId = 1,
|
||||
Name = "元素轴承",
|
||||
Rarity = RarityType.Green,
|
||||
Endurance = 95f,
|
||||
RotateSpeed = new[] { 10f, 12f, 13f, 14f, 15f },
|
||||
AttackRange = new[] { 2f, 2f, 2f, 2f, 2f },
|
||||
Constraint = string.Empty,
|
||||
Tags = new[] { TagType.Fire }
|
||||
};
|
||||
inventory.BearingComponents.Add(bearing);
|
||||
|
||||
BaseCompItemData baseComp = new BaseCompItemData
|
||||
{
|
||||
InstanceId = 30001,
|
||||
ConfigId = 1,
|
||||
Name = "元素底座",
|
||||
Rarity = RarityType.Green,
|
||||
Endurance = 88f,
|
||||
AttackSpeed = new[] { 2f, 1.5f, 1f, 0.8f, 0.7f },
|
||||
AttackPropertyType = AttackPropertyType.Fire,
|
||||
Constraint = string.Empty,
|
||||
Tags = new[] { TagType.Fire }
|
||||
};
|
||||
inventory.BaseComponents.Add(baseComp);
|
||||
|
||||
DefenseTowerItemData tower = new DefenseTowerItemData
|
||||
{
|
||||
InstanceId = 90001,
|
||||
Name = "测试防御塔-A",
|
||||
Rarity = RarityType.Green,
|
||||
Endurance = 92f,
|
||||
MuzzleComponentInstanceId = muzzle.InstanceId,
|
||||
BearingComponentInstanceId = bearing.InstanceId,
|
||||
BaseComponentInstanceId = baseComp.InstanceId,
|
||||
Stats = new DefenseTowerStatsData
|
||||
{
|
||||
AttackDamage = 30,
|
||||
DamageRandomRate = 0.05f,
|
||||
RotateSpeed = 12f,
|
||||
AttackRange = 2f,
|
||||
AttackSpeed = 1.5f,
|
||||
AttackMethodType = AttackMethodType.NormalBullet,
|
||||
AttackPropertyType = AttackPropertyType.Fire,
|
||||
Tags = new[] { TagType.Fire, TagType.BurnSpread }
|
||||
}
|
||||
};
|
||||
inventory.Towers.Add(tower);
|
||||
|
||||
inventory.Towers.Add(new DefenseTowerItemData
|
||||
{
|
||||
InstanceId = 90002,
|
||||
Name = "测试防御塔-B",
|
||||
Rarity = RarityType.Blue,
|
||||
Endurance = 100f,
|
||||
MuzzleComponentInstanceId = 0,
|
||||
BearingComponentInstanceId = 0,
|
||||
BaseComponentInstanceId = 0,
|
||||
Stats = new DefenseTowerStatsData
|
||||
{
|
||||
AttackDamage = 50,
|
||||
DamageRandomRate = 0.03f,
|
||||
RotateSpeed = 20f,
|
||||
AttackRange = 4f,
|
||||
AttackSpeed = 1f,
|
||||
AttackMethodType = AttackMethodType.NormalBullet,
|
||||
AttackPropertyType = AttackPropertyType.Physics,
|
||||
Tags = new[] { TagType.Pierce }
|
||||
}
|
||||
});
|
||||
|
||||
return inventory;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ad54433a032e489f82217d85992a8159
|
||||
timeCreated: 1772106305
|
||||
@@ -0,0 +1,102 @@
|
||||
using GeometryTD.Definition;
|
||||
using UnityEngine;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class CombineArea : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private CombineSlotItem[] _slots;
|
||||
|
||||
public void OnInit(CombineAreaContext context)
|
||||
{
|
||||
if (_slots == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < _slots.Length; i++)
|
||||
{
|
||||
if (_slots[i] != null)
|
||||
{
|
||||
_slots[i].OnInit(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnReset()
|
||||
{
|
||||
if (_slots == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
foreach (var slot in _slots)
|
||||
{
|
||||
if (slot != null)
|
||||
{
|
||||
slot.OnReset();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public void OnCombineClick()
|
||||
{
|
||||
// TODO: Combine logic.
|
||||
}
|
||||
|
||||
public bool TryAssignItem(RepoItemContext itemContext)
|
||||
{
|
||||
if (itemContext == null || itemContext.ComponentSlotType == TowerCompSlotType.None)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CombineSlotItem targetSlot = FindSlot(itemContext.ComponentSlotType);
|
||||
if (targetSlot == null || targetSlot.HasItem)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
targetSlot.BindItem(itemContext);
|
||||
return true;
|
||||
}
|
||||
|
||||
public bool TryClearSlot(int slotIndex, out long removedItemId)
|
||||
{
|
||||
removedItemId = 0;
|
||||
if (_slots == null || slotIndex < 0 || slotIndex >= _slots.Length)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
CombineSlotItem slot = _slots[slotIndex];
|
||||
if (slot == null || !slot.HasItem)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
removedItemId = slot.BoundItemId;
|
||||
slot.ClearSlot();
|
||||
return true;
|
||||
}
|
||||
|
||||
private CombineSlotItem FindSlot(TowerCompSlotType slotType)
|
||||
{
|
||||
if (_slots == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
for (int i = 0; i < _slots.Length; i++)
|
||||
{
|
||||
CombineSlotItem slot = _slots[i];
|
||||
if (slot != null && slot.AcceptSlotType == slotType)
|
||||
{
|
||||
return slot;
|
||||
}
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ce74fc07cb1849b89ad101683cc63546
|
||||
MonoImporter:
|
||||
externalObjects: {}
|
||||
serializedVersion: 2
|
||||
defaultReferences: []
|
||||
executionOrder: 0
|
||||
icon: {instanceID: 0}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
||||
@@ -0,0 +1,82 @@
|
||||
using GeometryTD.CustomEvent;
|
||||
using GeometryTD.Definition;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class CombineSlotItem : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private TowerCompSlotType _acceptSlotType = TowerCompSlotType.None;
|
||||
|
||||
[SerializeField] private TMP_Text _titleText;
|
||||
|
||||
[SerializeField] private CommonButton _button;
|
||||
|
||||
private string _defaultTitle = string.Empty;
|
||||
|
||||
private long _boundItemId;
|
||||
|
||||
private int _slotIndex = -1;
|
||||
|
||||
public TowerCompSlotType AcceptSlotType => _acceptSlotType;
|
||||
|
||||
public bool HasItem => _boundItemId > 0;
|
||||
|
||||
public int SlotIndex => _slotIndex;
|
||||
|
||||
public long BoundItemId => _boundItemId;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
if (_titleText != null)
|
||||
{
|
||||
_defaultTitle = _titleText.text;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnInit(int slotIndex)
|
||||
{
|
||||
_slotIndex = slotIndex;
|
||||
ClearSlot();
|
||||
}
|
||||
|
||||
public void BindItem(RepoItemContext itemContext)
|
||||
{
|
||||
_boundItemId = itemContext?.InstanceId ?? 0;
|
||||
_button.Interactive = true;
|
||||
|
||||
if (_titleText != null)
|
||||
{
|
||||
_titleText.text = itemContext?.Title ?? string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
public void ClearSlot()
|
||||
{
|
||||
_boundItemId = 0;
|
||||
_button.Interactive = false;
|
||||
|
||||
if (_titleText != null)
|
||||
{
|
||||
_titleText.text = _defaultTitle;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnReset()
|
||||
{
|
||||
_slotIndex = -1;
|
||||
ClearSlot();
|
||||
}
|
||||
|
||||
public void OnClick()
|
||||
{
|
||||
if (_slotIndex < 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GameEntry.Event.Fire(this, CombineSlotClickedEventArgs.Create(_slotIndex));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: b172c08f0d9b46d3b2cb108a1cc67377
|
||||
timeCreated: 1772107100
|
||||
@@ -0,0 +1,126 @@
|
||||
using System.Collections.Generic;
|
||||
using GameFramework.ObjectPool;
|
||||
using GeometryTD.PoolObjectBase;
|
||||
using UnityEngine;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class CompArea : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private Transform m_Content;
|
||||
[SerializeField] private RepoItem m_ItemTemplate;
|
||||
[SerializeField] private int m_InstancePoolCapacity = 64;
|
||||
|
||||
private readonly List<RepoItem> m_ActiveItems = new List<RepoItem>();
|
||||
private readonly Dictionary<long, RepoItem> m_ItemMap = new Dictionary<long, RepoItem>();
|
||||
private IObjectPool<RepoItemObject> m_ItemPool;
|
||||
private string m_PoolName;
|
||||
|
||||
public void OnInit(CompAreaContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
OnReset();
|
||||
return;
|
||||
}
|
||||
|
||||
EnsurePool();
|
||||
OnReset();
|
||||
|
||||
if (context.Items == null || context.Items.Length == 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
for (int i = 0; i < context.Items.Length; i++)
|
||||
{
|
||||
RepoItem item = CreateOrSpawnItem();
|
||||
if (item == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
item.gameObject.SetActive(true);
|
||||
item.OnInit(context.Items[i]);
|
||||
m_ActiveItems.Add(item);
|
||||
m_ItemMap[context.Items[i].InstanceId] = item;
|
||||
}
|
||||
}
|
||||
|
||||
public void OnReset()
|
||||
{
|
||||
for (int i = m_ActiveItems.Count - 1; i >= 0; i--)
|
||||
{
|
||||
RepoItem item = m_ActiveItems[i];
|
||||
if (item == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
item.OnReset();
|
||||
item.gameObject.SetActive(false);
|
||||
m_ItemPool?.Unspawn(item);
|
||||
}
|
||||
|
||||
m_ActiveItems.Clear();
|
||||
m_ItemMap.Clear();
|
||||
}
|
||||
|
||||
private void OnDestroy()
|
||||
{
|
||||
OnReset();
|
||||
m_ItemPool?.ReleaseAllUnused();
|
||||
}
|
||||
|
||||
private void EnsurePool()
|
||||
{
|
||||
if (m_ItemPool != null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
m_PoolName = $"RepoItemPool_{GetInstanceID()}";
|
||||
m_ItemPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool<RepoItemObject>(m_PoolName, m_InstancePoolCapacity);
|
||||
}
|
||||
|
||||
private RepoItem CreateOrSpawnItem()
|
||||
{
|
||||
if (m_ItemPool == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
RepoItemObject itemObject = m_ItemPool.Spawn();
|
||||
RepoItem item = itemObject != null ? (RepoItem)itemObject.Target : null;
|
||||
if (item == null)
|
||||
{
|
||||
if (m_ItemTemplate == null)
|
||||
{
|
||||
Log.Warning("CompArea requires an item template.");
|
||||
return null;
|
||||
}
|
||||
|
||||
item = Instantiate(m_ItemTemplate);
|
||||
m_ItemPool.Register(RepoItemObject.Create(item), true);
|
||||
}
|
||||
|
||||
if (m_Content != null)
|
||||
{
|
||||
item.transform.SetParent(m_Content, false);
|
||||
}
|
||||
|
||||
return item;
|
||||
}
|
||||
|
||||
public void SetItemSelected(long itemId, bool isSelected)
|
||||
{
|
||||
if (!m_ItemMap.TryGetValue(itemId, out RepoItem item))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
item.SetSelected(isSelected);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: f3b1aede0e52479995cf71ba52a69d63
|
||||
timeCreated: 1772106310
|
||||
@@ -6,26 +6,27 @@ namespace GeometryTD.UI
|
||||
{
|
||||
public class EventForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private TMP_Text m_TitleText;
|
||||
[SerializeField] private TMP_Text m_DescriptionText;
|
||||
[SerializeField] private EventOptionItem[] m_OptionItems;
|
||||
[SerializeField] private TMP_Text _titleText;
|
||||
[SerializeField] private TMP_Text _descriptionText;
|
||||
[SerializeField] private EventOptionItem[] _optionItems;
|
||||
|
||||
private EventFormContext _context;
|
||||
|
||||
private EventFormContext m_Context;
|
||||
public void RefreshUI(EventFormContext context)
|
||||
{
|
||||
m_Context = context;
|
||||
_context = context;
|
||||
|
||||
if (m_TitleText != null)
|
||||
if (_titleText != null)
|
||||
{
|
||||
m_TitleText.text = context?.Title ?? string.Empty;
|
||||
_titleText.text = context?.Title ?? string.Empty;
|
||||
}
|
||||
|
||||
if (m_DescriptionText != null)
|
||||
if (_descriptionText != null)
|
||||
{
|
||||
m_DescriptionText.text = context?.Description ?? string.Empty;
|
||||
_descriptionText.text = context?.Description ?? string.Empty;
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_OptionItems.Length; i++)
|
||||
for (int i = 0; i < _optionItems.Length; i++)
|
||||
{
|
||||
EventOptionItemContext optionContext = null;
|
||||
if (context?.OptionItems != null && i < context.OptionItems.Length)
|
||||
@@ -33,9 +34,9 @@ namespace GeometryTD.UI
|
||||
optionContext = context.OptionItems[i];
|
||||
}
|
||||
|
||||
if (m_OptionItems[i] != null)
|
||||
if (_optionItems[i] != null)
|
||||
{
|
||||
m_OptionItems[i].OnInit(optionContext);
|
||||
_optionItems[i].OnInit(optionContext);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -55,27 +56,27 @@ namespace GeometryTD.UI
|
||||
|
||||
protected override void OnClose(bool isShutdown, object userData)
|
||||
{
|
||||
m_Context = null;
|
||||
_context = null;
|
||||
|
||||
if (m_TitleText != null)
|
||||
if (_titleText != null)
|
||||
{
|
||||
m_TitleText.text = string.Empty;
|
||||
_titleText.text = string.Empty;
|
||||
}
|
||||
|
||||
if (m_DescriptionText != null)
|
||||
if (_descriptionText != null)
|
||||
{
|
||||
m_DescriptionText.text = string.Empty;
|
||||
_descriptionText.text = string.Empty;
|
||||
}
|
||||
|
||||
for (int i = 0; i < m_OptionItems.Length; i++)
|
||||
foreach (var item in _optionItems)
|
||||
{
|
||||
if (m_OptionItems[i] != null)
|
||||
if (item != null)
|
||||
{
|
||||
m_OptionItems[i].OnReset();
|
||||
item.OnReset();
|
||||
}
|
||||
}
|
||||
|
||||
base.OnClose(isShutdown, userData);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
using UnityEngine;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoForm : UGuiForm
|
||||
{
|
||||
[SerializeField] private CombineArea _combineArea;
|
||||
[SerializeField] private CompArea _compArea;
|
||||
|
||||
public void RefreshUI(RepoFormContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_combineArea?.OnInit(context.CombineAreaContext);
|
||||
_compArea?.OnInit(context.CompAreaContext);
|
||||
}
|
||||
|
||||
public bool TryAssignItemToCombineArea(RepoItemContext itemContext)
|
||||
{
|
||||
if (_combineArea == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return _combineArea.TryAssignItem(itemContext);
|
||||
}
|
||||
|
||||
public bool TryClearCombineSlot(int slotIndex, out long removedItemId)
|
||||
{
|
||||
removedItemId = 0;
|
||||
if (_combineArea == null)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
return _combineArea.TryClearSlot(slotIndex, out removedItemId);
|
||||
}
|
||||
|
||||
public void SetRepoItemSelected(long itemId, bool isSelected)
|
||||
{
|
||||
_compArea?.SetItemSelected(itemId, isSelected);
|
||||
}
|
||||
|
||||
protected override void OnOpen(object userData)
|
||||
{
|
||||
base.OnOpen(userData);
|
||||
if (userData is RepoFormContext context)
|
||||
{
|
||||
RefreshUI(context);
|
||||
return;
|
||||
}
|
||||
|
||||
Log.Warning("RepoForm requires RepoFormContext as userData.");
|
||||
}
|
||||
|
||||
protected override void OnClose(bool isShutdown, object userData)
|
||||
{
|
||||
_combineArea?.OnReset();
|
||||
_compArea?.OnReset();
|
||||
base.OnClose(isShutdown, userData);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: e10fdbb413c14f5eb749888590f56ff7
|
||||
timeCreated: 1772106307
|
||||
@@ -0,0 +1,69 @@
|
||||
using GeometryTD.CustomEvent;
|
||||
using TMPro;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
using UnityGameFramework.Runtime;
|
||||
|
||||
namespace GeometryTD.UI
|
||||
{
|
||||
public class RepoItem : MonoBehaviour
|
||||
{
|
||||
[SerializeField] private TMP_Text _titleText;
|
||||
[SerializeField] private Image _highlightImage;
|
||||
|
||||
private static readonly Color NormalColor = new Color32(40, 40, 40, 180);
|
||||
private static readonly Color SelectedColor = new Color32(255, 216, 102, 255);
|
||||
|
||||
private RepoItemContext _context;
|
||||
|
||||
public void OnInit(RepoItemContext context)
|
||||
{
|
||||
if (context == null)
|
||||
{
|
||||
OnReset();
|
||||
return;
|
||||
}
|
||||
|
||||
_context = context;
|
||||
|
||||
if (_titleText != null)
|
||||
{
|
||||
_titleText.text = context.Title ?? string.Empty;
|
||||
}
|
||||
|
||||
SetSelected(false);
|
||||
}
|
||||
|
||||
public void OnReset()
|
||||
{
|
||||
_context = null;
|
||||
|
||||
if (_titleText != null)
|
||||
{
|
||||
_titleText.text = string.Empty;
|
||||
}
|
||||
|
||||
SetSelected(false);
|
||||
}
|
||||
|
||||
public void SetSelected(bool isSelected)
|
||||
{
|
||||
if (_highlightImage == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
_highlightImage.color = isSelected ? SelectedColor : NormalColor;
|
||||
}
|
||||
|
||||
public void OnClick()
|
||||
{
|
||||
if (_context == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
GameEntry.Event.Fire(this, RepoItemSelectedEventArgs.Create(_context.InstanceId));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ba332072a148499b8f6ec886c661c00f
|
||||
timeCreated: 1772106309
|
||||
Reference in New Issue
Block a user