diff --git a/Assets/GameMain/Scripts/CustomComponent/PlayerInventoryComponent.cs b/Assets/GameMain/Scripts/CustomComponent/PlayerInventoryComponent.cs index d24b58e..ad9d185 100644 --- a/Assets/GameMain/Scripts/CustomComponent/PlayerInventoryComponent.cs +++ b/Assets/GameMain/Scripts/CustomComponent/PlayerInventoryComponent.cs @@ -12,6 +12,7 @@ namespace GeometryTD.CustomComponent public class PlayerInventoryComponent : GameFrameworkComponent { private const int TowerLevelCount = 5; + private const int MaxParticipantTowerCount = 4; private BackpackInventoryData _inventory = new BackpackInventoryData(); private long _nextInstanceId = 1; private bool _initialized; @@ -31,6 +32,7 @@ namespace GeometryTD.CustomComponent public void OnInit() { _inventory = CloneInventory(RepoFormUseCase.SampleInventory()); + NormalizeParticipantState(); RebuildNextInstanceId(); _initialized = true; Log.Info( @@ -178,6 +180,55 @@ namespace GeometryTD.CustomComponent _inventory.Gold += resolvedGain; } + public bool TryAddParticipantTower(long towerInstanceId, int maxCount = 4) + { + EnsureInitialized(); + int resolvedMaxCount = Mathf.Max(1, maxCount); + resolvedMaxCount = Mathf.Min(resolvedMaxCount, MaxParticipantTowerCount); + if (!TryGetTowerById(towerInstanceId, out TowerItemData tower)) + { + return false; + } + + _inventory.ParticipantTowerInstanceIds ??= new List(); + if (_inventory.ParticipantTowerInstanceIds.Contains(towerInstanceId)) + { + tower.IsParticipatingInCombat = true; + return false; + } + + if (_inventory.ParticipantTowerInstanceIds.Count >= resolvedMaxCount) + { + return false; + } + + _inventory.ParticipantTowerInstanceIds.Add(towerInstanceId); + tower.IsParticipatingInCombat = true; + return true; + } + + public bool TryRemoveParticipantTower(long towerInstanceId) + { + EnsureInitialized(); + if (towerInstanceId <= 0 || _inventory.ParticipantTowerInstanceIds == null) + { + return false; + } + + bool removed = _inventory.ParticipantTowerInstanceIds.Remove(towerInstanceId); + if (!removed) + { + return false; + } + + if (TryGetTowerById(towerInstanceId, out TowerItemData tower)) + { + tower.IsParticipatingInCombat = false; + } + + return true; + } + public bool TryAssembleTower( long muzzleInstanceId, long bearingInstanceId, @@ -337,6 +388,27 @@ namespace GeometryTD.CustomComponent return false; } + private bool TryGetTowerById(long towerInstanceId, out TowerItemData tower) + { + tower = null; + if (towerInstanceId <= 0 || _inventory.Towers == null) + { + return false; + } + + for (int i = 0; i < _inventory.Towers.Count; i++) + { + TowerItemData candidate = _inventory.Towers[i]; + if (candidate != null && candidate.InstanceId == towerInstanceId) + { + tower = candidate; + return true; + } + } + + return false; + } + private bool TryBuildTowerStats( MuzzleCompItemData muzzleComp, BearingCompItemData bearingComp, @@ -555,6 +627,57 @@ namespace GeometryTD.CustomComponent _nextInstanceId = Math.Max(1, maxInstanceId + 1); } + private void NormalizeParticipantState() + { + if (_inventory == null) + { + return; + } + + _inventory.ParticipantTowerInstanceIds ??= new List(); + Dictionary towerMap = new Dictionary(); + if (_inventory.Towers != null) + { + for (int i = 0; i < _inventory.Towers.Count; i++) + { + TowerItemData tower = _inventory.Towers[i]; + if (tower == null || tower.InstanceId <= 0) + { + continue; + } + + tower.IsParticipatingInCombat = false; + towerMap[tower.InstanceId] = tower; + } + } + + List normalizedIds = new List(_inventory.ParticipantTowerInstanceIds.Count); + HashSet uniqueIds = new HashSet(); + for (int i = 0; i < _inventory.ParticipantTowerInstanceIds.Count; i++) + { + if (normalizedIds.Count >= MaxParticipantTowerCount) + { + break; + } + + long id = _inventory.ParticipantTowerInstanceIds[i]; + if (id <= 0 || !uniqueIds.Add(id)) + { + continue; + } + + if (!towerMap.TryGetValue(id, out TowerItemData tower)) + { + continue; + } + + tower.IsParticipatingInCombat = true; + normalizedIds.Add(id); + } + + _inventory.ParticipantTowerInstanceIds = normalizedIds; + } + private static BackpackInventoryData CloneInventory(BackpackInventoryData source) { BackpackInventoryData cloned = new BackpackInventoryData(); @@ -613,6 +736,18 @@ namespace GeometryTD.CustomComponent } } + if (source.ParticipantTowerInstanceIds != null) + { + for (int i = 0; i < source.ParticipantTowerInstanceIds.Count; i++) + { + long id = source.ParticipantTowerInstanceIds[i]; + if (id > 0) + { + cloned.ParticipantTowerInstanceIds.Add(id); + } + } + } + return cloned; } @@ -675,6 +810,7 @@ namespace GeometryTD.CustomComponent InstanceId = source.InstanceId, Name = source.Name, Rarity = source.Rarity, + IsParticipatingInCombat = source.IsParticipatingInCombat, MuzzleComponentInstanceId = source.MuzzleComponentInstanceId, BearingComponentInstanceId = source.BearingComponentInstanceId, BaseComponentInstanceId = source.BaseComponentInstanceId, @@ -717,4 +853,4 @@ namespace GeometryTD.CustomComponent return source != null ? (TagType[])source.Clone() : Array.Empty(); } } -} \ No newline at end of file +} diff --git a/Assets/GameMain/Scripts/Definition/DataStruct/BackpackInventoryData.cs b/Assets/GameMain/Scripts/Definition/DataStruct/BackpackInventoryData.cs index 6453bd4..0067135 100644 --- a/Assets/GameMain/Scripts/Definition/DataStruct/BackpackInventoryData.cs +++ b/Assets/GameMain/Scripts/Definition/DataStruct/BackpackInventoryData.cs @@ -33,5 +33,7 @@ namespace GeometryTD.Definition /// 背包中的防御塔实例。 /// public List Towers { get; set; } = new List(); + + public List ParticipantTowerInstanceIds { get; set; } = new List(); } } diff --git a/Assets/GameMain/Scripts/Definition/DataStruct/TowerItemData.cs b/Assets/GameMain/Scripts/Definition/DataStruct/TowerItemData.cs index 3554649..8e7b27f 100644 --- a/Assets/GameMain/Scripts/Definition/DataStruct/TowerItemData.cs +++ b/Assets/GameMain/Scripts/Definition/DataStruct/TowerItemData.cs @@ -39,6 +39,8 @@ namespace GeometryTD.Definition /// 防御塔品质。 /// public RarityType Rarity { get; set; } + + public bool IsParticipatingInCombat { get; set; } /// /// 构成该防御塔的枪口组件实例 Id。 diff --git a/Assets/GameMain/Scripts/Definition/Enum/RepoItemClickActionType.cs b/Assets/GameMain/Scripts/Definition/Enum/RepoItemClickActionType.cs new file mode 100644 index 0000000..8e74193 --- /dev/null +++ b/Assets/GameMain/Scripts/Definition/Enum/RepoItemClickActionType.cs @@ -0,0 +1,9 @@ +namespace GeometryTD.Definition +{ + public enum RepoItemClickActionType + { + OpenDetail, + RemoveParticipant, + + } +} \ No newline at end of file diff --git a/Assets/GameMain/Scripts/Definition/Enum/RepoItemClickActionType.cs.meta b/Assets/GameMain/Scripts/Definition/Enum/RepoItemClickActionType.cs.meta new file mode 100644 index 0000000..ce6a942 --- /dev/null +++ b/Assets/GameMain/Scripts/Definition/Enum/RepoItemClickActionType.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: abb9d4102f124528956d4ab5dcfd54a4 +timeCreated: 1772625883 \ No newline at end of file diff --git a/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantAssignRequestedEventArgs.cs b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantAssignRequestedEventArgs.cs new file mode 100644 index 0000000..7f5e344 --- /dev/null +++ b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantAssignRequestedEventArgs.cs @@ -0,0 +1,27 @@ +using GameFramework; +using GameFramework.Event; + +namespace GeometryTD.CustomEvent +{ + public sealed class RepoParticipantAssignRequestedEventArgs : GameEventArgs + { + public static int EventId => typeof(RepoParticipantAssignRequestedEventArgs).GetHashCode(); + + public override int Id => EventId; + + public long TowerItemId { get; private set; } + + public static RepoParticipantAssignRequestedEventArgs Create(long towerItemId) + { + RepoParticipantAssignRequestedEventArgs args = + ReferencePool.Acquire(); + args.TowerItemId = towerItemId; + return args; + } + + public override void Clear() + { + TowerItemId = 0; + } + } +} diff --git a/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantAssignRequestedEventArgs.cs.meta b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantAssignRequestedEventArgs.cs.meta new file mode 100644 index 0000000..443c5d4 --- /dev/null +++ b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantAssignRequestedEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: e28c7dca1c4d6684f949e3ea257b5ad8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantRemoveRequestedEventArgs.cs b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantRemoveRequestedEventArgs.cs new file mode 100644 index 0000000..571cf3d --- /dev/null +++ b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantRemoveRequestedEventArgs.cs @@ -0,0 +1,27 @@ +using GameFramework; +using GameFramework.Event; + +namespace GeometryTD.CustomEvent +{ + public sealed class RepoParticipantRemoveRequestedEventArgs : GameEventArgs + { + public static int EventId => typeof(RepoParticipantRemoveRequestedEventArgs).GetHashCode(); + + public override int Id => EventId; + + public long TowerItemId { get; private set; } + + public static RepoParticipantRemoveRequestedEventArgs Create(long towerItemId) + { + RepoParticipantRemoveRequestedEventArgs args = + ReferencePool.Acquire(); + args.TowerItemId = towerItemId; + return args; + } + + public override void Clear() + { + TowerItemId = 0; + } + } +} diff --git a/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantRemoveRequestedEventArgs.cs.meta b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantRemoveRequestedEventArgs.cs.meta new file mode 100644 index 0000000..ab8d93b --- /dev/null +++ b/Assets/GameMain/Scripts/Event/RepoForm/RepoParticipantRemoveRequestedEventArgs.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1438388ea5334474da123eadd2a55fc8 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/GameMain/Scripts/UI/Combat/Controller/CombatFinishFormController.cs b/Assets/GameMain/Scripts/UI/Combat/Controller/CombatFinishFormController.cs index dd7fc66..ef2a17f 100644 --- a/Assets/GameMain/Scripts/UI/Combat/Controller/CombatFinishFormController.cs +++ b/Assets/GameMain/Scripts/UI/Combat/Controller/CombatFinishFormController.cs @@ -129,6 +129,7 @@ namespace GeometryTD.UI InstanceId = tower.InstanceId, CanDrag = false, EnduranceRate01 = ItemDescUtility.ResolveTowerEnduranceRate(tower, muzzleMap, bearingMap, baseMap), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.None, IconAreaContext = BuildIconAreaContext(tower) }); @@ -157,6 +158,7 @@ namespace GeometryTD.UI InstanceId = item.InstanceId, CanDrag = false, EnduranceRate01 = ItemDescUtility.ResolveComponentEnduranceRate(item), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.Muzzle, IconAreaContext = BuildIconAreaContext(item) }); @@ -184,6 +186,7 @@ namespace GeometryTD.UI InstanceId = item.InstanceId, CanDrag = false, EnduranceRate01 = ItemDescUtility.ResolveComponentEnduranceRate(item), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.Bearing, IconAreaContext = BuildIconAreaContext(item) }); @@ -212,6 +215,7 @@ namespace GeometryTD.UI InstanceId = item.InstanceId, CanDrag = false, EnduranceRate01 = ItemDescUtility.ResolveComponentEnduranceRate(item), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.Base, IconAreaContext = BuildIconAreaContext(item) }); diff --git a/Assets/GameMain/Scripts/UI/Game/Context/ParticipantAreaContext.cs b/Assets/GameMain/Scripts/UI/Game/Context/ParticipantAreaContext.cs new file mode 100644 index 0000000..ef10ae5 --- /dev/null +++ b/Assets/GameMain/Scripts/UI/Game/Context/ParticipantAreaContext.cs @@ -0,0 +1,8 @@ +namespace GeometryTD.UI +{ + public class ParticipantAreaContext : UIContext + { + public RepoItemContext[] Items; + public int MaxCount; + } +} diff --git a/Assets/GameMain/Scripts/UI/Game/Context/ParticipantAreaContext.cs.meta b/Assets/GameMain/Scripts/UI/Game/Context/ParticipantAreaContext.cs.meta new file mode 100644 index 0000000..92f518c --- /dev/null +++ b/Assets/GameMain/Scripts/UI/Game/Context/ParticipantAreaContext.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: dba2ecceff78486fb2a251e7c28ce9c0 +timeCreated: 1772624131 \ No newline at end of file diff --git a/Assets/GameMain/Scripts/UI/Game/Context/RepoFormContext.cs b/Assets/GameMain/Scripts/UI/Game/Context/RepoFormContext.cs index efc000c..e6e1afb 100644 --- a/Assets/GameMain/Scripts/UI/Game/Context/RepoFormContext.cs +++ b/Assets/GameMain/Scripts/UI/Game/Context/RepoFormContext.cs @@ -6,5 +6,6 @@ namespace GeometryTD.UI { public CombineAreaContext CombineAreaContext; public CompAreaContext CompAreaContext; + public ParticipantAreaContext ParticipantAreaContext; } } diff --git a/Assets/GameMain/Scripts/UI/Game/Context/RepoItemClickActionType.cs b/Assets/GameMain/Scripts/UI/Game/Context/RepoItemClickActionType.cs new file mode 100644 index 0000000..ae1db0b --- /dev/null +++ b/Assets/GameMain/Scripts/UI/Game/Context/RepoItemClickActionType.cs @@ -0,0 +1,8 @@ +namespace GeometryTD.UI +{ + public enum RepoItemClickActionType : byte + { + OpenDetail = 0, + RemoveParticipant = 1 + } +} diff --git a/Assets/GameMain/Scripts/UI/Game/Context/RepoItemClickActionType.cs.meta b/Assets/GameMain/Scripts/UI/Game/Context/RepoItemClickActionType.cs.meta new file mode 100644 index 0000000..93e849b --- /dev/null +++ b/Assets/GameMain/Scripts/UI/Game/Context/RepoItemClickActionType.cs.meta @@ -0,0 +1 @@ +fileFormatVersion: 2`nguid: d3f0b6db2f8d4310b1f6c6f61d2075d1`nMonoImporter:`n externalObjects: {}`n serializedVersion: 2`n defaultReferences: []`n executionOrder: 0`n icon: {instanceID: 0}`n userData: `n assetBundleName: `n assetBundleVariant: `n diff --git a/Assets/GameMain/Scripts/UI/Game/Context/RepoItemContext.cs b/Assets/GameMain/Scripts/UI/Game/Context/RepoItemContext.cs index 6b81471..2305a21 100644 --- a/Assets/GameMain/Scripts/UI/Game/Context/RepoItemContext.cs +++ b/Assets/GameMain/Scripts/UI/Game/Context/RepoItemContext.cs @@ -9,6 +9,7 @@ namespace GeometryTD.UI public long InstanceId; public bool CanDrag; public float EnduranceRate01; + public RepoItemClickActionType ClickActionType; public TowerCompSlotType ComponentSlotType; public IconAreaContext IconAreaContext; } diff --git a/Assets/GameMain/Scripts/UI/Game/Controller/RepoFormController.cs b/Assets/GameMain/Scripts/UI/Game/Controller/RepoFormController.cs index cf000fa..5006816 100644 --- a/Assets/GameMain/Scripts/UI/Game/Controller/RepoFormController.cs +++ b/Assets/GameMain/Scripts/UI/Game/Controller/RepoFormController.cs @@ -11,9 +11,11 @@ namespace GeometryTD.UI { public class RepoFormController : UIFormControllerCommonBase { + private const int MaxParticipantCount = 4; private RepoFormUseCase _useCase; private readonly Dictionary _itemContextMap = new Dictionary(); private readonly Dictionary _itemDescSeedMap = new Dictionary(); + private readonly HashSet _participantTowerIds = new HashSet(); private sealed class ItemDescSeed { @@ -28,6 +30,7 @@ namespace GeometryTD.UI protected override void RefreshUI(RepoForm form, RepoFormContext context) { form.RefreshUI(context); + ApplyParticipantSelection(); } protected override void SubscribeCustomEvents() @@ -36,6 +39,8 @@ namespace GeometryTD.UI GameEntry.Event.Subscribe(RepoItemDragEndedEventArgs.EventId, OnRepoItemDragEnded); GameEntry.Event.Subscribe(CombineSlotClickedEventArgs.EventId, OnCombineSlotClicked); GameEntry.Event.Subscribe(RepoCombineRequestedEventArgs.EventId, OnRepoCombineRequested); + GameEntry.Event.Subscribe(RepoParticipantAssignRequestedEventArgs.EventId, OnRepoParticipantAssignRequested); + GameEntry.Event.Subscribe(RepoParticipantRemoveRequestedEventArgs.EventId, OnRepoParticipantRemoveRequested); GameEntry.Event.Subscribe(RepoFormReturnEventArgs.EventId, OnRepoFormReturn); } @@ -45,6 +50,8 @@ namespace GeometryTD.UI GameEntry.Event.Unsubscribe(RepoItemDragEndedEventArgs.EventId, OnRepoItemDragEnded); GameEntry.Event.Unsubscribe(CombineSlotClickedEventArgs.EventId, OnCombineSlotClicked); GameEntry.Event.Unsubscribe(RepoCombineRequestedEventArgs.EventId, OnRepoCombineRequested); + GameEntry.Event.Unsubscribe(RepoParticipantAssignRequestedEventArgs.EventId, OnRepoParticipantAssignRequested); + GameEntry.Event.Unsubscribe(RepoParticipantRemoveRequestedEventArgs.EventId, OnRepoParticipantRemoveRequested); GameEntry.Event.Unsubscribe(RepoFormReturnEventArgs.EventId, OnRepoFormReturn); } @@ -99,12 +106,14 @@ namespace GeometryTD.UI _itemDescSeedMap.Clear(); if (rawData?.Inventory == null) { + _participantTowerIds.Clear(); return null; } Dictionary muzzleMap = BuildComponentMap(rawData.Inventory.MuzzleComponents); Dictionary bearingMap = BuildComponentMap(rawData.Inventory.BearingComponents); Dictionary baseMap = BuildComponentMap(rawData.Inventory.BaseComponents); + Dictionary towerMap = BuildTowerMap(rawData.Inventory.Towers); List items = new List(); if (rawData.Inventory.Towers != null) @@ -121,6 +130,7 @@ namespace GeometryTD.UI InstanceId = tower.InstanceId, CanDrag = true, EnduranceRate01 = ItemDescUtility.ResolveTowerEnduranceRate(tower, muzzleMap, bearingMap, baseMap), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.None, IconAreaContext = BuildIconAreaContext(tower) }); @@ -147,6 +157,7 @@ namespace GeometryTD.UI InstanceId = item.InstanceId, CanDrag = true, EnduranceRate01 = ItemDescUtility.ResolveComponentEnduranceRate(item), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.Muzzle, IconAreaContext = BuildIconAreaContext(item) }); @@ -173,6 +184,7 @@ namespace GeometryTD.UI InstanceId = item.InstanceId, CanDrag = true, EnduranceRate01 = ItemDescUtility.ResolveComponentEnduranceRate(item), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.Bearing, IconAreaContext = BuildIconAreaContext(item) }); @@ -199,6 +211,7 @@ namespace GeometryTD.UI InstanceId = item.InstanceId, CanDrag = true, EnduranceRate01 = ItemDescUtility.ResolveComponentEnduranceRate(item), + ClickActionType = RepoItemClickActionType.OpenDetail, ComponentSlotType = TowerCompSlotType.Base, IconAreaContext = BuildIconAreaContext(item) }); @@ -211,13 +224,17 @@ namespace GeometryTD.UI } } + ParticipantAreaContext participantAreaContext = + BuildParticipantAreaContext(rawData.Inventory, towerMap, muzzleMap, bearingMap, baseMap); + return new RepoFormContext { CombineAreaContext = new CombineAreaContext(), CompAreaContext = new CompAreaContext { Items = items.ToArray() - } + }, + ParticipantAreaContext = participantAreaContext }; } @@ -288,6 +305,112 @@ namespace GeometryTD.UI return map; } + private static Dictionary BuildTowerMap(IReadOnlyList towers) + { + Dictionary map = new Dictionary(); + if (towers == null) + { + return map; + } + + for (int i = 0; i < towers.Count; i++) + { + TowerItemData tower = towers[i]; + if (tower == null || tower.InstanceId <= 0) + { + continue; + } + + map[tower.InstanceId] = tower; + } + + return map; + } + + private ParticipantAreaContext BuildParticipantAreaContext( + BackpackInventoryData inventory, + IReadOnlyDictionary towerMap, + IReadOnlyDictionary muzzleMap, + IReadOnlyDictionary bearingMap, + IReadOnlyDictionary baseMap) + { + _participantTowerIds.Clear(); + List participantItems = new List(); + if (inventory?.ParticipantTowerInstanceIds != null && towerMap != null) + { + for (int i = 0; i < inventory.ParticipantTowerInstanceIds.Count; i++) + { + long towerId = inventory.ParticipantTowerInstanceIds[i]; + if (towerId <= 0) + { + continue; + } + + if (!towerMap.TryGetValue(towerId, out TowerItemData tower) || tower == null) + { + continue; + } + + if (!_participantTowerIds.Add(towerId)) + { + continue; + } + + participantItems.Add(new RepoItemContext + { + InstanceId = tower.InstanceId, + CanDrag = false, + EnduranceRate01 = ItemDescUtility.ResolveTowerEnduranceRate(tower, muzzleMap, bearingMap, baseMap), + ClickActionType = RepoItemClickActionType.RemoveParticipant, + ComponentSlotType = TowerCompSlotType.None, + IconAreaContext = BuildIconAreaContext(tower) + }); + } + } + + return new ParticipantAreaContext + { + Items = participantItems.ToArray(), + MaxCount = MaxParticipantCount + }; + } + + private void ApplyParticipantSelection() + { + if (Form == null || _itemContextMap.Count <= 0) + { + return; + } + + foreach (KeyValuePair pair in _itemContextMap) + { + RepoItemContext itemContext = pair.Value; + if (itemContext == null || itemContext.ComponentSlotType != TowerCompSlotType.None) + { + continue; + } + + Form.SetRepoItemSelected(pair.Key, _participantTowerIds.Contains(pair.Key)); + } + } + + private void RefreshParticipantAreaOnly() + { + if (_useCase == null || Form == null) + { + return; + } + + RepoFormContext latestContext = BuildContext(_useCase.CreateInitialModel()); + if (latestContext?.ParticipantAreaContext == null) + { + return; + } + + Form.RefreshParticipantArea(latestContext.ParticipantAreaContext); + ApplyParticipantSelection(); + } + private static IconAreaContext BuildIconAreaContext(TowerItemData tower) { if (tower == null) @@ -447,9 +570,60 @@ namespace GeometryTD.UI if (latestContext != null) { Form.RefreshUI(latestContext); + ApplyParticipantSelection(); } } + private void OnRepoParticipantAssignRequested(object sender, GameEventArgs e) + { + if (!IsEventFromCurrentForm(sender)) + { + return; + } + + if (!(e is RepoParticipantAssignRequestedEventArgs args)) + { + return; + } + + if (_useCase == null || Form == null || args.TowerItemId <= 0) + { + return; + } + + if (!_useCase.TryAddParticipantTower(args.TowerItemId)) + { + return; + } + + RefreshParticipantAreaOnly(); + } + + private void OnRepoParticipantRemoveRequested(object sender, GameEventArgs e) + { + if (!IsEventFromCurrentForm(sender)) + { + return; + } + + if (!(e is RepoParticipantRemoveRequestedEventArgs args)) + { + return; + } + + if (_useCase == null || Form == null || args.TowerItemId <= 0) + { + return; + } + + if (!_useCase.TryRemoveParticipantTower(args.TowerItemId)) + { + return; + } + + RefreshParticipantAreaOnly(); + } + private bool IsEventFromCurrentForm(object sender) { if (Form == null) diff --git a/Assets/GameMain/Scripts/UI/Game/UseCase/RepoFormUseCase.cs b/Assets/GameMain/Scripts/UI/Game/UseCase/RepoFormUseCase.cs index eeaba22..bacbb63 100644 --- a/Assets/GameMain/Scripts/UI/Game/UseCase/RepoFormUseCase.cs +++ b/Assets/GameMain/Scripts/UI/Game/UseCase/RepoFormUseCase.cs @@ -4,11 +4,14 @@ namespace GeometryTD.UI { public class RepoFormUseCase : IUIUseCase { + private const int MaxParticipantCount = 4; + private BackpackInventoryData _fallbackInventory; + public RepoFormRawData CreateInitialModel() { BackpackInventoryData sample = GameEntry.PlayerInventory != null ? GameEntry.PlayerInventory.GetInventorySnapshot() - : SampleInventory(); + : GetOrCreateFallbackInventory(); return new RepoFormRawData { Inventory = sample @@ -29,6 +32,169 @@ namespace GeometryTD.UI out _); } + public bool TryAddParticipantTower(long towerItemId) + { + if (GameEntry.PlayerInventory == null) + { + BackpackInventoryData fallbackInventory = GetOrCreateFallbackInventory(); + return TryAddParticipantTowerInternal(fallbackInventory, towerItemId, MaxParticipantCount); + } + + return GameEntry.PlayerInventory.TryAddParticipantTower(towerItemId, 4); + } + + public bool TryRemoveParticipantTower(long towerItemId) + { + if (GameEntry.PlayerInventory == null) + { + BackpackInventoryData fallbackInventory = GetOrCreateFallbackInventory(); + return TryRemoveParticipantTowerInternal(fallbackInventory, towerItemId); + } + + return GameEntry.PlayerInventory.TryRemoveParticipantTower(towerItemId); + } + + private BackpackInventoryData GetOrCreateFallbackInventory() + { + _fallbackInventory ??= SampleInventory(); + NormalizeParticipantState(_fallbackInventory); + return _fallbackInventory; + } + + private static bool TryAddParticipantTowerInternal( + BackpackInventoryData inventory, + long towerItemId, + int maxCount) + { + if (inventory == null || towerItemId <= 0) + { + return false; + } + + NormalizeParticipantState(inventory); + if (!TryGetTowerById(inventory, towerItemId, out TowerItemData tower)) + { + return false; + } + + inventory.ParticipantTowerInstanceIds ??= new System.Collections.Generic.List(); + if (inventory.ParticipantTowerInstanceIds.Contains(towerItemId)) + { + tower.IsParticipatingInCombat = true; + return false; + } + + if (inventory.ParticipantTowerInstanceIds.Count >= UnityEngine.Mathf.Max(1, maxCount)) + { + return false; + } + + inventory.ParticipantTowerInstanceIds.Add(towerItemId); + tower.IsParticipatingInCombat = true; + return true; + } + + private static bool TryRemoveParticipantTowerInternal(BackpackInventoryData inventory, long towerItemId) + { + if (inventory == null || towerItemId <= 0) + { + return false; + } + + NormalizeParticipantState(inventory); + if (inventory.ParticipantTowerInstanceIds == null) + { + return false; + } + + bool removed = inventory.ParticipantTowerInstanceIds.Remove(towerItemId); + if (!removed) + { + return false; + } + + if (TryGetTowerById(inventory, towerItemId, out TowerItemData tower)) + { + tower.IsParticipatingInCombat = false; + } + + return true; + } + + private static bool TryGetTowerById(BackpackInventoryData inventory, long towerItemId, out TowerItemData tower) + { + tower = null; + if (inventory?.Towers == null || towerItemId <= 0) + { + return false; + } + + for (int i = 0; i < inventory.Towers.Count; i++) + { + TowerItemData candidate = inventory.Towers[i]; + if (candidate != null && candidate.InstanceId == towerItemId) + { + tower = candidate; + return true; + } + } + + return false; + } + + private static void NormalizeParticipantState(BackpackInventoryData inventory) + { + if (inventory == null) + { + return; + } + + inventory.ParticipantTowerInstanceIds ??= new System.Collections.Generic.List(); + System.Collections.Generic.Dictionary towerMap = + new System.Collections.Generic.Dictionary(); + if (inventory.Towers != null) + { + for (int i = 0; i < inventory.Towers.Count; i++) + { + TowerItemData tower = inventory.Towers[i]; + if (tower == null || tower.InstanceId <= 0) + { + continue; + } + + tower.IsParticipatingInCombat = false; + towerMap[tower.InstanceId] = tower; + } + } + + System.Collections.Generic.HashSet uniqueIds = new System.Collections.Generic.HashSet(); + System.Collections.Generic.List normalizedIds = + new System.Collections.Generic.List(inventory.ParticipantTowerInstanceIds.Count); + for (int i = 0; i < inventory.ParticipantTowerInstanceIds.Count; i++) + { + if (normalizedIds.Count >= MaxParticipantCount) + { + break; + } + + long towerId = inventory.ParticipantTowerInstanceIds[i]; + if (towerId <= 0 || !uniqueIds.Add(towerId)) + { + continue; + } + + if (!towerMap.TryGetValue(towerId, out TowerItemData tower)) + { + continue; + } + + tower.IsParticipatingInCombat = true; + normalizedIds.Add(towerId); + } + + inventory.ParticipantTowerInstanceIds = normalizedIds; + } + public static BackpackInventoryData SampleInventory() { BackpackInventoryData inventory = new BackpackInventoryData @@ -167,6 +333,7 @@ namespace GeometryTD.UI InstanceId = 90001, Name = "测试防御塔-A", Rarity = RarityType.Green, + IsParticipatingInCombat = true, MuzzleComponentInstanceId = muzzle.InstanceId, BearingComponentInstanceId = bearing.InstanceId, BaseComponentInstanceId = baseComp.InstanceId, @@ -189,6 +356,7 @@ namespace GeometryTD.UI InstanceId = 90002, Name = "测试防御塔-B", Rarity = RarityType.Blue, + IsParticipatingInCombat = false, MuzzleComponentInstanceId = 0, BearingComponentInstanceId = 0, BaseComponentInstanceId = 0, @@ -205,6 +373,8 @@ namespace GeometryTD.UI } }); + inventory.ParticipantTowerInstanceIds.Add(90001); + return inventory; } } diff --git a/Assets/GameMain/Scripts/UI/Game/View/ParticipantArea.cs b/Assets/GameMain/Scripts/UI/Game/View/ParticipantArea.cs new file mode 100644 index 0000000..2433976 --- /dev/null +++ b/Assets/GameMain/Scripts/UI/Game/View/ParticipantArea.cs @@ -0,0 +1,177 @@ +using System.Collections.Generic; +using GameFramework.ObjectPool; +using GeometryTD.CustomEvent; +using GeometryTD.Definition; +using GeometryTD.PoolObjectBase; +using UnityEngine; +using UnityEngine.EventSystems; +using UnityGameFramework.Runtime; + +namespace GeometryTD.UI +{ + public class ParticipantArea : MonoBehaviour, IDropHandler + { + [SerializeField] private Transform _content; + [SerializeField] private RepoItem _itemTemplate; + [SerializeField] private int _instancePoolCapacity = 8; + + private readonly List _activeItems = new List(); + private readonly HashSet _boundItemIds = new HashSet(); + private IObjectPool _itemPool; + private string _poolName; + private int _maxCount = 4; + + public void OnInit(ParticipantAreaContext context) + { + OnReset(); + EnsurePool(); + + _maxCount = Mathf.Max(1, context != null ? context.MaxCount : 4); + if (context?.Items == null || context.Items.Length <= 0) + { + return; + } + + for (int i = 0; i < context.Items.Length; i++) + { + RepoItemContext itemContext = context.Items[i]; + if (itemContext == null || itemContext.InstanceId <= 0) + { + continue; + } + + RepoItem item = CreateOrSpawnItem(); + if (item == null) + { + continue; + } + + item.gameObject.SetActive(true); + item.OnInit(itemContext); + _activeItems.Add(item); + _boundItemIds.Add(itemContext.InstanceId); + } + } + + public void OnReset() + { + for (int i = _activeItems.Count - 1; i >= 0; i--) + { + RepoItem item = _activeItems[i]; + if (item == null) + { + continue; + } + + item.OnReset(); + item.gameObject.SetActive(false); + _itemPool?.Unspawn(item); + } + + _activeItems.Clear(); + _boundItemIds.Clear(); + _maxCount = 4; + } + + private void OnDestroy() + { + OnReset(); + _itemPool?.ReleaseAllUnused(); + } + + public bool CanAssign(RepoItemContext itemContext) + { + if (itemContext == null || itemContext.InstanceId <= 0) + { + return false; + } + + if (itemContext.ComponentSlotType != TowerCompSlotType.None) + { + return false; + } + + if (_boundItemIds.Contains(itemContext.InstanceId)) + { + return false; + } + + if (_boundItemIds.Count >= _maxCount) + { + return false; + } + + return true; + } + + public void OnDrop(PointerEventData eventData) + { + if (eventData == null) + { + return; + } + + GameObject pointerDrag = eventData.pointerDrag; + if (pointerDrag == null) + { + return; + } + + RepoItem repoItem = pointerDrag.GetComponent() ?? pointerDrag.GetComponentInParent(); + if (repoItem == null) + { + return; + } + + RepoItemContext itemContext = repoItem.Context; + bool assigned = CanAssign(itemContext); + repoItem.SetDropResult(assigned); + if (!assigned) + { + return; + } + + GameEntry.Event.Fire(this, RepoParticipantAssignRequestedEventArgs.Create(itemContext.InstanceId)); + } + + private void EnsurePool() + { + if (_itemPool != null) + { + return; + } + + _poolName = $"ParticipantRepoItemPool_{GetInstanceID()}"; + _itemPool = GameEntry.ObjectPool.CreateSingleSpawnObjectPool(_poolName, _instancePoolCapacity); + } + + private RepoItem CreateOrSpawnItem() + { + if (_itemPool == null) + { + return null; + } + + RepoItemObject itemObject = _itemPool.Spawn(); + RepoItem item = itemObject != null ? (RepoItem)itemObject.Target : null; + if (item == null) + { + if (_itemTemplate == null) + { + Log.Warning("ParticipantArea requires an item template."); + return null; + } + + item = Instantiate(_itemTemplate); + _itemPool.Register(RepoItemObject.Create(item), true); + } + + if (_content != null) + { + item.transform.SetParent(_content, false); + } + + return item; + } + } +} diff --git a/Assets/GameMain/Scripts/UI/Game/View/ParticipantArea.cs.meta b/Assets/GameMain/Scripts/UI/Game/View/ParticipantArea.cs.meta new file mode 100644 index 0000000..85e4bd5 --- /dev/null +++ b/Assets/GameMain/Scripts/UI/Game/View/ParticipantArea.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 23b62a700198440baabc75e28f901578 +timeCreated: 1772624093 \ No newline at end of file diff --git a/Assets/GameMain/Scripts/UI/Game/View/RepoForm.cs b/Assets/GameMain/Scripts/UI/Game/View/RepoForm.cs index 2ee95f6..b3fe4c7 100644 --- a/Assets/GameMain/Scripts/UI/Game/View/RepoForm.cs +++ b/Assets/GameMain/Scripts/UI/Game/View/RepoForm.cs @@ -7,7 +7,10 @@ namespace GeometryTD.UI public class RepoForm : UGuiForm { [SerializeField] private CombineArea _combineArea; + [SerializeField] private CompArea _compArea; + + [SerializeField] private ParticipantArea _participantArea; public void RefreshUI(RepoFormContext context) { @@ -18,6 +21,7 @@ namespace GeometryTD.UI _combineArea?.OnInit(context.CombineAreaContext); _compArea?.OnInit(context.CompAreaContext); + _participantArea?.OnInit(context.ParticipantAreaContext); } public bool TryAssignItemToCombineArea(RepoItemContext itemContext) @@ -46,6 +50,11 @@ namespace GeometryTD.UI _compArea?.SetItemSelected(itemId, isSelected); } + public void RefreshParticipantArea(ParticipantAreaContext context) + { + _participantArea?.OnInit(context); + } + protected override void OnOpen(object userData) { base.OnOpen(userData); @@ -62,6 +71,7 @@ namespace GeometryTD.UI { _combineArea?.OnReset(); _compArea?.OnReset(); + _participantArea?.OnReset(); base.OnClose(isShutdown, userData); } @@ -70,4 +80,4 @@ namespace GeometryTD.UI GameEntry.Event.Fire(this, RepoFormReturnEventArgs.Create()); } } -} \ No newline at end of file +} diff --git a/Assets/GameMain/Scripts/UI/Game/View/RepoItem.cs b/Assets/GameMain/Scripts/UI/Game/View/RepoItem.cs index a2df8fa..168ce9f 100644 --- a/Assets/GameMain/Scripts/UI/Game/View/RepoItem.cs +++ b/Assets/GameMain/Scripts/UI/Game/View/RepoItem.cs @@ -108,6 +108,12 @@ namespace GeometryTD.UI return; } + if (_context.ClickActionType == RepoItemClickActionType.RemoveParticipant) + { + GameEntry.Event.Fire(this, RepoParticipantRemoveRequestedEventArgs.Create(_context.InstanceId)); + return; + } + StartPendingOpenDetail(); } @@ -195,7 +201,12 @@ namespace GeometryTD.UI private bool CanStartDrag(PointerEventData eventData) { - if (_context == null || _isSelected || _isDragging) + if (_context == null || _isDragging) + { + return false; + } + + if (_isSelected && _context.ComponentSlotType != TowerCompSlotType.None) { return false; } @@ -205,11 +216,6 @@ namespace GeometryTD.UI return false; } - if (_context.ComponentSlotType == TowerCompSlotType.None) - { - return false; - } - if (eventData == null || eventData.button != PointerEventData.InputButton.Left) { return false; @@ -292,12 +298,25 @@ namespace GeometryTD.UI { DestroyDragGhost(); - if (_dragRoot == null || _iconArea == null) + if (_dragRoot == null) { return false; } - Sprite iconSprite = _iconArea.CurrentIconSprite; + Sprite iconSprite = _iconArea != null ? _iconArea.CurrentIconSprite : null; + Color iconColor = _iconArea != null ? _iconArea.CurrentIconColor : Color.white; + Material iconMaterial = _iconArea != null ? _iconArea.CurrentIconMaterial : null; + Vector2 iconSize = _iconArea != null ? _iconArea.CurrentIconSize : Vector2.zero; + + // Towers may not have an icon sprite; fall back to background sprite so drag still works. + if (iconSprite == null && _bgImage != null) + { + iconSprite = _bgImage.sprite; + iconColor = _bgImage.color; + iconMaterial = _bgImage.material; + iconSize = _bgImage.rectTransform.rect.size; + } + if (iconSprite == null) { return false; @@ -312,7 +331,6 @@ namespace GeometryTD.UI _dragGhostRect.anchorMax = new Vector2(0.5f, 0.5f); _dragGhostRect.pivot = new Vector2(0.5f, 0.5f); - Vector2 iconSize = _iconArea.CurrentIconSize; if (iconSize.x <= 0f || iconSize.y <= 0f) { iconSize = DefaultDragGhostSize; @@ -322,8 +340,8 @@ namespace GeometryTD.UI Image ghostImage = _dragGhostObject.GetComponent(); ghostImage.raycastTarget = false; ghostImage.sprite = iconSprite; - ghostImage.color = _iconArea.CurrentIconColor; - ghostImage.material = _iconArea.CurrentIconMaterial; + ghostImage.color = iconColor; + ghostImage.material = iconMaterial; ghostImage.preserveAspect = true; CanvasGroup ghostCanvasGroup = _dragGhostObject.GetComponent(); diff --git a/Assets/GameMain/UI/UIForms/ItemDescForm.prefab b/Assets/GameMain/UI/UIForms/ItemDescForm.prefab index 6df4570..3981cf2 100644 --- a/Assets/GameMain/UI/UIForms/ItemDescForm.prefab +++ b/Assets/GameMain/UI/UIForms/ItemDescForm.prefab @@ -258,7 +258,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 30, y: -50} - m_SizeDelta: {x: 500, y: 100} + m_SizeDelta: {x: 740, y: 100} m_Pivot: {x: 0, y: 1} --- !u!222 &3590733437255178557 CanvasRenderer: @@ -393,7 +393,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 1} m_AnchorMax: {x: 0, y: 1} m_AnchoredPosition: {x: 30, y: -150} - m_SizeDelta: {x: 500, y: 80} + m_SizeDelta: {x: 740, y: 80} m_Pivot: {x: 0, y: 1} --- !u!222 &6203466971508003467 CanvasRenderer: diff --git a/Assets/GameMain/UI/UIForms/RepoForm.prefab b/Assets/GameMain/UI/UIForms/RepoForm.prefab index 1a61efc..b7e49a4 100644 --- a/Assets/GameMain/UI/UIForms/RepoForm.prefab +++ b/Assets/GameMain/UI/UIForms/RepoForm.prefab @@ -34,8 +34,8 @@ RectTransform: m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 1, y: 0} m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: -650, y: -100} - m_SizeDelta: {x: 1200, y: -200} + m_AnchoredPosition: {x: -650, y: 0} + m_SizeDelta: {x: 1200, y: -400.00003} m_Pivot: {x: 0.5, y: 0.5} --- !u!114 &370202498391855143 MonoBehaviour: @@ -128,6 +128,100 @@ MonoBehaviour: m_Spacing: {x: 20, y: 20} m_Constraint: 1 m_ConstraintCount: 6 +--- !u!1 &3151563931008387230 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6194629833245286025} + - component: {fileID: 6217930899804600847} + - component: {fileID: 5388327515888957795} + - component: {fileID: 9116268328124443995} + m_Layer: 5 + m_Name: ParticipantArea + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6194629833245286025 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3151563931008387230} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6046599583992061665} + - {fileID: 6811784024412969593} + m_Father: {fileID: 948419798348630685} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 771.5, y: -560} + m_SizeDelta: {x: 1175, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!114 &6217930899804600847 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3151563931008387230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 23b62a700198440baabc75e28f901578, type: 3} + m_Name: + m_EditorClassIdentifier: + _content: {fileID: 6811784024412969593} + _itemTemplate: {fileID: 8394974685918372820, guid: 2ead8e403e355dd4b9296a9d0a871a83, + type: 3} + _instancePoolCapacity: 8 +--- !u!222 &5388327515888957795 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3151563931008387230} + m_CullTransparentMesh: 1 +--- !u!114 &9116268328124443995 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3151563931008387230} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &3339982533413687751 GameObject: m_ObjectHideFlags: 0 @@ -138,6 +232,8 @@ GameObject: m_Component: - component: {fileID: 437137211665287909} - component: {fileID: 2687805356437946940} + - component: {fileID: 5216274833988519258} + - component: {fileID: 2723756476935543858} m_Layer: 5 m_Name: CombineArea m_TagString: Untagged @@ -192,6 +288,44 @@ MonoBehaviour: - {fileID: 8189434761781366953} - {fileID: 7373972901994129571} - {fileID: 1229930097058638238} +--- !u!222 &5216274833988519258 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3339982533413687751} + m_CullTransparentMesh: 1 +--- !u!114 &2723756476935543858 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3339982533413687751} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 0} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_Sprite: {fileID: 0} + m_Type: 0 + m_PreserveAspect: 0 + m_FillCenter: 1 + m_FillMethod: 4 + m_FillAmount: 1 + m_FillClockwise: 1 + m_FillOrigin: 0 + m_UseSpriteMesh: 0 + m_PixelsPerUnitMultiplier: 1 --- !u!1 &3681983101697451234 GameObject: m_ObjectHideFlags: 0 @@ -243,6 +377,7 @@ MonoBehaviour: m_EditorClassIdentifier: _combineArea: {fileID: 2687805356437946940} _compArea: {fileID: 370202498391855143} + _participantArea: {fileID: 6217930899804600847} --- !u!1 &4000410608128749255 GameObject: m_ObjectHideFlags: 0 @@ -513,6 +648,203 @@ MonoBehaviour: m_OnValueChanged: m_PersistentCalls: m_Calls: [] +--- !u!1 &4977771823416823721 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6811784024412969593} + - component: {fileID: 7576549425996255162} + m_Layer: 5 + m_Name: Parent + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6811784024412969593 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4977771823416823721} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6194629833245286025} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 1} + m_AnchorMax: {x: 0, y: 1} + m_AnchoredPosition: {x: 1175, y: -80} + m_SizeDelta: {x: 700, y: 160} + m_Pivot: {x: 1, y: 0.5} +--- !u!114 &7576549425996255162 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4977771823416823721} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 30649d3a9faa99c48a7b1166b86bf2a0, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Padding: + m_Left: 0 + m_Right: 0 + m_Top: 0 + m_Bottom: 0 + m_ChildAlignment: 3 + m_Spacing: 20 + m_ChildForceExpandWidth: 0 + m_ChildForceExpandHeight: 1 + m_ChildControlWidth: 0 + m_ChildControlHeight: 0 + m_ChildScaleWidth: 0 + m_ChildScaleHeight: 0 + m_ReverseArrangement: 0 +--- !u!1 &5196197715904290498 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6046599583992061665} + - component: {fileID: 2503187454698265825} + - component: {fileID: 6829657461328831593} + m_Layer: 5 + m_Name: TipText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6046599583992061665 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5196197715904290498} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6194629833245286025} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: -414.417, y: 0} + m_SizeDelta: {x: 371.1659, y: 160} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &2503187454698265825 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5196197715904290498} + m_CullTransparentMesh: 1 +--- !u!114 &6829657461328831593 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5196197715904290498} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_RaycastTarget: 1 + m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} + m_Maskable: 1 + m_OnCullStateChanged: + m_PersistentCalls: + m_Calls: [] + m_text: "\u53C2\u6218\u9632\u5FA1\u5854\uFF1A" + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 99d811b0183246646a2ce8df996f4bca, type: 2} + m_sharedMaterial: {fileID: -1106088975554028259, guid: 99d811b0183246646a2ce8df996f4bca, + type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 60 + m_fontSizeBase: 60 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 2 + m_VerticalAlignment: 512 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &5244343103794872216 GameObject: m_ObjectHideFlags: 0 @@ -636,6 +968,7 @@ RectTransform: - {fileID: 3177067923545511236} - {fileID: 437137211665287909} - {fileID: 4661661401541872014} + - {fileID: 6194629833245286025} m_Father: {fileID: 3043356307630469178} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} diff --git a/Assets/GameMain/UI/UIItems/RepoItem.prefab b/Assets/GameMain/UI/UIItems/RepoItem.prefab index cd133a4..0fa7b69 100644 --- a/Assets/GameMain/UI/UIItems/RepoItem.prefab +++ b/Assets/GameMain/UI/UIItems/RepoItem.prefab @@ -184,7 +184,7 @@ RectTransform: m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 100, y: 100} + m_SizeDelta: {x: 160, y: 160} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &617747730667399833 CanvasRenderer: @@ -211,6 +211,7 @@ MonoBehaviour: _context: InstanceId: 0 CanDrag: 0 + EnduranceRate01: 0 ComponentSlotType: 0 IconAreaContext: Rarity: 0