From e7ea8302ad9c5da629bcf5f42f430472ca090f97 Mon Sep 17 00:00:00 2001 From: Max Dodd Date: Sat, 25 Jan 2025 17:18:01 +0100 Subject: [PATCH] Refactored clicking on dice and rooms so that logic is moved out of the game manager --- PuzzleGameProject/Assets/Scenes/Level_0.unity | 19 +++- PuzzleGameProject/Assets/Scripts/DicePair.cs | 2 + PuzzleGameProject/Assets/Scripts/Die.cs | 49 ++++++++-- .../Assets/Scripts/GameManager.cs | 93 +++++++++---------- .../Assets/Scripts/GameManager.cs.meta | 11 ++- .../Assets/Scripts/PassManager.cs | 4 +- .../Assets/Scripts/PassManager.cs.meta | 11 ++- PuzzleGameProject/Assets/Scripts/Room.cs | 28 +++++- 8 files changed, 150 insertions(+), 67 deletions(-) diff --git a/PuzzleGameProject/Assets/Scenes/Level_0.unity b/PuzzleGameProject/Assets/Scenes/Level_0.unity index d139b1e..79aaef7 100644 --- a/PuzzleGameProject/Assets/Scenes/Level_0.unity +++ b/PuzzleGameProject/Assets/Scenes/Level_0.unity @@ -1293,6 +1293,7 @@ MonoBehaviour: m_Name: m_EditorClassIdentifier: passButton: {fileID: 895359725} + gameManager: {fileID: 126339304} --- !u!114 &895359725 MonoBehaviour: m_ObjectHideFlags: 0 @@ -1332,7 +1333,7 @@ MonoBehaviour: m_PressedTrigger: Pressed m_SelectedTrigger: Selected m_DisabledTrigger: Disabled - m_Interactable: 1 + m_Interactable: 0 m_TargetGraphic: {fileID: 895359726} m_OnClick: m_PersistentCalls: @@ -1648,6 +1649,10 @@ PrefabInstance: serializedVersion: 3 m_TransformParent: {fileID: 1820284206} m_Modifications: + - target: {fileID: 1770509300873928573, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} - target: {fileID: 2435349004046080434, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} propertyPath: m_Name value: Room (1) @@ -1660,6 +1665,10 @@ PrefabInstance: propertyPath: keyType value: 1 objectReference: {fileID: 0} + - target: {fileID: 2727030095425591755, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} - target: {fileID: 2727030095425591755, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} propertyPath: isEntrance value: 1 @@ -1684,6 +1693,14 @@ PrefabInstance: propertyPath: 'unexploredAdjacentRooms.Array.data[0]' value: objectReference: {fileID: 794442986} + - target: {fileID: 4019891345885281529, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} + propertyPath: m_Enabled + value: 1 + objectReference: {fileID: 0} + - target: {fileID: 4019891345885281529, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} + propertyPath: m_IsTrigger + value: 1 + objectReference: {fileID: 0} - target: {fileID: 9187907134033443523, guid: 92d87e25cc40b3e448e62e8ba0328315, type: 3} propertyPath: m_LocalPosition.x value: -3.647156 diff --git a/PuzzleGameProject/Assets/Scripts/DicePair.cs b/PuzzleGameProject/Assets/Scripts/DicePair.cs index 75c7c9d..f5d21ec 100644 --- a/PuzzleGameProject/Assets/Scripts/DicePair.cs +++ b/PuzzleGameProject/Assets/Scripts/DicePair.cs @@ -6,6 +6,8 @@ public class DicePair public void SelectDie(Die die) { + if (ContainsDie(die)) return; + if (_pair.Item1 == null && _pair.Item2 == null) { _pair.Item1 = die; diff --git a/PuzzleGameProject/Assets/Scripts/Die.cs b/PuzzleGameProject/Assets/Scripts/Die.cs index fcd6f63..f4b4e86 100644 --- a/PuzzleGameProject/Assets/Scripts/Die.cs +++ b/PuzzleGameProject/Assets/Scripts/Die.cs @@ -15,11 +15,14 @@ public class Die : MonoBehaviour private int _result = 0; [SerializeField] private Button dieButton; // assign in the editor private Color originalColor; - public event EventHandler DieClicked; + private bool _isClickable = false; + private bool _selected = false; + public event Action DieSelected; + public event Action DieUnselected; - private void Start() - { - dieButton.onClick.AddListener(() => { DiePressed();}); + private void Start() { + GameManager.Instance.StateChanged += HandleStateChange; + dieButton.onClick.AddListener(DiePressed); originalColor = gameObject.GetComponent().color; } @@ -34,8 +37,8 @@ public class Die : MonoBehaviour return _result; } - public void ResetDie() - { + public void ResetDie() { + _selected = false; gameObject.GetComponent().color = originalColor; gameObject.GetComponent().enabled = false; } @@ -56,18 +59,46 @@ public class Die : MonoBehaviour private void DiePressed() { - DieClicked?.Invoke(this, this); + if (!_isClickable) return; + + if (_selected) + { + DieUnselected?.Invoke(this); + } + else + { + DieSelected?.Invoke(this); + } } private void DieSelectedButPairNotComplete() { + _selected = true; gameObject.GetComponent().enabled = true; } - private void DieSelectedAndPairComplete() - { + private void DieSelectedAndPairComplete() { + _selected = true; gameObject.GetComponent().enabled = false; gameObject.GetComponent().color = ColorHelper.AddColorTint(gameObject.GetComponent().color, ColorHelper.OkayGreen, 0.5f); } + + private void HandleStateChange(GameState state) { + switch (state) + { + case GameState.PickDiceOne: + case GameState.PickDiceTwo: + case GameState.PickRoomOne: + case GameState.PickRoomTwo: + _isClickable = true; + break; + case GameState.RollDice: + _isClickable = false; + break; + default: + _isClickable = false; + break; + } + } } diff --git a/PuzzleGameProject/Assets/Scripts/GameManager.cs b/PuzzleGameProject/Assets/Scripts/GameManager.cs index 520b4dd..391a7ca 100644 --- a/PuzzleGameProject/Assets/Scripts/GameManager.cs +++ b/PuzzleGameProject/Assets/Scripts/GameManager.cs @@ -3,6 +3,7 @@ using UnityEngine; using Object = UnityEngine.Object; using System.Collections.Generic; using TMPro; +using Unity.VisualScripting; public enum GameState { @@ -14,6 +15,8 @@ public enum GameState } public class GameManager : MonoBehaviour { + public static GameManager Instance { get; private set; } + [SerializeField] public GameState state; [SerializeField] private GameObject rooms; [SerializeField] private DiceRoller diceRoller; @@ -22,8 +25,16 @@ public class GameManager : MonoBehaviour private DicePair _dicePairOne = new(); private DicePair _dicePairTwo = new(); - public event EventHandler StateChanged; - + public event Action StateChanged; + + private void Awake() { + if (Instance != null && Instance != this) { + Destroy(gameObject); + return; + } + Instance = this; + } + // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { @@ -35,14 +46,18 @@ public class GameManager : MonoBehaviour } foreach (Transform diceTransform in diceRoller.dice.transform) { - diceTransform.gameObject.GetComponent().DieClicked += DieClicked; + diceTransform.gameObject.GetComponent().DieSelected += HandleDieSelected; + diceTransform.gameObject.GetComponent().DieUnselected += HandleDieUnselected; } StartNewTurn(); } private void ChangeState(GameState stateToChangeTo) { - state = stateToChangeTo; - StateChanged?.Invoke(this, state); + if (state != stateToChangeTo) + { + state = stateToChangeTo; + StateChanged?.Invoke(state); + } } private void StartNewTurn() @@ -55,11 +70,6 @@ public class GameManager : MonoBehaviour } void ValidRoomClicked(object sender, Room room) { - if (state != GameState.PickRoomOne && state != GameState.PickRoomTwo) - { - return; - } - switch (state) { case GameState.PickRoomOne when !room.TryUnlock(_dicePairOne): @@ -78,63 +88,50 @@ public class GameManager : MonoBehaviour } } - void DieClicked(object sender, Die die) - { + private void HandleDieSelected(Die die) { switch (state) { case GameState.PickDiceOne: - { - if (!_dicePairOne.ContainsDie(die)) + _dicePairOne.SelectDie(die); + if (_dicePairOne.AreBothDiceSelected()) { - _dicePairOne.SelectDie(die); - - if (_dicePairOne.AreBothDiceSelected()) - { - ChangeState(GameState.PickRoomOne); - HighLightValidRoomsWithNumber(_dicePairOne); - } + ChangeState(GameState.PickRoomOne); + HighLightValidRoomsWithNumber(_dicePairOne); } - else - { - _dicePairOne.UnselectDie(die); - } - break; - } case GameState.PickDiceTwo: - { - if (!_dicePairTwo.ContainsDie(die) && !_dicePairOne.ContainsDie(die)) + _dicePairTwo.SelectDie(die); + if (_dicePairTwo.AreBothDiceSelected()) { - _dicePairTwo.SelectDie(die); - - if (_dicePairTwo.AreBothDiceSelected()) - { - ChangeState(GameState.PickRoomTwo); - HighLightValidRoomsWithNumber(_dicePairTwo); - } + ChangeState(GameState.PickRoomTwo); + HighLightValidRoomsWithNumber(_dicePairTwo); } - else if (_dicePairTwo.ContainsDie(die)) - { - _dicePairTwo.UnselectDie(die); - } - break; - } + default: + return; + } + } + + private void HandleDieUnselected(Die die) { + switch (state) + { + case GameState.PickDiceOne: case GameState.PickRoomOne: - if (_dicePairOne.ContainsDie(die)) + if (state == GameState.PickRoomOne) { - _dicePairOne.UnselectDie(die); - UnhighLightRoomsAsOptions(); ChangeState(GameState.PickDiceOne); } + _dicePairOne.UnselectDie(die); + UnhighLightRoomsAsOptions(); break; + case GameState.PickDiceTwo: case GameState.PickRoomTwo: - if (_dicePairTwo.ContainsDie(die)) + if (state == GameState.PickRoomTwo) { - _dicePairTwo.UnselectDie(die); - UnhighLightRoomsAsOptions(); ChangeState(GameState.PickDiceTwo); } + _dicePairTwo.UnselectDie(die); + UnhighLightRoomsAsOptions(); break; } } diff --git a/PuzzleGameProject/Assets/Scripts/GameManager.cs.meta b/PuzzleGameProject/Assets/Scripts/GameManager.cs.meta index 292f5bf..8ae3f21 100644 --- a/PuzzleGameProject/Assets/Scripts/GameManager.cs.meta +++ b/PuzzleGameProject/Assets/Scripts/GameManager.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 85fe57d438ef1ec4fa8b36b9c17c11a4 \ No newline at end of file +guid: 85fe57d438ef1ec4fa8b36b9c17c11a4 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 1 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PuzzleGameProject/Assets/Scripts/PassManager.cs b/PuzzleGameProject/Assets/Scripts/PassManager.cs index 4666911..1514ed4 100644 --- a/PuzzleGameProject/Assets/Scripts/PassManager.cs +++ b/PuzzleGameProject/Assets/Scripts/PassManager.cs @@ -15,10 +15,10 @@ public class PassManager : MonoBehaviour void Start() { passButton.onClick.AddListener(OnPassClicked); - gameManager.StateChanged += OnGameStateChange; + gameManager.StateChanged += HandleStateChange; } - private void OnGameStateChange(object sender, GameState state) { + private void HandleStateChange(GameState state) { if (state == GameState.RollDice) { passButton.interactable = false; diff --git a/PuzzleGameProject/Assets/Scripts/PassManager.cs.meta b/PuzzleGameProject/Assets/Scripts/PassManager.cs.meta index cdfdff3..3b96a40 100644 --- a/PuzzleGameProject/Assets/Scripts/PassManager.cs.meta +++ b/PuzzleGameProject/Assets/Scripts/PassManager.cs.meta @@ -1,2 +1,11 @@ fileFormatVersion: 2 -guid: 95487118287b4514fb9b9fb7018ae717 \ No newline at end of file +guid: 95487118287b4514fb9b9fb7018ae717 +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/PuzzleGameProject/Assets/Scripts/Room.cs b/PuzzleGameProject/Assets/Scripts/Room.cs index b9fb2f3..120c61b 100644 --- a/PuzzleGameProject/Assets/Scripts/Room.cs +++ b/PuzzleGameProject/Assets/Scripts/Room.cs @@ -20,12 +20,12 @@ public class Room : MonoBehaviour public event EventHandler ValidRoomClicked; bool _isExplored = false; - + private bool _isClickable = true; private Color _roomNumberOriginalColor; // Start is called once before the first execution of Update after the MonoBehaviour is created void Start() { - + GameManager.Instance.StateChanged += HandleStateChange; if (isEntrance) { SetPropertiesOfEntrance(); @@ -44,6 +44,10 @@ public class Room : MonoBehaviour } } + private void OnEnable() { + + } + public void SetRoomExplored() { _isExplored = true; UnhighlightRoomAsOption(); @@ -66,12 +70,11 @@ public class Room : MonoBehaviour isEntrance = true; } - IEnumerator OnMouseDown() - { + void OnMouseDown() { + if (!_isClickable) return; if (IsValidRoomToExplore()) { OnValidRoomClicked(); } - yield return null; } protected virtual void OnValidRoomClicked() { @@ -126,4 +129,19 @@ public class Room : MonoBehaviour return false; } + + private void HandleStateChange(GameState state) { + switch (state) + { + case GameState.PickDiceOne: + case GameState.PickDiceTwo: + case GameState.RollDice: + _isClickable = false; + break; + case GameState.PickRoomTwo: + case GameState.PickRoomOne: + _isClickable = true; + break; + } + } }