diff --git a/Assets/_Project/Art/UI/GameOverScreen.meta b/Assets/_Project/Art/UI/GameOverScreen.meta new file mode 100644 index 0000000..ab700c5 --- /dev/null +++ b/Assets/_Project/Art/UI/GameOverScreen.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 366ce872bdd59184ba04a24fd12b4677 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Art/UI/GameOverScreen/RestartButtonUI.png b/Assets/_Project/Art/UI/GameOverScreen/RestartButtonUI.png new file mode 100644 index 0000000..6f22277 Binary files /dev/null and b/Assets/_Project/Art/UI/GameOverScreen/RestartButtonUI.png differ diff --git a/Assets/_Project/Art/UI/GameOverScreen/RestartButtonUI.png.meta b/Assets/_Project/Art/UI/GameOverScreen/RestartButtonUI.png.meta new file mode 100644 index 0000000..2784b50 --- /dev/null +++ b/Assets/_Project/Art/UI/GameOverScreen/RestartButtonUI.png.meta @@ -0,0 +1,127 @@ +fileFormatVersion: 2 +guid: b2831b7f6899ee944a13fa562e3b84df +TextureImporter: + internalIDToNameTable: [] + externalObjects: {} + serializedVersion: 13 + mipmaps: + mipMapMode: 0 + enableMipMap: 0 + sRGBTexture: 1 + linearTexture: 0 + fadeOut: 0 + borderMipMap: 0 + mipMapsPreserveCoverage: 0 + alphaTestReferenceValue: 0.5 + mipMapFadeDistanceStart: 1 + mipMapFadeDistanceEnd: 3 + bumpmap: + convertToNormalMap: 0 + externalNormalMap: 0 + heightScale: 0.25 + normalMapFilter: 0 + flipGreenChannel: 0 + isReadable: 0 + streamingMipmaps: 0 + streamingMipmapsPriority: 0 + vTOnly: 0 + ignoreMipmapLimit: 0 + grayScaleToAlpha: 0 + generateCubemap: 6 + cubemapConvolution: 0 + seamlessCubemap: 0 + textureFormat: 1 + maxTextureSize: 2048 + textureSettings: + serializedVersion: 2 + filterMode: 0 + aniso: 1 + mipBias: 0 + wrapU: 1 + wrapV: 1 + wrapW: 1 + nPOTScale: 0 + lightmap: 0 + compressionQuality: 50 + spriteMode: 1 + spriteExtrude: 1 + spriteMeshType: 1 + alignment: 0 + spritePivot: {x: 0.5, y: 0.5} + spritePixelsToUnits: 32 + spriteBorder: {x: 0, y: 0, z: 0, w: 0} + spriteGenerateFallbackPhysicsShape: 1 + alphaUsage: 1 + alphaIsTransparency: 1 + spriteTessellationDetail: -1 + textureType: 8 + textureShape: 1 + singleChannelComponent: 0 + flipbookRows: 1 + flipbookColumns: 1 + maxTextureSizeSet: 0 + compressionQualitySet: 0 + textureFormatSet: 0 + ignorePngGamma: 0 + applyGammaDecoding: 0 + swizzle: 50462976 + cookieLightType: 0 + platformSettings: + - serializedVersion: 3 + buildTarget: DefaultTexturePlatform + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 0 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Standalone + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + - serializedVersion: 3 + buildTarget: Android + maxTextureSize: 2048 + resizeAlgorithm: 0 + textureFormat: -1 + textureCompression: 1 + compressionQuality: 50 + crunchedCompression: 0 + allowsAlphaSplitting: 0 + overridden: 0 + ignorePlatformSupport: 0 + androidETC2FallbackOverride: 0 + forceMaximumCompressionQuality_BC6H_BC7: 0 + spriteSheet: + serializedVersion: 2 + sprites: [] + outline: [] + physicsShape: [] + bones: [] + spriteID: 5e97eb03825dee720800000000000000 + internalID: 0 + vertices: [] + indices: + edges: [] + weights: [] + secondaryTextures: [] + nameFileIdTable: {} + mipmapLimitGroupName: + pSDRemoveMatte: 0 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/_Project/Scenes/MainPrototype.unity b/Assets/_Project/Scenes/MainPrototype.unity index cd76348..66ee5cd 100644 --- a/Assets/_Project/Scenes/MainPrototype.unity +++ b/Assets/_Project/Scenes/MainPrototype.unity @@ -2327,6 +2327,7 @@ GameObject: - component: {fileID: 904751786} - component: {fileID: 904751788} - component: {fileID: 904751787} + - component: {fileID: 904751789} m_Layer: 5 m_Name: GameOver m_TagString: Untagged @@ -2379,7 +2380,7 @@ MonoBehaviour: - Press Space - Restart' + Tap Restart (Press Space)' m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -2393,8 +2394,8 @@ MonoBehaviour: m_enableVertexGradient: 1 m_colorMode: 3 m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} + topLeft: {r: 0, g: 0, b: 0, a: 0.87058824} + topRight: {r: 0.8113208, g: 0.16456035, b: 0.16456035, a: 1} bottomLeft: {r: 0.4528302, g: 0.41651833, b: 0.41651833, a: 1} bottomRight: {r: 0.5188679, g: 0.5017355, b: 0.5017355, a: 1} m_fontColorGradientPreset: {fileID: 0} @@ -2456,6 +2457,22 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 904751785} m_CullTransparentMesh: 1 +--- !u!114 &904751789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904751785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cf6ef566c2404d7caf4f7f8838fd3e9d, type: 3} + m_Name: + m_EditorClassIdentifier: + restartButton: {fileID: 0} + restartButtonSprite: {fileID: 21300000, guid: b2831b7f6899ee944a13fa562e3b84df, type: 3} + restartButtonText: Rise Again + restartButtonTextColor: {r: 0.84, g: 0.95, b: 1, a: 1} --- !u!1 &977390122 GameObject: m_ObjectHideFlags: 0 @@ -3787,8 +3804,8 @@ MonoBehaviour: m_Enabled: 1 m_EditorHideFlags: 0 m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: + m_Name: + m_EditorClassIdentifier: m_Material: {fileID: 0} m_Color: {r: 0.8018868, g: 0.22316661, b: 0.22316661, a: 0} m_RaycastTarget: 0 @@ -4694,6 +4711,8 @@ MonoBehaviour: movementZone: {fileID: 3001000004} aimAttackZone: {fileID: 3002000004} repairButton: {fileID: 3003000004} + playerInput: {fileID: 0} + baseAttackRate: 1.5 --- !u!114 &3000000003 MonoBehaviour: m_ObjectHideFlags: 0 @@ -4797,6 +4816,7 @@ MonoBehaviour: m_Script: {fileID: 11500000, guid: d7f83b5a6c1a8934d915b999993b5326, type: 3} m_Name: m_EditorClassIdentifier: + maxRadius: 75 --- !u!1 &3002000000 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/_Project/Scenes/SampleScene.unity b/Assets/_Project/Scenes/SampleScene.unity index 436999a..81bb9f9 100644 --- a/Assets/_Project/Scenes/SampleScene.unity +++ b/Assets/_Project/Scenes/SampleScene.unity @@ -1259,6 +1259,7 @@ GameObject: - component: {fileID: 904751786} - component: {fileID: 904751788} - component: {fileID: 904751787} + - component: {fileID: 904751789} m_Layer: 5 m_Name: GameOver m_TagString: Untagged @@ -1311,7 +1312,7 @@ MonoBehaviour: - Press Space - Restart' + Tap Restart (Space also works)' m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} m_sharedMaterial: {fileID: 2180264, guid: 8f586378b4e144a9851e7b34d9b748ee, type: 2} @@ -1388,6 +1389,22 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 904751785} m_CullTransparentMesh: 1 +--- !u!114 &904751789 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 904751785} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: cf6ef566c2404d7caf4f7f8838fd3e9d, type: 3} + m_Name: + m_EditorClassIdentifier: + restartButton: {fileID: 0} + restartButtonSprite: {fileID: 0} + restartButtonText: Rise Again + restartButtonTextColor: {r: 0.84, g: 0.95, b: 1, a: 1} --- !u!1 &969171467 GameObject: m_ObjectHideFlags: 0 @@ -3207,3 +3224,4 @@ SceneRoots: - {fileID: 833814061} - {fileID: 1027969717} - {fileID: 751719342} + diff --git a/Assets/_Project/Scripts/_Project.Gameplay/Managers/GameManager.cs b/Assets/_Project/Scripts/_Project.Gameplay/Managers/GameManager.cs index 0610749..ca2eb45 100644 --- a/Assets/_Project/Scripts/_Project.Gameplay/Managers/GameManager.cs +++ b/Assets/_Project/Scripts/_Project.Gameplay/Managers/GameManager.cs @@ -1,5 +1,9 @@ using UnityEngine; using UnityEngine.SceneManagement; +using Castlebound.Gameplay.UI; +#if ENABLE_INPUT_SYSTEM +using UnityEngine.InputSystem; +#endif using Random = System.Random; public class GameManager : MonoBehaviour @@ -10,31 +14,72 @@ public class GameManager : MonoBehaviour public Random LootRng { get; private set; } bool gameOver; + GameOverScreenController gameOverScreenController; void Awake() { if (I && I != this) { Destroy(gameObject); return; } I = this; LootRng = new Random(); + ResolveGameOverScreenController(); } public void OnPlayerDied() { if (gameOver) return; gameOver = true; - if (gameOverUI) gameOverUI.SetActive(true); + + if (gameOverScreenController != null) + { + gameOverScreenController.Show(); + } + else if (gameOverUI) + { + gameOverUI.SetActive(true); + } + // Freeze time if you like: // Time.timeScale = 0f; } + public void RequestRestart() + { + // Time.timeScale = 1f; + SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); + } + void Update() { if (!gameOver) return; - // Space = restart scene - if (Input.GetKeyDown(KeyCode.Space)) + + if (WasRestartKeyPressed()) { - // Time.timeScale = 1f; - SceneManager.LoadScene(SceneManager.GetActiveScene().buildIndex); + RequestRestart(); } } + + bool WasRestartKeyPressed() + { +#if ENABLE_INPUT_SYSTEM + if (Keyboard.current != null && Keyboard.current.spaceKey.wasPressedThisFrame) + return true; +#endif +#if ENABLE_LEGACY_INPUT_MANAGER + if (Input.GetKeyDown(KeyCode.Space)) + return true; +#endif + return false; + } + + void ResolveGameOverScreenController() + { + if (gameOverUI == null) + return; + + gameOverScreenController = gameOverUI.GetComponent(); + if (gameOverScreenController == null) + gameOverScreenController = gameOverUI.AddComponent(); + + gameOverScreenController.SetRestartHandler(RequestRestart); + } } diff --git a/Assets/_Project/Scripts/_Project.Gameplay/UI/GameOverScreenController.cs b/Assets/_Project/Scripts/_Project.Gameplay/UI/GameOverScreenController.cs new file mode 100644 index 0000000..8775ffe --- /dev/null +++ b/Assets/_Project/Scripts/_Project.Gameplay/UI/GameOverScreenController.cs @@ -0,0 +1,123 @@ +using TMPro; +using UnityEngine; +using UnityEngine.Events; +using UnityEngine.UI; + +namespace Castlebound.Gameplay.UI +{ + public class GameOverScreenController : MonoBehaviour + { + [SerializeField] private Button restartButton; + [SerializeField] private Sprite restartButtonSprite; + [SerializeField] private string restartButtonText = "Rise Again"; + [SerializeField] private Color restartButtonTextColor = new Color(0.84f, 0.95f, 1f, 1f); + + private UnityAction restartHandler; + + private void OnEnable() + { + EnsureRestartButton(); + ApplyVisuals(); + BindRestartHandler(); + } + + private void OnDisable() + { + if (restartButton != null && restartHandler != null) + { + restartButton.onClick.RemoveListener(restartHandler); + } + } + + public void SetRestartHandler(UnityAction handler) + { + if (restartButton != null && restartHandler != null) + { + restartButton.onClick.RemoveListener(restartHandler); + } + + restartHandler = handler; + EnsureRestartButton(); + ApplyVisuals(); + BindRestartHandler(); + } + + public void Show() + { + gameObject.SetActive(true); + } + + private void BindRestartHandler() + { + if (restartButton == null || restartHandler == null) + { + return; + } + + restartButton.onClick.RemoveListener(restartHandler); + restartButton.onClick.AddListener(restartHandler); + } + + private void EnsureRestartButton() + { + if (restartButton == null) + { + restartButton = GetComponentInChildren