diff --git a/Assets/Input/Player.cs b/Assets/Input/Player.cs index f0bcce7..194655b 100644 --- a/Assets/Input/Player.cs +++ b/Assets/Input/Player.cs @@ -64,6 +64,15 @@ namespace Input ""processors"": """", ""interactions"": """", ""initialStateCheck"": false + }, + { + ""name"": ""Pause"", + ""type"": ""Button"", + ""id"": ""b110facd-253d-41ce-9de7-b589dc48cfc6"", + ""expectedControlType"": ""Button"", + ""processors"": """", + ""interactions"": """", + ""initialStateCheck"": false } ], ""bindings"": [ @@ -209,6 +218,28 @@ namespace Input ""action"": ""Climb"", ""isComposite"": false, ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""6a01ec66-e7a4-426a-8ee4-977d456b200c"", + ""path"": ""/start"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""Controller"", + ""action"": ""Pause"", + ""isComposite"": false, + ""isPartOfComposite"": false + }, + { + ""name"": """", + ""id"": ""279efb3d-768d-49fd-91f5-c74ebe08c880"", + ""path"": ""/escape"", + ""interactions"": """", + ""processors"": """", + ""groups"": ""KeyBoard"", + ""action"": ""Pause"", + ""isComposite"": false, + ""isPartOfComposite"": false } ] } @@ -244,6 +275,7 @@ namespace Input m_PlayerControl_Jump = m_PlayerControl.FindAction("Jump", throwIfNotFound: true); m_PlayerControl_Interact = m_PlayerControl.FindAction("Interact", throwIfNotFound: true); m_PlayerControl_Climb = m_PlayerControl.FindAction("Climb", throwIfNotFound: true); + m_PlayerControl_Pause = m_PlayerControl.FindAction("Pause", throwIfNotFound: true); } public void Dispose() @@ -307,6 +339,7 @@ namespace Input private readonly InputAction m_PlayerControl_Jump; private readonly InputAction m_PlayerControl_Interact; private readonly InputAction m_PlayerControl_Climb; + private readonly InputAction m_PlayerControl_Pause; public struct PlayerControlActions { private @PlayerInput m_Wrapper; @@ -315,6 +348,7 @@ namespace Input public InputAction @Jump => m_Wrapper.m_PlayerControl_Jump; public InputAction @Interact => m_Wrapper.m_PlayerControl_Interact; public InputAction @Climb => m_Wrapper.m_PlayerControl_Climb; + public InputAction @Pause => m_Wrapper.m_PlayerControl_Pause; public InputActionMap Get() { return m_Wrapper.m_PlayerControl; } public void Enable() { Get().Enable(); } public void Disable() { Get().Disable(); } @@ -336,6 +370,9 @@ namespace Input @Climb.started -= m_Wrapper.m_PlayerControlActionsCallbackInterface.OnClimb; @Climb.performed -= m_Wrapper.m_PlayerControlActionsCallbackInterface.OnClimb; @Climb.canceled -= m_Wrapper.m_PlayerControlActionsCallbackInterface.OnClimb; + @Pause.started -= m_Wrapper.m_PlayerControlActionsCallbackInterface.OnPause; + @Pause.performed -= m_Wrapper.m_PlayerControlActionsCallbackInterface.OnPause; + @Pause.canceled -= m_Wrapper.m_PlayerControlActionsCallbackInterface.OnPause; } m_Wrapper.m_PlayerControlActionsCallbackInterface = instance; if (instance != null) @@ -352,6 +389,9 @@ namespace Input @Climb.started += instance.OnClimb; @Climb.performed += instance.OnClimb; @Climb.canceled += instance.OnClimb; + @Pause.started += instance.OnPause; + @Pause.performed += instance.OnPause; + @Pause.canceled += instance.OnPause; } } } @@ -380,6 +420,7 @@ namespace Input void OnJump(InputAction.CallbackContext context); void OnInteract(InputAction.CallbackContext context); void OnClimb(InputAction.CallbackContext context); + void OnPause(InputAction.CallbackContext context); } } } diff --git a/Assets/Input/Player.inputactions b/Assets/Input/Player.inputactions index e152e19..a5ae1f3 100644 --- a/Assets/Input/Player.inputactions +++ b/Assets/Input/Player.inputactions @@ -40,6 +40,15 @@ "processors": "", "interactions": "", "initialStateCheck": false + }, + { + "name": "Pause", + "type": "Button", + "id": "b110facd-253d-41ce-9de7-b589dc48cfc6", + "expectedControlType": "Button", + "processors": "", + "interactions": "", + "initialStateCheck": false } ], "bindings": [ @@ -185,6 +194,28 @@ "action": "Climb", "isComposite": false, "isPartOfComposite": false + }, + { + "name": "", + "id": "6a01ec66-e7a4-426a-8ee4-977d456b200c", + "path": "/start", + "interactions": "", + "processors": "", + "groups": "Controller", + "action": "Pause", + "isComposite": false, + "isPartOfComposite": false + }, + { + "name": "", + "id": "279efb3d-768d-49fd-91f5-c74ebe08c880", + "path": "/escape", + "interactions": "", + "processors": "", + "groups": "KeyBoard", + "action": "Pause", + "isComposite": false, + "isPartOfComposite": false } ] } diff --git a/Assets/Prefabs/UI/Pause Menu Variant.prefab b/Assets/Prefabs/UI/Pause Menu Variant.prefab index c7eb239..78428a2 100644 --- a/Assets/Prefabs/UI/Pause Menu Variant.prefab +++ b/Assets/Prefabs/UI/Pause Menu Variant.prefab @@ -357,6 +357,23 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 3493594456440070957, guid: 16d5d75ef61cad14f9aba53761139517, type: 3} m_PrefabInstance: {fileID: 4238491769226202277} m_PrefabAsset: {fileID: 0} +--- !u!1 &3858736020799332164 stripped +GameObject: + m_CorrespondingSourceObject: {fileID: 1107566897619702753, guid: 16d5d75ef61cad14f9aba53761139517, type: 3} + m_PrefabInstance: {fileID: 4238491769226202277} + m_PrefabAsset: {fileID: 0} +--- !u!114 &3876120152542236901 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3858736020799332164} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 5c8db5f2b097c0f4eaa1098c35e1bc0e, type: 3} + m_Name: + m_EditorClassIdentifier: --- !u!1001 &5352609509542677726 PrefabInstance: m_ObjectHideFlags: 0 @@ -452,6 +469,34 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 3876120152542236901} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: MainMenu + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: UI.PauseMenu, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} - target: {fileID: 8836694927704227170, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} propertyPath: m_text value: Main Menu @@ -562,6 +607,34 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 3876120152542236901} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: Exit + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: UI.PauseMenu, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} - target: {fileID: 8836694927704227170, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} propertyPath: m_text value: Exit @@ -672,6 +745,34 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 3876120152542236901} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: Restart + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: UI.PauseMenu, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} - target: {fileID: 8836694927704227170, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} propertyPath: m_text value: Restart @@ -782,6 +883,34 @@ PrefabInstance: propertyPath: m_LocalEulerAnglesHint.z value: 0 objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.size + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Mode + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Target + value: + objectReference: {fileID: 3876120152542236901} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_CallState + value: 2 + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_MethodName + value: Resume + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_TargetAssemblyTypeName + value: UI.PauseMenu, Assembly-CSharp + objectReference: {fileID: 0} + - target: {fileID: 3806988352586753806, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} + propertyPath: m_OnClick.m_PersistentCalls.m_Calls.Array.data[0].m_Arguments.m_ObjectArgumentAssemblyTypeName + value: UnityEngine.Object, UnityEngine + objectReference: {fileID: 0} - target: {fileID: 8836694927704227170, guid: 5c04a1de900c1474c98622e4b3880522, type: 3} propertyPath: m_text value: Resume diff --git a/Assets/Scripts/Level/LevelManager.cs b/Assets/Scripts/Level/LevelManager.cs index 6b60d89..e2a4f6e 100644 --- a/Assets/Scripts/Level/LevelManager.cs +++ b/Assets/Scripts/Level/LevelManager.cs @@ -94,7 +94,7 @@ namespace Level UIManager.Instance.CloseAllCanvases(); } - private void DisableAllLevels() + public void DisableAllLevels() { Player.SetActive(false); foreach (Level level in Levels.Values) diff --git a/Assets/Scripts/Pausable/Pauser.cs b/Assets/Scripts/Pausable/Pauser.cs new file mode 100644 index 0000000..47e6f9e --- /dev/null +++ b/Assets/Scripts/Pausable/Pauser.cs @@ -0,0 +1,40 @@ +using System; +using System.Linq; +using Level; +using UI; +using UnityEngine; + +namespace Pausable +{ + public class Pauser : MonoBehaviour + { + protected Input.PlayerInput playerInput = null; + protected bool isPaused = false; + + protected void Start() + { + playerInput = new Input.PlayerInput(); + playerInput.Enable(); + playerInput.PlayerControl.Pause.performed += (context) => TogglePause(); + } + + public void TogglePause() + { + if (LevelManager.Instance.CurrentLevel == null) + return; + + isPaused = !isPaused; + + if (isPaused) + UIManager.Instance.SwitchToCanvas("Pause Menu"); + else + UIManager.Instance.CloseAllCanvases(); + + foreach (IPausable pausable in FindObjectsOfType().OfType()) + if (isPaused) + pausable.Pause(); + else + pausable.Resume(); + } + } +} diff --git a/Assets/Scripts/Pausable/Pauser.cs.meta b/Assets/Scripts/Pausable/Pauser.cs.meta new file mode 100644 index 0000000..4709321 --- /dev/null +++ b/Assets/Scripts/Pausable/Pauser.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 1705d06bcf3cabe4d9e2614e86cd0561 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/Player/PlayerController.cs b/Assets/Scripts/Player/PlayerController.cs index 81e6ade..1a4aca3 100644 --- a/Assets/Scripts/Player/PlayerController.cs +++ b/Assets/Scripts/Player/PlayerController.cs @@ -102,6 +102,9 @@ namespace Player private void FixedUpdate() { + if (IsPaused) + return; + //Took from tutorial : https://www.youtube.com/watch?v=7KiK0Aqtmzc switch (_playerRigidbody2D.velocity.y) { @@ -136,6 +139,9 @@ namespace Player private void Update() { + if (IsPaused) + return; + _isOnAir = !_playerGroundTrigger.IsCollided; RespawnCheck(); @@ -156,13 +162,13 @@ namespace Player public void Pause() { IsPaused = true; - _playerRigidbody2D.simulated = IsPaused; + _playerRigidbody2D.simulated = !IsPaused; } public void Resume() { IsPaused = false; - _playerRigidbody2D.simulated = IsPaused; + _playerRigidbody2D.simulated = !IsPaused; } // MOVE METHODS @@ -292,5 +298,9 @@ namespace Player } public void Clop() => clop.PlayClop(); + + public void OnPause(InputAction.CallbackContext context) + { + } } } diff --git a/Assets/Scripts/UI/PauseMenu.cs b/Assets/Scripts/UI/PauseMenu.cs new file mode 100644 index 0000000..1c0881e --- /dev/null +++ b/Assets/Scripts/UI/PauseMenu.cs @@ -0,0 +1,17 @@ +using Level; +using UnityEngine; + +namespace UI +{ + public class PauseMenu : MonoBehaviour + { + public void Resume() => UIManager.Instance.Pauser.TogglePause(); + public void Restart() => LevelManager.Instance.CurrentLevel.Restart(); + public void MainMenu() + { + LevelManager.Instance.DisableAllLevels(); + UIManager.Instance.SwitchToCanvas("Main Menu"); + } + public void Exit() => Application.Quit(); + } +} diff --git a/Assets/Scripts/UI/PauseMenu.cs.meta b/Assets/Scripts/UI/PauseMenu.cs.meta new file mode 100644 index 0000000..ba5d5fe --- /dev/null +++ b/Assets/Scripts/UI/PauseMenu.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 5c8db5f2b097c0f4eaa1098c35e1bc0e +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/UI/UIManager.cs b/Assets/Scripts/UI/UIManager.cs index 9740e54..dcf83e0 100644 --- a/Assets/Scripts/UI/UIManager.cs +++ b/Assets/Scripts/UI/UIManager.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using Pausable; using UnityEngine; namespace UI @@ -8,6 +9,7 @@ namespace UI private static UIManager _instance = null; public static UIManager Instance => _instance; private Dictionary canvases = null; + public Pauser Pauser { get; private set; } = null; private void Awake() { @@ -18,6 +20,8 @@ namespace UI Destroy(this); } + private void Start() => Pauser = gameObject.AddComponent(); + public void SwitchToCanvas(string canvasName) { Initialize();