From 646ef895c3abc52ac1a4816e82f40fe7e5b8da1d Mon Sep 17 00:00:00 2001 From: Pasha Bibko <156938226+PashaBibko@users.noreply.github.com> Date: Thu, 16 Apr 2026 13:22:52 +0100 Subject: [PATCH] Added spring --- Assets/Art/Slicer-v1.png | Bin 0 -> 2640 bytes Assets/Art/Slicer-v1.png.meta | 130 ++++++ Assets/Art/Spring-v1.png.meta | 27 +- Assets/Prefabs/Buildings/Registry.asset | 3 + .../Prefabs/Buildings/SpringBuilding.prefab | 376 ++++++++++++++++++ .../Buildings/SpringBuilding.prefab.meta | 7 + Assets/Scenes/GameScene.unity | 27 +- Assets/Scripts/Game/Buildings/FanBuilding.cs | 4 +- .../Scripts/Game/Buildings/SlicerBuilding.cs | 7 + .../Game/Buildings/SlicerBuilding.cs.meta | 3 + .../Scripts/Game/Buildings/SpringBuilding.cs | 35 ++ .../Game/Buildings/SpringBuilding.cs.meta | 2 + Assets/Scripts/Game/FruitSpawner.cs | 14 +- Assets/Scripts/Game/TriggerDetector.cs | 32 +- Assets/Scripts/Game/UpgradeManager.cs | 8 +- 15 files changed, 639 insertions(+), 36 deletions(-) create mode 100644 Assets/Art/Slicer-v1.png create mode 100644 Assets/Art/Slicer-v1.png.meta create mode 100644 Assets/Prefabs/Buildings/SpringBuilding.prefab create mode 100644 Assets/Prefabs/Buildings/SpringBuilding.prefab.meta create mode 100644 Assets/Scripts/Game/Buildings/SlicerBuilding.cs create mode 100644 Assets/Scripts/Game/Buildings/SlicerBuilding.cs.meta create mode 100644 Assets/Scripts/Game/Buildings/SpringBuilding.cs create mode 100644 Assets/Scripts/Game/Buildings/SpringBuilding.cs.meta diff --git a/Assets/Art/Slicer-v1.png b/Assets/Art/Slicer-v1.png new file mode 100644 index 0000000000000000000000000000000000000000..ed47e2ed285c3eac180f8aeaa7e5e9091a9ce936 GIT binary patch literal 2640 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 z?BXTC<^%P%D81esYk__BackingField: {x: 2, y: 1} + Trigger: {fileID: 3249246627232626294} +--- !u!222 &512124502862012575 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8624048914473773482} + m_CullTransparentMesh: 1 +--- !u!114 &2938597077917375806 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8624048914473773482} + 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: 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: 34a495bcd8d7c4547a605723ef7c4638, 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!114 &2693608777607402836 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8624048914473773482} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 4e29b1a8efbd4b44bb3f3716e73f07ff, type: 3} + m_Name: + m_EditorClassIdentifier: UnityEngine.UI::UnityEngine.UI.Button + m_Navigation: + m_Mode: 3 + m_WrapAround: 0 + m_SelectOnUp: {fileID: 0} + m_SelectOnDown: {fileID: 0} + m_SelectOnLeft: {fileID: 0} + m_SelectOnRight: {fileID: 0} + m_Transition: 1 + m_Colors: + m_NormalColor: {r: 1, g: 1, b: 1, a: 1} + m_HighlightedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_PressedColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 1} + m_SelectedColor: {r: 0.9607843, g: 0.9607843, b: 0.9607843, a: 1} + m_DisabledColor: {r: 0.78431374, g: 0.78431374, b: 0.78431374, a: 0.5019608} + m_ColorMultiplier: 1 + m_FadeDuration: 0.1 + m_SpriteState: + m_HighlightedSprite: {fileID: 0} + m_PressedSprite: {fileID: 0} + m_SelectedSprite: {fileID: 0} + m_DisabledSprite: {fileID: 0} + m_AnimationTriggers: + m_NormalTrigger: Normal + m_HighlightedTrigger: Highlighted + m_PressedTrigger: Pressed + m_SelectedTrigger: Selected + m_DisabledTrigger: Disabled + m_Interactable: 1 + m_TargetGraphic: {fileID: 2938597077917375806} + m_OnClick: + m_PersistentCalls: + m_Calls: + - m_Target: {fileID: 677812672833671564} + m_TargetAssemblyTypeName: Fruitomation.Game.SpringBuilding, Fruitomation + m_MethodName: OnBuildingClicked + m_Mode: 1 + m_Arguments: + m_ObjectArgument: {fileID: 0} + m_ObjectArgumentAssemblyTypeName: UnityEngine.Object, UnityEngine + m_IntArgument: 0 + m_FloatArgument: 0 + m_StringArgument: + m_BoolArgument: 0 + m_CallState: 2 diff --git a/Assets/Prefabs/Buildings/SpringBuilding.prefab.meta b/Assets/Prefabs/Buildings/SpringBuilding.prefab.meta new file mode 100644 index 0000000..fe3d76c --- /dev/null +++ b/Assets/Prefabs/Buildings/SpringBuilding.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 6060f6928011bf54dad9c5ef16fb1048 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scenes/GameScene.unity b/Assets/Scenes/GameScene.unity index edb381e..25c81d1 100644 --- a/Assets/Scenes/GameScene.unity +++ b/Assets/Scenes/GameScene.unity @@ -2192,20 +2192,27 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 1fc36d0808cf971459d9e430faaeadd9, type: 3} m_Name: m_EditorClassIdentifier: - MaxSpawned: 1000 + MaxSpawned: 30 MinSpawnTime: 0 MaxSpawnTime: 0.2 FruitSpawnParent: {fileID: 1944344878} - FruitPrefabs: - - {fileID: 4062657912758122058, guid: 23e3bfe33d8c6004c85fd638db567ab6, type: 3} - - {fileID: 4062657912758122058, guid: 5e1f7f5d4294c1d4fa3e6f88dec0dfa6, type: 3} - - {fileID: 4062657912758122058, guid: ebddb1b81a288cc4c993a25bc9efe894, type: 3} - - {fileID: 4062657912758122058, guid: 13f2740b5ae396e40940587ab2effd65, type: 3} - - {fileID: 8799415981405337049, guid: c21e0b5539573904cb10d979de4a3f72, type: 3} - - {fileID: 4062657912758122058, guid: b224b6df33529e64d83245d78e0feb9f, type: 3} - - {fileID: 4062657912758122058, guid: 7af455f1c1666e5409156598fe669f74, type: 3} - - {fileID: 4062657912758122058, guid: 2cf42dbc57bb6374b9e6ec700aad5854, type: 3} GameCanvas: {fileID: 1165634413} + ApplePrefab: {fileID: 4062657912758122058, guid: 23e3bfe33d8c6004c85fd638db567ab6, + type: 3} + GrapePrefab: {fileID: 8799415981405337049, guid: c21e0b5539573904cb10d979de4a3f72, + type: 3} + BananaPrefab: {fileID: 4062657912758122058, guid: 5e1f7f5d4294c1d4fa3e6f88dec0dfa6, + type: 3} + MangoPrefab: {fileID: 4062657912758122058, guid: 7af455f1c1666e5409156598fe669f74, + type: 3} + DurianPrefab: {fileID: 4062657912758122058, guid: 13f2740b5ae396e40940587ab2effd65, + type: 3} + PitayaPrefab: {fileID: 4062657912758122058, guid: 2cf42dbc57bb6374b9e6ec700aad5854, + type: 3} + KiwiPrefab: {fileID: 4062657912758122058, guid: b224b6df33529e64d83245d78e0feb9f, + type: 3} + BuddhasHandPrefab: {fileID: 4062657912758122058, guid: ebddb1b81a288cc4c993a25bc9efe894, + type: 3} ActiveFruits: [] --- !u!1 &1944344877 GameObject: diff --git a/Assets/Scripts/Game/Buildings/FanBuilding.cs b/Assets/Scripts/Game/Buildings/FanBuilding.cs index be9c48d..7f44e31 100644 --- a/Assets/Scripts/Game/Buildings/FanBuilding.cs +++ b/Assets/Scripts/Game/Buildings/FanBuilding.cs @@ -12,14 +12,14 @@ namespace Fruitomation.Game private void Start() { - TriggerDetector.SetAction((other) => + TriggerDetector.SetAction(other => { if (other.transform.parent.TryGetComponent(out Rigidbody2D body)) { Vector3 force = new(-transform.localScale.x, 0f, 0f); body?.AddForce(force * Mathf.PI, ForceMode2D.Impulse); } - }); + }, TriggerType.Stay); } private void Update() diff --git a/Assets/Scripts/Game/Buildings/SlicerBuilding.cs b/Assets/Scripts/Game/Buildings/SlicerBuilding.cs new file mode 100644 index 0000000..200aeca --- /dev/null +++ b/Assets/Scripts/Game/Buildings/SlicerBuilding.cs @@ -0,0 +1,7 @@ +namespace Fruitomation.Game +{ + public class SlicerBuilding : Building + { + + } +} \ No newline at end of file diff --git a/Assets/Scripts/Game/Buildings/SlicerBuilding.cs.meta b/Assets/Scripts/Game/Buildings/SlicerBuilding.cs.meta new file mode 100644 index 0000000..ddda5a1 --- /dev/null +++ b/Assets/Scripts/Game/Buildings/SlicerBuilding.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: f2a0d2e92ab8436a8854e59ee269188a +timeCreated: 1776341863 \ No newline at end of file diff --git a/Assets/Scripts/Game/Buildings/SpringBuilding.cs b/Assets/Scripts/Game/Buildings/SpringBuilding.cs new file mode 100644 index 0000000..4561c8c --- /dev/null +++ b/Assets/Scripts/Game/Buildings/SpringBuilding.cs @@ -0,0 +1,35 @@ +using UnityEngine; +using System; + +namespace Fruitomation.Game +{ + public class SpringBuilding : Building + { + [SerializeField] private TriggerDetector Trigger; + + private void Start() + { + Trigger.SetAction(other => + { + if (other.transform.parent.TryGetComponent(out Rigidbody2D body)) + { + Vector2 v0 = body.linearVelocity; + float magnitude = Math.Max(v0.magnitude * 0.8f, 20f); + + Vector2 v1 = new Vector2(v0.x * 1.2f, Math.Abs(v0.y)).normalized * magnitude; + body.linearVelocity = v1; + } + }, TriggerType.Enter); + + Trigger.SetAction(other => + { + if (other.transform.parent.TryGetComponent(out Rigidbody2D body)) + { + Vector2 v0 = body.linearVelocity; + v0.y = Math.Max(1f, v0.y); + body.linearVelocity = v0; + } + }, TriggerType.Stay); + } + } +} diff --git a/Assets/Scripts/Game/Buildings/SpringBuilding.cs.meta b/Assets/Scripts/Game/Buildings/SpringBuilding.cs.meta new file mode 100644 index 0000000..6f27cb8 --- /dev/null +++ b/Assets/Scripts/Game/Buildings/SpringBuilding.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: d85c1768ca4c6594dbdb161463af59dc \ No newline at end of file diff --git a/Assets/Scripts/Game/FruitSpawner.cs b/Assets/Scripts/Game/FruitSpawner.cs index 154871e..6e95e6e 100644 --- a/Assets/Scripts/Game/FruitSpawner.cs +++ b/Assets/Scripts/Game/FruitSpawner.cs @@ -49,25 +49,25 @@ namespace Fruitomation.Game { List unlocked = new() { ApplePrefab }; - if (UpgradeManager.Unlocked(BasicUpgrade.Grapes)) + if (UpgradeManager.Is(BasicUpgrade.Grapes)) unlocked.Add(GrapePrefab); - if (UpgradeManager.Unlocked(BasicUpgrade.Bananas)) + if (UpgradeManager.Is(BasicUpgrade.Bananas)) unlocked.Add(BananaPrefab); - if (UpgradeManager.Unlocked(BasicUpgrade.Kiwi)) + if (UpgradeManager.Is(BasicUpgrade.Kiwi)) unlocked.Add(KiwiPrefab); - if (UpgradeManager.Unlocked(BasicUpgrade.Mangoes)) + if (UpgradeManager.Is(BasicUpgrade.Mangoes)) unlocked.Add(MangoPrefab); - if (UpgradeManager.Unlocked(BasicUpgrade.Durian)) + if (UpgradeManager.Is(BasicUpgrade.Durian)) unlocked.Add(DurianPrefab); - if (UpgradeManager.Unlocked(BasicUpgrade.BuddhasHand)) + if (UpgradeManager.Is(BasicUpgrade.BuddhasHand)) unlocked.Add(BuddhasHandPrefab); - if (UpgradeManager.Unlocked(BasicUpgrade.Pitayas)) + if (UpgradeManager.Is(BasicUpgrade.Pitayas)) unlocked.Add(PitayaPrefab); GameObject prefab = unlocked[Random.Range(0, unlocked.Count)]; diff --git a/Assets/Scripts/Game/TriggerDetector.cs b/Assets/Scripts/Game/TriggerDetector.cs index 4611e04..0b99511 100644 --- a/Assets/Scripts/Game/TriggerDetector.cs +++ b/Assets/Scripts/Game/TriggerDetector.cs @@ -3,11 +3,37 @@ using System; namespace Fruitomation.Game { + public enum TriggerType + { + Enter, + Stay + } + public class TriggerDetector : MonoBehaviour { - private Action RegisteredAction; + private Action RegisteredActionStay; + private Action RegisteredActionEnter; - public void SetAction(Action action) => RegisteredAction = action; - private void OnTriggerStay2D(Collider2D other) => RegisteredAction?.Invoke(other); + private TriggerType Type; + + public void SetAction(Action action, TriggerType type) + { + switch (type) + { + case TriggerType.Stay: + RegisteredActionStay = action; + return; + + case TriggerType.Enter: + RegisteredActionEnter = action; + return; + + default: + throw new ArgumentOutOfRangeException(nameof(type), type, null); + } + } + + private void OnTriggerEnter2D(Collider2D other) => RegisteredActionEnter?.Invoke(other); + private void OnTriggerStay2D(Collider2D other) => RegisteredActionStay?.Invoke(other); } } diff --git a/Assets/Scripts/Game/UpgradeManager.cs b/Assets/Scripts/Game/UpgradeManager.cs index b1f6c44..1862e96 100644 --- a/Assets/Scripts/Game/UpgradeManager.cs +++ b/Assets/Scripts/Game/UpgradeManager.cs @@ -49,7 +49,11 @@ namespace Fruitomation.Game PitayaIceCream, SpicedPitayaIceCream, } - + + [Serializable] public enum IncrementalUpgrade + { + } + public class UnlockedUpgrades { [Serializable] public class Serialized @@ -130,7 +134,7 @@ namespace Fruitomation.Game public static void Unlock(BasicUpgrade upgrade) => CurrentUpgrades.Unlock(upgrade); - public static bool Unlocked(BasicUpgrade upgrade) => CurrentUpgrades.IsUnlocked(upgrade); + public static bool Is(BasicUpgrade upgrade) => CurrentUpgrades.IsUnlocked(upgrade); #if UNITY_EDITOR [MenuItem("Fruitomation/Reset Upgrades")]