From cb1db7c8b2e3660eeb0bcb572d0e708409e5ad56 Mon Sep 17 00:00:00 2001 From: Miguel Astor Date: Fri, 28 Aug 2026 14:04:01 -0400 Subject: [PATCH] TO SQUASH: Shark sparks. --- Assets/Animations/Shark/Sparks.controller | 73 ++++++++++ .../Animations/Shark/Sparks.controller.meta | 8 ++ Assets/Animations/Shark/SparksAnimation.anim | 101 ++++++++++++++ .../Shark/SparksAnimation.anim.meta | 8 ++ Assets/Prefabs/Shark Spark.prefab | 130 ++++++++++++++++++ Assets/Prefabs/Shark Spark.prefab.meta | 7 + Assets/Prefabs/Shark.prefab | 5 +- Assets/Scripts/Game/LevelEnder.cs | 1 + Assets/Scripts/Game/Shark.meta | 8 ++ Assets/Scripts/Game/{ => Shark}/Shark.cs | 31 +++++ Assets/Scripts/Game/{ => Shark}/Shark.cs.meta | 0 Assets/Scripts/Game/Shark/SharkSpark.cs | 9 ++ Assets/Scripts/Game/Shark/SharkSpark.cs.meta | 2 + Assets/Sprites/Shark/180.png | Bin 271 -> 455 bytes Assets/Sprites/Shark/180.png.meta | 129 ++++++++++++++++- 15 files changed, 504 insertions(+), 8 deletions(-) create mode 100644 Assets/Animations/Shark/Sparks.controller create mode 100644 Assets/Animations/Shark/Sparks.controller.meta create mode 100644 Assets/Animations/Shark/SparksAnimation.anim create mode 100644 Assets/Animations/Shark/SparksAnimation.anim.meta create mode 100644 Assets/Prefabs/Shark Spark.prefab create mode 100644 Assets/Prefabs/Shark Spark.prefab.meta create mode 100644 Assets/Scripts/Game/Shark.meta rename Assets/Scripts/Game/{ => Shark}/Shark.cs (92%) rename Assets/Scripts/Game/{ => Shark}/Shark.cs.meta (100%) create mode 100644 Assets/Scripts/Game/Shark/SharkSpark.cs create mode 100644 Assets/Scripts/Game/Shark/SharkSpark.cs.meta diff --git a/Assets/Animations/Shark/Sparks.controller b/Assets/Animations/Shark/Sparks.controller new file mode 100644 index 0000000..5723793 --- /dev/null +++ b/Assets/Animations/Shark/Sparks.controller @@ -0,0 +1,73 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1102 &-6451065305117323607 +AnimatorState: + serializedVersion: 6 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SparksAnimation + m_Speed: 1 + m_CycleOffset: 0 + m_Transitions: [] + m_StateMachineBehaviours: [] + m_Position: {x: 50, y: 50, z: 0} + m_IKOnFeet: 0 + m_WriteDefaultValues: 1 + m_Mirror: 0 + m_SpeedParameterActive: 0 + m_MirrorParameterActive: 0 + m_CycleOffsetParameterActive: 0 + m_TimeParameterActive: 0 + m_Motion: {fileID: 7400000, guid: 04fd10121fb134b65914c672353e26b3, type: 2} + m_Tag: + m_SpeedParameter: + m_MirrorParameter: + m_CycleOffsetParameter: + m_TimeParameter: +--- !u!91 &9100000 +AnimatorController: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Sparks + serializedVersion: 6 + m_AnimatorParameters: [] + m_AnimatorLayers: + - serializedVersion: 5 + m_Name: Base Layer + m_StateMachine: {fileID: 3613742741305298000} + m_Mask: {fileID: 0} + m_Motions: [] + m_Behaviours: [] + m_BlendingMode: 0 + m_SyncedLayerIndex: -1 + m_DefaultWeight: 0 + m_IKPass: 0 + m_SyncedLayerAffectsTiming: 0 + m_Controller: {fileID: 9100000} + m_EvaluateTransitionsOnStart: 1 +--- !u!1107 &3613742741305298000 +AnimatorStateMachine: + serializedVersion: 7 + m_ObjectHideFlags: 1 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: Base Layer + m_ChildStates: + - serializedVersion: 1 + m_State: {fileID: -6451065305117323607} + m_Position: {x: 400, y: 120, z: 0} + m_ChildStateMachines: [] + m_AnyStateTransitions: [] + m_EntryTransitions: [] + m_StateMachineTransitions: {} + m_StateMachineBehaviours: [] + m_AnyStatePosition: {x: 50, y: 20, z: 0} + m_EntryPosition: {x: 50, y: 120, z: 0} + m_ExitPosition: {x: 800, y: 120, z: 0} + m_ParentStateMachinePosition: {x: 800, y: 20, z: 0} + m_DefaultState: {fileID: -6451065305117323607} diff --git a/Assets/Animations/Shark/Sparks.controller.meta b/Assets/Animations/Shark/Sparks.controller.meta new file mode 100644 index 0000000..45a2908 --- /dev/null +++ b/Assets/Animations/Shark/Sparks.controller.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: aa3473b43d498dcf4a26c86ac694c191 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 9100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Animations/Shark/SparksAnimation.anim b/Assets/Animations/Shark/SparksAnimation.anim new file mode 100644 index 0000000..c653033 --- /dev/null +++ b/Assets/Animations/Shark/SparksAnimation.anim @@ -0,0 +1,101 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!74 &7400000 +AnimationClip: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: SparksAnimation + serializedVersion: 8 + m_Legacy: 0 + m_Compressed: 0 + m_UseHighQualityCurve: 1 + m_RotationCurves: [] + m_CompressedRotationCurves: [] + m_EulerCurves: [] + m_PositionCurves: [] + m_ScaleCurves: [] + m_FloatCurves: [] + m_PPtrCurves: + - serializedVersion: 2 + curve: + - time: 0 + value: {fileID: 804881131990760745, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - time: 0.13333334 + value: {fileID: -931251876, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - time: 0.26666668 + value: {fileID: -1750226195, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - time: 0.4 + value: {fileID: -916251104, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - time: 0.53333336 + value: {fileID: 9122294262205109509, guid: b634b1f944e581cbeb43efe97e96ec62, type: 3} + - time: 0.68333334 + value: {fileID: -2073985705, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - time: 0.8333333 + value: {fileID: -633247957, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - time: 0.98333335 + value: {fileID: 9122294262205109509, guid: b634b1f944e581cbeb43efe97e96ec62, type: 3} + attribute: m_Sprite + path: + classID: 212 + script: {fileID: 0} + flags: 2 + m_SampleRate: 60 + m_WrapMode: 0 + m_Bounds: + m_Center: {x: 0, y: 0, z: 0} + m_Extent: {x: 0, y: 0, z: 0} + m_ClipBindingConstant: + genericBindings: + - serializedVersion: 2 + path: 0 + attribute: 0 + script: {fileID: 0} + typeID: 212 + customType: 23 + isPPtrCurve: 1 + isIntCurve: 0 + isSerializeReferenceCurve: 0 + metaData: 0 + pptrCurveMapping: + - {fileID: 804881131990760745, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - {fileID: -931251876, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - {fileID: -1750226195, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - {fileID: -916251104, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - {fileID: 9122294262205109509, guid: b634b1f944e581cbeb43efe97e96ec62, type: 3} + - {fileID: -2073985705, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - {fileID: -633247957, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + - {fileID: 9122294262205109509, guid: b634b1f944e581cbeb43efe97e96ec62, type: 3} + m_AnimationClipSettings: + serializedVersion: 2 + m_AdditiveReferencePoseClip: {fileID: 0} + m_AdditiveReferencePoseTime: 0 + m_StartTime: 0 + m_StopTime: 1 + m_OrientationOffsetY: 0 + m_Level: 0 + m_CycleOffset: 0 + m_HasAdditiveReferencePose: 0 + m_LoopTime: 0 + m_LoopBlend: 0 + m_LoopBlendOrientation: 0 + m_LoopBlendPositionY: 0 + m_LoopBlendPositionXZ: 0 + m_KeepOriginalOrientation: 0 + m_KeepOriginalPositionY: 1 + m_KeepOriginalPositionXZ: 0 + m_HeightFromFeet: 0 + m_Mirror: 0 + m_EditorCurves: [] + m_EulerEditorCurves: [] + m_HasGenericRootTransform: 0 + m_HasMotionFloatCurves: 0 + m_Events: + - time: 0.98333335 + functionName: DestroySpark + data: + objectReferenceParameter: {fileID: 0} + floatParameter: 0 + intParameter: 0 + messageOptions: 0 diff --git a/Assets/Animations/Shark/SparksAnimation.anim.meta b/Assets/Animations/Shark/SparksAnimation.anim.meta new file mode 100644 index 0000000..2759593 --- /dev/null +++ b/Assets/Animations/Shark/SparksAnimation.anim.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 04fd10121fb134b65914c672353e26b3 +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 7400000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Shark Spark.prefab b/Assets/Prefabs/Shark Spark.prefab new file mode 100644 index 0000000..9a64436 --- /dev/null +++ b/Assets/Prefabs/Shark Spark.prefab @@ -0,0 +1,130 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!1 &7445253572437675077 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 8157769840265605414} + - component: {fileID: 4691363455512708982} + - component: {fileID: 3936362052919834525} + - component: {fileID: 8542768741526144376} + m_Layer: 0 + m_Name: Shark Spark + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &8157769840265605414 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7445253572437675077} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -4.802, y: -1.499, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &4691363455512708982 +SpriteRenderer: + serializedVersion: 3 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7445253572437675077} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 10754, guid: 0000000000000000f000000000000000, type: 0} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: -480107125 + m_SortingLayer: 2 + m_SortingOrder: 5 + m_MaskInteraction: 0 + m_Sprite: {fileID: 804881131990760745, guid: 0cc6299f172e703acbb957c74b1d388d, type: 3} + m_Color: {r: 1, g: 1, b: 1, a: 1} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 0.03, y: 0.03} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_SpriteSortPoint: 0 + m_BlendShapeWeights: [] +--- !u!95 &3936362052919834525 +Animator: + serializedVersion: 7 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7445253572437675077} + m_Enabled: 1 + m_Avatar: {fileID: 0} + m_Controller: {fileID: 9100000, guid: aa3473b43d498dcf4a26c86ac694c191, type: 2} + m_CullingMode: 0 + m_UpdateMode: 0 + m_ApplyRootMotion: 0 + m_LinearVelocityBlending: 0 + m_StabilizeFeet: 0 + m_AnimatePhysics: 0 + m_WarningMessage: + m_HasTransformHierarchy: 1 + m_AllowConstantClipSamplingOptimization: 1 + m_KeepAnimatorStateOnDisable: 0 + m_WriteDefaultValuesOnDisable: 0 +--- !u!114 &8542768741526144376 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7445253572437675077} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: bc6262e498fa2d2eba7d1e3d1b58f1cb, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::SharkSpark diff --git a/Assets/Prefabs/Shark Spark.prefab.meta b/Assets/Prefabs/Shark Spark.prefab.meta new file mode 100644 index 0000000..7d4bfc7 --- /dev/null +++ b/Assets/Prefabs/Shark Spark.prefab.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 3fea7e0b996bbe3e1bc57731c745dd59 +PrefabImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Prefabs/Shark.prefab b/Assets/Prefabs/Shark.prefab index 6307b5c..1e5705f 100644 --- a/Assets/Prefabs/Shark.prefab +++ b/Assets/Prefabs/Shark.prefab @@ -301,15 +301,16 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: 3825f704ee14d8c98932133fbd46c2fd, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Shark + canvas: {fileID: 0} + notificationPrefab: {fileID: 6394082776706812922, guid: 5cb297a990ab535aa8ef2b8054c9db1b, type: 3} spawnSound: {fileID: 8300000, guid: d4361e7549f260e4b801816c2ad35ccc, type: 3} angrySound: {fileID: 8300000, guid: cc18c0832a7994c78bf33a2384a65f50, type: 3} tiredSound: {fileID: 8300000, guid: bd98ba95bc1ff6961a95e12400cd71ce, type: 3} deathSound: {fileID: 8300000, guid: e5a1c23ef78e24350938cbaa612817bb, type: 3} hitSound: {fileID: 8300000, guid: 0535a1781b9d2e8018f56aa45b71932a, type: 3} player: {fileID: 0} + sparkPrefab: {fileID: 7445253572437675077, guid: 3fea7e0b996bbe3e1bc57731c745dd59, type: 3} gameBoardSpriteRenderer: {fileID: 0} - notificationPrefab: {fileID: 6394082776706812922, guid: 5cb297a990ab535aa8ef2b8054c9db1b, type: 3} - canvas: {fileID: 0} normalMaxSpeed: 2.5 turnRateDegreesPerSecond: 180 speedChangeRate: 4 diff --git a/Assets/Scripts/Game/LevelEnder.cs b/Assets/Scripts/Game/LevelEnder.cs index e05dd51..75626e8 100644 --- a/Assets/Scripts/Game/LevelEnder.cs +++ b/Assets/Scripts/Game/LevelEnder.cs @@ -279,6 +279,7 @@ public class LevelEnder : MonoBehaviour cakeSpawner.StartSpawning(); ballSpawner.StartSpawning(); multiplierSpawner.Reset(); + sharkSpawner.Reset(); // Reset state. levelEnded = false; diff --git a/Assets/Scripts/Game/Shark.meta b/Assets/Scripts/Game/Shark.meta new file mode 100644 index 0000000..49cbc31 --- /dev/null +++ b/Assets/Scripts/Game/Shark.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a68da2f7dbe6b99dfb0fc455293e9bad +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Game/Shark.cs b/Assets/Scripts/Game/Shark/Shark.cs similarity index 92% rename from Assets/Scripts/Game/Shark.cs rename to Assets/Scripts/Game/Shark/Shark.cs index 2527c9e..b69c2b2 100644 --- a/Assets/Scripts/Game/Shark.cs +++ b/Assets/Scripts/Game/Shark/Shark.cs @@ -15,6 +15,8 @@ public class Shark : NotifierBase public Player player; + public GameObject sparkPrefab; + public SpriteRenderer gameBoardSpriteRenderer; private Bounds? gameBoardBounds = null; @@ -39,6 +41,8 @@ public class Shark : NotifierBase private static int sharkKillPoints = 1000; + private static float sparkSpawnIntervalSeconds = 1.0f / 10.0f; + private bool spawnFinished = false; [SerializeField] @@ -73,6 +77,8 @@ public class Shark : NotifierBase private float currentTargetTimer = 0f; + private float sparkSpawnTimer = 0f; + private bool killed = false; // Start is called once before the first execution of Update after the MonoBehaviour is created @@ -268,10 +274,35 @@ public class Shark : NotifierBase Vector2 nextPosition = currentPosition + forward * (currentSpeed * Time.fixedDeltaTime); transform.position = new Vector3(nextPosition.x, nextPosition.y, transform.position.z); + float movedDistanceSqr = (nextPosition - currentPosition).sqrMagnitude; + if (movedDistanceSqr > 0.000001f) + { + sparkSpawnTimer += Time.fixedDeltaTime; + while (sparkSpawnTimer >= sparkSpawnIntervalSeconds) + { + SpawnSpark(); + sparkSpawnTimer -= sparkSpawnIntervalSeconds; + } + } + else + { + sparkSpawnTimer = 0f; + } + angle = QuantizeAngleToTen(currentHeadingAngle); } } + private void SpawnSpark() + { + if (sparkPrefab == null) + { + return; + } + + Instantiate(sparkPrefab, transform.position, Quaternion.identity); + } + private Vector2 ChooseRandomTarget() { Bounds bounds = movementBounds.Value; diff --git a/Assets/Scripts/Game/Shark.cs.meta b/Assets/Scripts/Game/Shark/Shark.cs.meta similarity index 100% rename from Assets/Scripts/Game/Shark.cs.meta rename to Assets/Scripts/Game/Shark/Shark.cs.meta diff --git a/Assets/Scripts/Game/Shark/SharkSpark.cs b/Assets/Scripts/Game/Shark/SharkSpark.cs new file mode 100644 index 0000000..602aeb0 --- /dev/null +++ b/Assets/Scripts/Game/Shark/SharkSpark.cs @@ -0,0 +1,9 @@ +using UnityEngine; + +public class SharkSpark : MonoBehaviour +{ + public void DestroySpark() + { + Destroy(gameObject); + } +} diff --git a/Assets/Scripts/Game/Shark/SharkSpark.cs.meta b/Assets/Scripts/Game/Shark/SharkSpark.cs.meta new file mode 100644 index 0000000..6b8a368 --- /dev/null +++ b/Assets/Scripts/Game/Shark/SharkSpark.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: bc6262e498fa2d2eba7d1e3d1b58f1cb \ No newline at end of file diff --git a/Assets/Sprites/Shark/180.png b/Assets/Sprites/Shark/180.png index 91c2238e834b68443b11eaf0e19dd473814d73d1..1788e2159850ff30da378ad5be67234eea307fea 100644 GIT binary patch delta 442 zcmV;r0Y(0g0>=Y?iBL{Q4GJ0x0000DNk~Le0000N000032nGNE0C;VbEdT%kAZbHG zP;*j8LI405m1AIFe82z%EDj6|xp^f;LGDfp5s^^}3`ig`xwwDIG)7?>v_#FC~lFl=vUV34?j z5K~#mz`)CR)NklERLtq$Povm4gjPZuslo45S!~gWR1MZ=Tet2Xa`_ z9eo`c7&i8E|4C#8@)eRjf_xbms?-=58d?|_egTCVUNA6}8Za=tN?>5Hn!&&zUNC1@ zpbb!hEy>&6h2cL4F4((#GEii40HbI%dx@v7EBh-BZbk+D#cy>zfa1ZPE{-7*m-qH> z6l^fyIkH7q`;SiK!Oa^cmkY5@fAS*Z!Rqjj*ChXSWreQfGN=yS`$*;143~zRxiOQf zk4UZDmh2h&_VLN)v%RORW*xEH{$;=azH_Xx3bSV