From 64bfb6267f266e48822649eb457ee26a14ab55eb Mon Sep 17 00:00:00 2001 From: kittyegg Date: Fri, 5 Jun 2026 01:51:16 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=B8=D0=BB=20?= =?UTF-8?q?=D1=86=D0=B5=D0=BD=D1=83=20=D1=82=D1=83=D1=80=D1=80=D0=B5=D0=BB?= =?UTF-8?q?=D0=B8=20=D0=BD=D0=B0=20=D0=BA=D0=BD=D0=BE=D0=BF=D0=BA=D1=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Prefabs/TurretButton.prefab | 312 ++++++++++++++++++++++++- Assets/Scenes/Island.unity | 4 +- Assets/Scripts/ComponentHelper.cs | 13 -- Assets/Scripts/ComponentHelper.cs.meta | 2 - Assets/Scripts/UI/TurretButton.cs | 45 ++++ Assets/Scripts/UI/TurretButton.cs.meta | 2 + Assets/Scripts/UI/TurretsShopViewer.cs | 23 +- 7 files changed, 367 insertions(+), 34 deletions(-) delete mode 100644 Assets/Scripts/ComponentHelper.cs delete mode 100644 Assets/Scripts/ComponentHelper.cs.meta create mode 100644 Assets/Scripts/UI/TurretButton.cs create mode 100644 Assets/Scripts/UI/TurretButton.cs.meta diff --git a/Assets/Prefabs/TurretButton.prefab b/Assets/Prefabs/TurretButton.prefab index bd2bf93..1a2111f 100644 --- a/Assets/Prefabs/TurretButton.prefab +++ b/Assets/Prefabs/TurretButton.prefab @@ -1,5 +1,82 @@ %YAML 1.1 %TAG !u! tag:unity3d.com,2011: +--- !u!1 &2923076406123619186 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6703994042700269976} + - component: {fileID: 3284988505681211415} + - component: {fileID: 4303360228368016757} + m_Layer: 0 + m_Name: PricePanel + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6703994042700269976 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2923076406123619186} + 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: 815499889582166291} + - {fileID: 4827303025434984465} + m_Father: {fileID: 4616868106249531007} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0} + m_AnchorMax: {x: 0.5, y: 0} + m_AnchoredPosition: {x: 0, y: 26.838} + m_SizeDelta: {x: 49.3259, y: 15.086502} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &3284988505681211415 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2923076406123619186} + m_CullTransparentMesh: 1 +--- !u!114 &4303360228368016757 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 2923076406123619186} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0.84705883} + 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: 10907, guid: 0000000000000000f000000000000000, type: 0} + m_Type: 1 + 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 &5374699834306416741 GameObject: m_ObjectHideFlags: 0 @@ -12,6 +89,7 @@ GameObject: - component: {fileID: 3104993817453913618} - component: {fileID: 6671647633012711255} - component: {fileID: 3635012363401127766} + - component: {fileID: -1733514171764333722} m_Layer: 0 m_Name: TurretButton m_TagString: Untagged @@ -32,12 +110,13 @@ RectTransform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 5955449702013521600} + - {fileID: 6703994042700269976} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} m_AnchorMax: {x: 0, y: 0} m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} + m_SizeDelta: {x: 100, y: 100} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &3104993817453913618 CanvasRenderer: @@ -121,6 +200,233 @@ MonoBehaviour: m_OnClick: m_PersistentCalls: m_Calls: [] +--- !u!114 &-1733514171764333722 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5374699834306416741} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f08ae7c4b7050dc42b23b31679979436, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::TurretButton + _button: {fileID: 3635012363401127766} + _icon: {fileID: 2512048747312714579} + _priceText: {fileID: 7166314185799986044} +--- !u!1 &6391222849013290357 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 4827303025434984465} + - component: {fileID: 5744903312660315167} + - component: {fileID: 3958030948990711529} + m_Layer: 0 + m_Name: Coin + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &4827303025434984465 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6391222849013290357} + 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: 6703994042700269976} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0.5} + m_AnchorMax: {x: 0, y: 0.5} + m_AnchoredPosition: {x: 7.462, y: -0.00000047684} + m_SizeDelta: {x: 11.3154, y: 11.3154} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &5744903312660315167 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6391222849013290357} + m_CullTransparentMesh: 1 +--- !u!114 &3958030948990711529 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6391222849013290357} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Image + 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_Sprite: {fileID: 21300000, guid: dd4f6cfdf80256a46ad9ef574dad72c6, type: 3} + 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 &6852050531891842294 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 815499889582166291} + - component: {fileID: 6189593844976643000} + - component: {fileID: 7166314185799986044} + m_Layer: 0 + m_Name: PriceText + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &815499889582166291 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6852050531891842294} + 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: 6703994042700269976} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0.5} + m_AnchorMax: {x: 1, y: 0.5} + m_AnchoredPosition: {x: -18.7, y: 0} + m_SizeDelta: {x: 35.0338, y: 12.1463} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &6189593844976643000 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6852050531891842294} + m_CullTransparentMesh: 1 +--- !u!114 &7166314185799986044 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 6852050531891842294} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.TextMeshPro::TMPro.TextMeshProUGUI + 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: 00000 + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: 41d169c64b9147349a84113d65d9e0cd, type: 2} + m_sharedMaterial: {fileID: 6511282304109922210, guid: 41d169c64b9147349a84113d65d9e0cd, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4279159491 + m_fontColor: {r: 0.766458, g: 0.7924528, b: 0.056069765, 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: 7.4 + m_fontSizeBase: 7.4 + 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_characterHorizontalScale: 1 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_TextWrappingMode: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 0 + m_ActiveFontFeatures: 6e72656b + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_EmojiFallbackSupport: 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 &8443624415891055671 GameObject: m_ObjectHideFlags: 0 @@ -155,8 +461,8 @@ RectTransform: 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: 0.00001812, y: 0} - m_SizeDelta: {x: 69.6812, y: 77.0561} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 59.9627, y: 61.4113} m_Pivot: {x: 0.5, y: 0.5} --- !u!222 &5022439593427316590 CanvasRenderer: diff --git a/Assets/Scenes/Island.unity b/Assets/Scenes/Island.unity index d4926d3..4d5d319 100644 --- a/Assets/Scenes/Island.unity +++ b/Assets/Scenes/Island.unity @@ -13812,7 +13812,7 @@ MonoBehaviour: m_ChildAlignment: 4 m_StartCorner: 0 m_StartAxis: 0 - m_CellSize: {x: 90, y: 90} + m_CellSize: {x: 70, y: 90} m_Spacing: {x: 10, y: 0} m_Constraint: 2 m_ConstraintCount: 1 @@ -13830,7 +13830,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::TurretsShopViewer _shop: {fileID: 1311268619} _wallet: {fileID: 1030979928} - _buttonPrefab: {fileID: 3635012363401127766, guid: f87d5d34136775b41907fc1187ef4bc2, type: 3} + _buttonPrefab: {fileID: -1733514171764333722, guid: f87d5d34136775b41907fc1187ef4bc2, type: 3} _ignoreBlocks: - {fileID: 1987853413} - {fileID: 1569763699} diff --git a/Assets/Scripts/ComponentHelper.cs b/Assets/Scripts/ComponentHelper.cs deleted file mode 100644 index 562730c..0000000 --- a/Assets/Scripts/ComponentHelper.cs +++ /dev/null @@ -1,13 +0,0 @@ -using UnityEngine; - -public static class ComponentHelper -{ - public static T GetComponentInChildrenWithoutParent(this Component obj) where T : Component - { - foreach (var comp in obj.GetComponentsInChildren()) - if (comp.gameObject != obj.gameObject) - return comp; - - return null; - } -} \ No newline at end of file diff --git a/Assets/Scripts/ComponentHelper.cs.meta b/Assets/Scripts/ComponentHelper.cs.meta deleted file mode 100644 index 7eb6a7d..0000000 --- a/Assets/Scripts/ComponentHelper.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 9575f79ebc216754fb44b8066ae811b2 \ No newline at end of file diff --git a/Assets/Scripts/UI/TurretButton.cs b/Assets/Scripts/UI/TurretButton.cs new file mode 100644 index 0000000..7e82cb7 --- /dev/null +++ b/Assets/Scripts/UI/TurretButton.cs @@ -0,0 +1,45 @@ +using UnityEngine; +using TMPro; +using UnityEngine.UI; +using UnityEngine.Events; + +public class TurretButton : MonoBehaviour +{ + [SerializeField] private Button _button; + [SerializeField] private Image _icon; + [SerializeField] private TextMeshProUGUI _priceText; + + public Sprite Icon + { + get + { + if (_icon.isActiveAndEnabled) + return _icon.sprite; + return null; + } + set + { + bool isActive = value != null; + _icon.gameObject.SetActive(isActive); + if (isActive) + _icon.sprite = value; + } + } + public string PriceText + { + get => _priceText.text; + set => _priceText.text = value; + } + public bool Interactable + { + get => _button.interactable; + set => _button.interactable = value; + } + public TurretShopItem TurretItem { get; set; } + + public event UnityAction OnClick + { + add => _button.onClick.AddListener(value); + remove => _button.onClick.RemoveListener(value); + } +} \ No newline at end of file diff --git a/Assets/Scripts/UI/TurretButton.cs.meta b/Assets/Scripts/UI/TurretButton.cs.meta new file mode 100644 index 0000000..97c4237 --- /dev/null +++ b/Assets/Scripts/UI/TurretButton.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f08ae7c4b7050dc42b23b31679979436 \ No newline at end of file diff --git a/Assets/Scripts/UI/TurretsShopViewer.cs b/Assets/Scripts/UI/TurretsShopViewer.cs index 55ed885..89cbbd8 100644 --- a/Assets/Scripts/UI/TurretsShopViewer.cs +++ b/Assets/Scripts/UI/TurretsShopViewer.cs @@ -7,12 +7,12 @@ public class TurretsShopViewer : MonoBehaviour { [SerializeField] private TurretsShop _shop; [SerializeField] private Wallet _wallet; - [SerializeField] private Button _buttonPrefab; + [SerializeField] private TurretButton _buttonPrefab; [SerializeField] private List _ignoreBlocks; private Animator _animator; private bool _hidden = true; - private readonly Dictionary _buttons = new(); + private readonly List _buttons = new(); private static readonly int _hideAnimation = Animator.StringToHash("HideTurretShopPanelAnimation"); private static readonly int _showAnimation = Animator.StringToHash("ShowTurretShopPanelAnimation"); @@ -22,15 +22,12 @@ public class TurretsShopViewer : MonoBehaviour foreach (var item in _shop.TurretShopItems) { var button = Instantiate(_buttonPrefab, transform); - var icon = button.GetComponentInChildrenWithoutParent(); - if (icon != null && item.Icon != null) - { - icon.gameObject.SetActive(true); - icon.sprite = item.Icon; - } + button.TurretItem = item; + button.Icon = item.Icon; + button.PriceText = item.Price.ToString(); + button.OnClick += () => _shop.BuyTurret(item); - button.onClick.AddListener(() => _shop.BuyTurret(item)); - _buttons.Add(button, item); + _buttons.Add(button); } } @@ -77,9 +74,7 @@ public class TurretsShopViewer : MonoBehaviour private void OnMoneyChanged(int money) { - foreach (var (button, item) in _buttons) - { - button.interactable = money >= item.Price; - } + foreach (var button in _buttons) + button.Interactable = money >= button.TurretItem.Price; } }