From b69a2c964cf1e5d897633846037da3a9c870663f Mon Sep 17 00:00:00 2001 From: Jeremy Smitherman Date: Sat, 25 Apr 2026 12:42:40 -0500 Subject: [PATCH] Added wind sound, better death handling, more graunlar states --- .idea/.idea.SpringJam2026/.idea/workspace.xml | 28 ++- Assets/Audio/SFX/airjump.wav.meta | 2 +- Assets/Audio/SFX/bump.aiff.meta | 2 +- Assets/Audio/SFX/death.wav.meta | 2 +- Assets/Audio/SFX/wind.wav.meta | 2 +- Assets/DefaultVolumeProfile.asset | 3 + Assets/InputSystem_Actions.inputactions | 20 ++ Assets/Prefabs/Catepillar/Player.prefab | 32 --- Assets/Prefabs/UI/DeathScreen.prefab | 112 --------- Assets/Scenes/Bootstrap.unity | 225 +++++++++++++++++- Assets/Scenes/Game.unity | 124 +--------- Assets/Scripts/Management/BGM.cs | 2 + Assets/Scripts/Management/Bootstrap.cs | 7 +- Assets/Scripts/Management/InputRouter.cs | 49 ++++ Assets/Scripts/Management/InputRouter.cs.meta | 2 + Assets/Scripts/Management/Services.cs | 2 + Assets/Scripts/Player/Movement.cs | 38 ++- Assets/Scripts/State/Game/GameRunningState.cs | 39 +++ .../State/Game/GameRunningState.cs.meta | 3 + Assets/Scripts/State/Game/MainMenuState.cs | 1 - Assets/Scripts/State/Game/MainStateMachine.cs | 48 +++- Assets/Scripts/State/Game/StartGameState.cs | 31 +++ .../Scripts/State/Game/StartGameState.cs.meta | 3 + Assets/Scripts/UI/DeathScreen.cs | 24 -- Assets/Scripts/UI/DeathScreen.cs.meta | 2 - Assets/UI Toolkit/PanelSettings.asset | 6 +- ProjectSettings/EditorBuildSettings.asset | 3 + 27 files changed, 477 insertions(+), 335 deletions(-) create mode 100644 Assets/Scripts/Management/InputRouter.cs create mode 100644 Assets/Scripts/Management/InputRouter.cs.meta create mode 100644 Assets/Scripts/State/Game/GameRunningState.cs create mode 100644 Assets/Scripts/State/Game/GameRunningState.cs.meta create mode 100644 Assets/Scripts/State/Game/StartGameState.cs create mode 100644 Assets/Scripts/State/Game/StartGameState.cs.meta delete mode 100644 Assets/Scripts/UI/DeathScreen.cs delete mode 100644 Assets/Scripts/UI/DeathScreen.cs.meta diff --git a/.idea/.idea.SpringJam2026/.idea/workspace.xml b/.idea/.idea.SpringJam2026/.idea/workspace.xml index 47f46c4..975ab76 100644 --- a/.idea/.idea.SpringJam2026/.idea/workspace.xml +++ b/.idea/.idea.SpringJam2026/.idea/workspace.xml @@ -6,14 +6,22 @@ - + + + - + + - + + + + + + + + - + { "associatedIndex": 6 @@ -101,13 +111,15 @@ diff --git a/Assets/Audio/SFX/airjump.wav.meta b/Assets/Audio/SFX/airjump.wav.meta index cd79a58..8519956 100644 --- a/Assets/Audio/SFX/airjump.wav.meta +++ b/Assets/Audio/SFX/airjump.wav.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 1 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Audio/SFX/bump.aiff.meta b/Assets/Audio/SFX/bump.aiff.meta index b9c6a3e..470a230 100644 --- a/Assets/Audio/SFX/bump.aiff.meta +++ b/Assets/Audio/SFX/bump.aiff.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 1 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Audio/SFX/death.wav.meta b/Assets/Audio/SFX/death.wav.meta index 8f0e86c..f05e8f9 100644 --- a/Assets/Audio/SFX/death.wav.meta +++ b/Assets/Audio/SFX/death.wav.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 1 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/Audio/SFX/wind.wav.meta b/Assets/Audio/SFX/wind.wav.meta index 58adfe3..4a14249 100644 --- a/Assets/Audio/SFX/wind.wav.meta +++ b/Assets/Audio/SFX/wind.wav.meta @@ -11,7 +11,7 @@ AudioImporter: compressionFormat: 1 quality: 1 conversionMode: 0 - preloadAudioData: 0 + preloadAudioData: 1 platformSettingOverrides: {} forceToMono: 0 normalize: 1 diff --git a/Assets/DefaultVolumeProfile.asset b/Assets/DefaultVolumeProfile.asset index 0cd0e1a..8cea4d2 100644 --- a/Assets/DefaultVolumeProfile.asset +++ b/Assets/DefaultVolumeProfile.asset @@ -322,6 +322,9 @@ MonoBehaviour: highQualityFiltering: m_OverrideState: 1 m_Value: 0 + filter: + m_OverrideState: 1 + m_Value: 0 downscale: m_OverrideState: 1 m_Value: 0 diff --git a/Assets/InputSystem_Actions.inputactions b/Assets/InputSystem_Actions.inputactions index 04b2ea2..5bcbbcb 100644 --- a/Assets/InputSystem_Actions.inputactions +++ b/Assets/InputSystem_Actions.inputactions @@ -14,6 +14,15 @@ "processors": "", "interactions": "", "initialStateCheck": false + }, + { + "name": "Spawn", + "type": "Button", + "id": "872c318c-192f-4bba-a6d7-ba6e0c7ae7c6", + "expectedControlType": "", + "processors": "", + "interactions": "", + "initialStateCheck": false } ], "bindings": [ @@ -104,6 +113,17 @@ "action": "Interact", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "423b0c40-8c5b-40c6-91d1-5b809e0cfa85", + "path": "/r", + "interactions": "", + "processors": "", + "groups": ";Keyboard&Mouse;Gamepad;Touch;Joystick;XR", + "action": "Spawn", + "isComposite": false, + "isPartOfComposite": false } ] }, diff --git a/Assets/Prefabs/Catepillar/Player.prefab b/Assets/Prefabs/Catepillar/Player.prefab index 82abc04..434e4ee 100644 --- a/Assets/Prefabs/Catepillar/Player.prefab +++ b/Assets/Prefabs/Catepillar/Player.prefab @@ -142,7 +142,6 @@ GameObject: - component: {fileID: 849756540516150458} - component: {fileID: 4169369283586250626} - component: {fileID: 3534034070345576868} - - component: {fileID: 4576448781989217082} m_Layer: 0 m_Name: Player m_TagString: Player @@ -271,7 +270,6 @@ MonoBehaviour: airJumpForce: 10 spriteRenderer: {fileID: 342790821639359709} turnDelay: 0.08 - interactReference: {fileID: 1781555164194001046, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3} impactPauseTime: 0.2 bouncePower: 5 animator: {fileID: 2598533458249844269} @@ -283,36 +281,6 @@ MonoBehaviour: bumpSound: {fileID: 8300000, guid: 7c28608e819f6574193756354a7974fe, type: 3} windSound: {fileID: 2413457592393949793} maxSpeedWindSound: 15 ---- !u!114 &4576448781989217082 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 7621021177568661959} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 62899f850307741f2a39c98a8b639597, type: 3} - m_Name: - m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.PlayerInput - m_Actions: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3} - m_NotificationBehavior: 3 - m_UIInputModule: {fileID: 0} - m_DeviceLostEvent: - m_PersistentCalls: - m_Calls: [] - m_DeviceRegainedEvent: - m_PersistentCalls: - m_Calls: [] - m_ControlsChangedEvent: - m_PersistentCalls: - m_Calls: [] - m_ActionEvents: [] - m_NeverAutoSwitchControlSchemes: 0 - m_DefaultControlScheme: - m_DefaultActionMap: Player - m_SplitScreenIndex: -1 - m_Camera: {fileID: 0} --- !u!1 &8270890549788907285 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Prefabs/UI/DeathScreen.prefab b/Assets/Prefabs/UI/DeathScreen.prefab index a52cee4..ed4b4ab 100644 --- a/Assets/Prefabs/UI/DeathScreen.prefab +++ b/Assets/Prefabs/UI/DeathScreen.prefab @@ -10,8 +10,6 @@ GameObject: m_Component: - component: {fileID: 315795448353938977} - component: {fileID: 7156060875641048167} - - component: {fileID: 6275699004517191814} - - component: {fileID: -131508972722898766} m_Layer: 0 m_Name: DeathScreen m_TagString: Untagged @@ -57,113 +55,3 @@ MonoBehaviour: m_PivotReferenceSize: 0 m_Pivot: 0 m_WorldSpaceCollider: {fileID: 0} ---- !u!82 &6275699004517191814 -AudioSource: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6072795237519443946} - m_Enabled: 1 - serializedVersion: 4 - OutputAudioMixerGroup: {fileID: 0} - m_audioClip: {fileID: 0} - m_Resource: {fileID: 8300000, guid: 9abfcb38929cf1241a742680b5fcf017, type: 3} - m_PlayOnAwake: 1 - m_Volume: 1 - m_Pitch: 0.8 - Loop: 0 - Mute: 0 - Spatialize: 0 - SpatializePostEffects: 0 - Priority: 0 - DopplerLevel: 1 - MinDistance: 1 - MaxDistance: 500 - Pan2D: 0 - rolloffMode: 0 - BypassEffects: 0 - BypassListenerEffects: 0 - BypassReverbZones: 0 - rolloffCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - - serializedVersion: 3 - time: 1 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - panLevelCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - spreadCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 0 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 - reverbZoneMixCustomCurve: - serializedVersion: 2 - m_Curve: - - serializedVersion: 3 - time: 0 - value: 1 - inSlope: 0 - outSlope: 0 - tangentMode: 0 - weightedMode: 0 - inWeight: 0.33333334 - outWeight: 0.33333334 - m_PreInfinity: 2 - m_PostInfinity: 2 - m_RotationOrder: 4 ---- !u!114 &-131508972722898766 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 6072795237519443946} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: 2a3ba437acb54874092ae3d89c46b133, type: 3} - m_Name: - m_EditorClassIdentifier: Assembly-CSharp::UI.DeathScreen - playerPrefab: {fileID: 7621021177568661959, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} diff --git a/Assets/Scenes/Bootstrap.unity b/Assets/Scenes/Bootstrap.unity index 4d041f2..2ec7558 100644 --- a/Assets/Scenes/Bootstrap.unity +++ b/Assets/Scenes/Bootstrap.unity @@ -119,6 +119,218 @@ NavMeshSettings: debug: m_Flags: 0 m_NavMeshData: {fileID: 0} +--- !u!1 &564331327 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 564331331} + - component: {fileID: 564331330} + - component: {fileID: 564331329} + - component: {fileID: 564331328} + m_Layer: 0 + m_Name: Camera + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!114 &564331328 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564331327} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: a79441f348de89743a2939f4d699eac1, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.RenderPipelines.Universal.Runtime::UnityEngine.Rendering.Universal.UniversalAdditionalCameraData + m_RenderShadows: 1 + m_RequiresDepthTextureOption: 2 + m_RequiresOpaqueTextureOption: 2 + m_CameraType: 0 + m_Cameras: [] + m_RendererIndex: -1 + m_VolumeLayerMask: + serializedVersion: 2 + m_Bits: 1 + m_VolumeTrigger: {fileID: 0} + m_VolumeFrameworkUpdateModeOption: 2 + m_RenderPostProcessing: 0 + m_Antialiasing: 0 + m_AntialiasingQuality: 2 + m_StopNaN: 0 + m_Dithering: 0 + m_ClearDepth: 1 + m_AllowXRRendering: 1 + m_AllowHDROutput: 1 + m_UseScreenCoordOverride: 0 + m_ScreenSizeOverride: {x: 0, y: 0, z: 0, w: 0} + m_ScreenCoordScaleBias: {x: 0, y: 0, z: 0, w: 0} + m_RequiresDepthTexture: 0 + m_RequiresColorTexture: 0 + m_TaaSettings: + m_Quality: 3 + m_FrameInfluence: 0.1 + m_JitterScale: 1 + m_MipBias: 0 + m_VarianceClampScale: 0.9 + m_ContrastAdaptiveSharpening: 0 + m_Version: 2 +--- !u!81 &564331329 +AudioListener: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564331327} + m_Enabled: 1 +--- !u!20 &564331330 +Camera: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564331327} + m_Enabled: 1 + serializedVersion: 2 + m_ClearFlags: 2 + m_BackGroundColor: {r: 0, g: 0, b: 0, a: 1} + m_projectionMatrixMode: 1 + m_GateFitMode: 2 + m_FOVAxisMode: 0 + m_Iso: 200 + m_ShutterSpeed: 0.005 + m_Aperture: 16 + m_FocusDistance: 10 + m_FocalLength: 50 + m_BladeCount: 5 + m_Curvature: {x: 2, y: 11} + m_BarrelClipping: 0.25 + m_Anamorphism: 0 + m_SensorSize: {x: 36, y: 24} + m_LensShift: {x: 0, y: 0} + m_NormalizedViewPortRect: + serializedVersion: 2 + x: 0 + y: 0 + width: 1 + height: 1 + near clip plane: 0.3 + far clip plane: 1000 + field of view: 60 + orthographic: 0 + orthographic size: 5 + m_Depth: 0 + m_CullingMask: + serializedVersion: 2 + m_Bits: 4294967295 + m_RenderingPath: -1 + m_TargetTexture: {fileID: 0} + m_TargetDisplay: 0 + m_TargetEye: 3 + m_HDR: 1 + m_AllowMSAA: 1 + m_AllowDynamicResolution: 0 + m_ForceIntoRT: 0 + m_OcclusionCulling: 1 + m_StereoConvergence: 10 + m_StereoSeparation: 0.022 +--- !u!4 &564331331 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 564331327} + serializedVersion: 2 + 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!1 &1131356124 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1131356126} + - component: {fileID: 1131356125} + - component: {fileID: 1131356127} + m_Layer: 0 + m_Name: InputManager + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &1131356125 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131356124} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 62899f850307741f2a39c98a8b639597, type: 3} + m_Name: + m_EditorClassIdentifier: Unity.InputSystem::UnityEngine.InputSystem.PlayerInput + m_Actions: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3} + m_NotificationBehavior: 3 + m_UIInputModule: {fileID: 0} + m_DeviceLostEvent: + m_PersistentCalls: + m_Calls: [] + m_DeviceRegainedEvent: + m_PersistentCalls: + m_Calls: [] + m_ControlsChangedEvent: + m_PersistentCalls: + m_Calls: [] + m_ActionEvents: [] + m_NeverAutoSwitchControlSchemes: 0 + m_DefaultControlScheme: Keyboard&Mouse + m_DefaultActionMap: Player + m_SplitScreenIndex: -1 + m_Camera: {fileID: 0} +--- !u!4 &1131356126 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131356124} + serializedVersion: 2 + 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: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!114 &1131356127 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 1131356124} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cae18a7c1c4314e4fb239ece5cef4996, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::Management.InputRouter --- !u!1 &1327356647 GameObject: m_ObjectHideFlags: 0 @@ -278,7 +490,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 0 + m_IsActive: 1 --- !u!114 &1469922750 MonoBehaviour: m_ObjectHideFlags: 0 @@ -292,6 +504,10 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: Assembly-CSharp::State.Game.MainStateMachine mainMenuPrefab: {fileID: 1522947426740712753, guid: 0453e357da6c33c468bb3d3726552b8e, type: 3} + playerPrefab: {fileID: 7621021177568661959, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} + fruitsPrefab: {fileID: 3648719755775049102, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} + deathScreenPrefab: {fileID: 6072795237519443946, guid: 439eaa80d7eac8d4db6eace5ddaf3489, type: 3} + deathSound: {fileID: 8300000, guid: 9abfcb38929cf1241a742680b5fcf017, type: 3} --- !u!4 &1469922751 Transform: m_ObjectHideFlags: 0 @@ -339,6 +555,7 @@ MonoBehaviour: m_EditorClassIdentifier: Assembly-CSharp::Management.Services bgm: {fileID: 1755353617} sfx: {fileID: 1327356649} + inputRouter: {fileID: 1131356127} --- !u!4 &1671688485 Transform: m_ObjectHideFlags: 0 @@ -361,12 +578,12 @@ MonoBehaviour: m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1671688483} - m_Enabled: 0 + m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: 4b256c4001284134990a2af43c375455, type: 3} m_Name: m_EditorClassIdentifier: Assembly-CSharp::Bootstrap - startType: 1 + startType: 3 gameStateMachine: {fileID: 1469922750} --- !u!1 &1755353616 GameObject: @@ -715,3 +932,5 @@ SceneRoots: - {fileID: 1755353619} - {fileID: 1327356648} - {fileID: 1469922751} + - {fileID: 1131356126} + - {fileID: 564331331} diff --git a/Assets/Scenes/Game.unity b/Assets/Scenes/Game.unity index 233db3a..0ede7bd 100644 --- a/Assets/Scenes/Game.unity +++ b/Assets/Scenes/Game.unity @@ -356,9 +356,9 @@ Camera: m_NormalizedViewPortRect: serializedVersion: 2 x: 0 - y: 0.0009259259 + y: 0 width: 1 - height: 0.99814814 + height: 1 near clip plane: 0.3 far clip plane: 1000 field of view: 60 @@ -4523,124 +4523,6 @@ BoxCollider2D: m_AutoTiling: 0 m_Size: {x: 2, y: 0.5} m_EdgeRadius: 0 ---- !u!1001 &2062647807 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 4576448781989217082, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_Camera - value: - objectReference: {fileID: 1102711993} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalPosition.x - value: -6.31 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalPosition.y - value: -0.85 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 6196444245332325679, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 7621021177568661959, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} - propertyPath: m_Name - value: Player - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: fbc05a08dfccd6a4cb1bcc1cf1910065, type: 3} ---- !u!1001 &4089110117659577756 -PrefabInstance: - m_ObjectHideFlags: 0 - serializedVersion: 2 - m_Modification: - serializedVersion: 3 - m_TransformParent: {fileID: 0} - m_Modifications: - - target: {fileID: 3648719755775049102, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_Name - value: Fruits - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalPosition.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalPosition.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalPosition.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalRotation.w - value: 1 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalRotation.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalRotation.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalRotation.z - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalEulerAnglesHint.x - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalEulerAnglesHint.y - value: 0 - objectReference: {fileID: 0} - - target: {fileID: 8964614072675907068, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} - propertyPath: m_LocalEulerAnglesHint.z - value: 0 - objectReference: {fileID: 0} - m_RemovedComponents: [] - m_RemovedGameObjects: [] - m_AddedGameObjects: [] - m_AddedComponents: [] - m_SourcePrefab: {fileID: 100100000, guid: 067c711b87e00ef4d9158c92377f44a6, type: 3} --- !u!1660057539 &9223372036854775807 SceneRoots: m_ObjectHideFlags: 0 @@ -4649,7 +4531,5 @@ SceneRoots: - {fileID: 135794690} - {fileID: 118420888} - {fileID: 1755712273} - - {fileID: 2062647807} - {fileID: 1454353602} - - {fileID: 4089110117659577756} - {fileID: 219800105} diff --git a/Assets/Scripts/Management/BGM.cs b/Assets/Scripts/Management/BGM.cs index e798983..28b651c 100644 --- a/Assets/Scripts/Management/BGM.cs +++ b/Assets/Scripts/Management/BGM.cs @@ -36,6 +36,7 @@ namespace Management TrackType.Muted => audioSources[0], TrackType.Core => audioSources[1], TrackType.Victory => audioSources[2], + _ => audioSources[0], }; var targetAudioSource = type switch @@ -43,6 +44,7 @@ namespace Management TrackType.Muted => audioSources[0], TrackType.Core => audioSources[1], TrackType.Victory => audioSources[2], + _ => audioSources[0], }; StartCoroutine(FadeInRoutine(currentAudioSource, targetAudioSource, t)); diff --git a/Assets/Scripts/Management/Bootstrap.cs b/Assets/Scripts/Management/Bootstrap.cs index 9f11d77..0e34abc 100644 --- a/Assets/Scripts/Management/Bootstrap.cs +++ b/Assets/Scripts/Management/Bootstrap.cs @@ -23,6 +23,7 @@ namespace Management { Splash, MainMenu, + StartGame, Game } @@ -64,8 +65,12 @@ namespace Management switch (startType) { case StartType.Splash: + case StartType.StartGame: + gameStateMachine.ChangeState(new StartGameState()); + break; case StartType.Game: - throw new NotImplementedException(); + gameStateMachine.ChangeState(new GameRunningState()); + break; case StartType.MainMenu: default: gameStateMachine.ChangeState(new MainMenuState()); diff --git a/Assets/Scripts/Management/InputRouter.cs b/Assets/Scripts/Management/InputRouter.cs new file mode 100644 index 0000000..c9f7cbd --- /dev/null +++ b/Assets/Scripts/Management/InputRouter.cs @@ -0,0 +1,49 @@ +using System; +using UnityEngine; +using UnityEngine.InputSystem; + +namespace Management +{ + public class InputRouter : MonoBehaviour + { + public event Action OnInteract; + private static InputRouter _instance; + private PlayerInput _playerInput; + private InputAction _interactAction; + + private void Awake() + { + if (_instance != null && _instance != this) + { + Destroy(gameObject); + return; + } + + _playerInput = GetComponent(); + _playerInput.actions.Disable(); + EnableGameActions(); + } + + public void EnableGameActions() + { + _playerInput.SwitchCurrentActionMap("Player"); + + _interactAction = _playerInput.actions.FindAction("Interact", true); + _interactAction.Enable(); + + _interactAction.performed += HandleInteraction; + _interactAction.canceled += HandleInteraction; + + } + + public void EnableUIActions() + { + _playerInput.SwitchCurrentActionMap("UI"); + } + + private void HandleInteraction(InputAction.CallbackContext context) + { + OnInteract?.Invoke(context.performed); + } + } +} diff --git a/Assets/Scripts/Management/InputRouter.cs.meta b/Assets/Scripts/Management/InputRouter.cs.meta new file mode 100644 index 0000000..a33830a --- /dev/null +++ b/Assets/Scripts/Management/InputRouter.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: cae18a7c1c4314e4fb239ece5cef4996 \ No newline at end of file diff --git a/Assets/Scripts/Management/Services.cs b/Assets/Scripts/Management/Services.cs index 31e043c..6dbc7d2 100644 --- a/Assets/Scripts/Management/Services.cs +++ b/Assets/Scripts/Management/Services.cs @@ -16,9 +16,11 @@ namespace Management // SFX service to serve as single spot SFX plays from. public SFX SFX => sfx; + public InputRouter InputRouter => inputRouter; [SerializeField] private BGM bgm; [SerializeField] private SFX sfx; + [SerializeField] private InputRouter inputRouter; private void Awake() { diff --git a/Assets/Scripts/Player/Movement.cs b/Assets/Scripts/Player/Movement.cs index 104e4c4..fb4adb6 100644 --- a/Assets/Scripts/Player/Movement.cs +++ b/Assets/Scripts/Player/Movement.cs @@ -10,6 +10,8 @@ namespace Player [RequireComponent(typeof(Rigidbody2D))] public class Movement : MonoBehaviour { + public event Action OnDeath; + private static readonly int Spring = Animator.StringToHash("spring"); private static readonly int Grounded = Animator.StringToHash("grounded"); private static readonly int Speed = Animator.StringToHash("speed"); @@ -20,7 +22,6 @@ namespace Player [SerializeField] private float airJumpForce; [SerializeField] private SpriteRenderer spriteRenderer; [SerializeField] private float turnDelay; - [SerializeField] private InputActionReference interactReference; [SerializeField] private float impactPauseTime; [SerializeField] private float bouncePower; [SerializeField] private Animator animator; @@ -52,25 +53,27 @@ namespace Player private Vector2 _airJumpDir; private bool _autoDrive = true; private bool _deathArmed; - + private void Awake() { - _rb = GetComponent(); - InputSystem.actions.FindActionMap("UI").Disable(); - InputSystem.actions.FindActionMap("Player").Enable(); - interactReference.action.performed += HandleInteraction; - interactReference.action.canceled += HandleInteraction; + _rb = GetComponent(); } - + private void Start() { Cursor.lockState = CursorLockMode.None; Cursor.visible = true; + Services.Instance.InputRouter.OnInteract += HandleInteraction; } - - private void HandleInteraction(InputAction.CallbackContext obj) + + private void OnDestroy() { - _interact = obj.ReadValueAsButton(); + Services.Instance.InputRouter.OnInteract -= HandleInteraction; + } + + private void HandleInteraction(bool pressed) + { + _interact = pressed; _jumpPressedThisFrame = _interact; } @@ -112,16 +115,10 @@ namespace Player _airJump = true; } - Debug.Log(_rb.linearVelocityY); - windSound.volume = Mathf.Lerp(0, 1, _rb.linearVelocityY / maxSpeedWindSound); + windSound.volume = Mathf.Lerp(0, 1, Mathf.Abs(_rb.linearVelocityY / maxSpeedWindSound)); _jumpPressedThisFrame = false; } - private void OnDestroy() - { - windSound.volume = 0f; - } - private void FixedUpdate() { if (_jump) @@ -147,7 +144,7 @@ namespace Player Services.Instance.SFX.PlayOneShot(springSound); Services.Instance.BGM.FadeIn(BGM.TrackType.Core); _fireSpring = false; - _rb.linearVelocityX = 0; + _rb.linearVelocity = Vector2.zero; _rb.AddForce(Vector2.up * springPower, ForceMode2D.Impulse); } if (_autoDrive) @@ -187,8 +184,7 @@ namespace Player private void HandleDeath() { - Instantiate(deathScreenPrefab, transform.position, Quaternion.identity); - Destroy(gameObject); + OnDeath?.Invoke(); } private void OnTriggerExit2D(Collider2D other) diff --git a/Assets/Scripts/State/Game/GameRunningState.cs b/Assets/Scripts/State/Game/GameRunningState.cs new file mode 100644 index 0000000..a421700 --- /dev/null +++ b/Assets/Scripts/State/Game/GameRunningState.cs @@ -0,0 +1,39 @@ +using System.Collections; +using Management; +using UnityEngine; + +namespace State.Game +{ + public class GameRunningState : MainGameState + { + public override void OnEnter(Machine machine) + { + base.OnEnter(machine); + MainStateMachine.Respawn(); + MainStateMachine.PlayerMovement.OnDeath += HandleDeath; + } + + private void HandleDeath() + { + MainStateMachine.StartCoroutine(DeathRoutine()); + } + + private IEnumerator DeathRoutine() + { + // Hide the guts + MainStateMachine.ShowDeathScreen(true); + Services.Instance.SFX.PlayOneShot(MainStateMachine.DeathSound); + + // Cleanup before we remove player and fruits + MainStateMachine.PlayerMovement.OnDeath -= HandleDeath; + MainStateMachine.Respawn(); + + // Reregister events + MainStateMachine.PlayerMovement.OnDeath += HandleDeath; + + // Wait a moment then restart the game + yield return new WaitForSeconds(2f); + MainStateMachine.ShowDeathScreen(false); + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/State/Game/GameRunningState.cs.meta b/Assets/Scripts/State/Game/GameRunningState.cs.meta new file mode 100644 index 0000000..4d59cb5 --- /dev/null +++ b/Assets/Scripts/State/Game/GameRunningState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 587d831b91074411bf3a4b0270225711 +timeCreated: 1777136024 \ No newline at end of file diff --git a/Assets/Scripts/State/Game/MainMenuState.cs b/Assets/Scripts/State/Game/MainMenuState.cs index 8567a1a..cf0f6b8 100644 --- a/Assets/Scripts/State/Game/MainMenuState.cs +++ b/Assets/Scripts/State/Game/MainMenuState.cs @@ -49,7 +49,6 @@ namespace State.Game private void HandleStartGame() { _mainMenuInstance.OnStartGame -= HandleStartGame; - Debug.Log("Starting game"); } } } \ No newline at end of file diff --git a/Assets/Scripts/State/Game/MainStateMachine.cs b/Assets/Scripts/State/Game/MainStateMachine.cs index 1168db7..e20f65b 100644 --- a/Assets/Scripts/State/Game/MainStateMachine.cs +++ b/Assets/Scripts/State/Game/MainStateMachine.cs @@ -1,11 +1,55 @@ -using UnityEngine; +using System; +using Player; +using UnityEngine; +using UnityEngine.UIElements; namespace State.Game { public class MainStateMachine : Machine { public GameObject MainMenuPrefab => mainMenuPrefab; - + public GameObject PlayerPrefab => playerPrefab; + public GameObject FruitsPrefab => fruitsPrefab; + + public Movement PlayerMovement { get; private set; } + public AudioClip DeathSound => deathSound; + [SerializeField] private GameObject mainMenuPrefab; + [SerializeField] private GameObject playerPrefab; + [SerializeField] private GameObject fruitsPrefab; + [SerializeField] private GameObject deathScreenPrefab; + [SerializeField] private AudioClip deathSound; + + private GameObject _playerInstance; + private GameObject _fruitsInstance; + private GameObject _deathScreenInstance; + + private void Awake() + { + _deathScreenInstance = Instantiate(deathScreenPrefab); + ShowDeathScreen(false); + } + + public void Respawn() + { + if (_fruitsInstance) + { + Destroy(_fruitsInstance); + } + + if (_playerInstance) + { + Destroy(_playerInstance); + } + var respawn = GameObject.FindGameObjectWithTag("Respawn").transform; + _fruitsInstance = Instantiate(fruitsPrefab); + _playerInstance = Instantiate(playerPrefab, respawn.position, Quaternion.identity); + PlayerMovement = _playerInstance.GetComponent(); + } + + public void ShowDeathScreen(bool show) + { + _deathScreenInstance.GetComponent().rootVisualElement.Q().visible = show; + } } } \ No newline at end of file diff --git a/Assets/Scripts/State/Game/StartGameState.cs b/Assets/Scripts/State/Game/StartGameState.cs new file mode 100644 index 0000000..66f0a17 --- /dev/null +++ b/Assets/Scripts/State/Game/StartGameState.cs @@ -0,0 +1,31 @@ +using System.Collections; +using UnityEngine; +using UnityEngine.SceneManagement; + +namespace State.Game +{ + public class StartGameState : MainGameState + { + public override void OnEnter(Machine machine) + { + base.OnEnter(machine); + + } + + private IEnumerator LoadGame() + { + var oldCam = Camera.main; + var handle = SceneManager.LoadSceneAsync("Game", LoadSceneMode.Additive); + if (handle != null) + { + while (!handle.isDone) + { + yield return null; + } + SceneManager.SetActiveScene(SceneManager.GetSceneByName("Game")); + oldCam?.gameObject.SetActive(false); + MainStateMachine.ChangeState(new GameRunningState()); + } + } + } +} \ No newline at end of file diff --git a/Assets/Scripts/State/Game/StartGameState.cs.meta b/Assets/Scripts/State/Game/StartGameState.cs.meta new file mode 100644 index 0000000..dbef27a --- /dev/null +++ b/Assets/Scripts/State/Game/StartGameState.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: eceabbf9f62345569805bb1a763abf24 +timeCreated: 1777135622 \ No newline at end of file diff --git a/Assets/Scripts/UI/DeathScreen.cs b/Assets/Scripts/UI/DeathScreen.cs deleted file mode 100644 index f4dd739..0000000 --- a/Assets/Scripts/UI/DeathScreen.cs +++ /dev/null @@ -1,24 +0,0 @@ -using System; -using UnityEngine; - -namespace UI -{ - public class DeathScreen : MonoBehaviour - { - [SerializeField] private GameObject playerPrefab; - [SerializeField] private GameObject fruitsPrefab; - - private float _timer; - - private void Update() - { - _timer += Time.deltaTime; - if (_timer > 2f) - { - var spawnPos = GameObject.FindGameObjectWithTag("Respawn").transform.position; - Instantiate(playerPrefab, spawnPos, Quaternion.identity); - Destroy(gameObject); - } - } - } -} diff --git a/Assets/Scripts/UI/DeathScreen.cs.meta b/Assets/Scripts/UI/DeathScreen.cs.meta deleted file mode 100644 index c6f338e..0000000 --- a/Assets/Scripts/UI/DeathScreen.cs.meta +++ /dev/null @@ -1,2 +0,0 @@ -fileFormatVersion: 2 -guid: 2a3ba437acb54874092ae3d89c46b133 \ No newline at end of file diff --git a/Assets/UI Toolkit/PanelSettings.asset b/Assets/UI Toolkit/PanelSettings.asset index 85cda34..feef7b1 100644 --- a/Assets/UI Toolkit/PanelSettings.asset +++ b/Assets/UI Toolkit/PanelSettings.asset @@ -18,13 +18,13 @@ MonoBehaviour: m_RenderMode: 0 m_ColliderUpdateMode: 0 m_ColliderIsTrigger: 1 - m_ScaleMode: 1 + m_ScaleMode: 2 m_ReferenceSpritePixelsPerUnit: 100 m_PixelsPerUnit: 100 m_Scale: 1 m_ReferenceDpi: 96 m_FallbackDpi: 96 - m_ReferenceResolution: {x: 1200, y: 800} + m_ReferenceResolution: {x: 1280, y: 720} m_ScreenMatchMode: 0 m_Match: 0 m_SortingOrder: 0 @@ -39,7 +39,7 @@ MonoBehaviour: m_MinAtlasSize: 64 m_MaxAtlasSize: 4096 m_MaxSubTextureSize: 64 - m_ActiveFilters: 31 + m_ActiveFilters: -1 m_AtlasBlitShader: {fileID: 9101, guid: 0000000000000000f000000000000000, type: 0} m_DefaultShader: {fileID: 9100, guid: 0000000000000000f000000000000000, type: 0} m_RuntimeGaussianBlurShader: {fileID: 20300, guid: 0000000000000000f000000000000000, type: 0} diff --git a/ProjectSettings/EditorBuildSettings.asset b/ProjectSettings/EditorBuildSettings.asset index c188316..62b9c27 100644 --- a/ProjectSettings/EditorBuildSettings.asset +++ b/ProjectSettings/EditorBuildSettings.asset @@ -11,6 +11,9 @@ EditorBuildSettings: - enabled: 1 path: Assets/Scenes/MainMenu.unity guid: d9e43626d738a3f448e4acc7b2c1dfe3 + - enabled: 1 + path: Assets/Scenes/Game.unity + guid: cd7b38ade83933e45843d4ffed0886d0 m_configObjects: com.unity.input.settings.actions: {fileID: -944628639613478452, guid: 2bcd2660ca9b64942af0de543d8d7100, type: 3} m_UseUCBPForAssetBundles: 0