From 2a526be85fc2f51a403962bd7da127e3ff4e1098 Mon Sep 17 00:00:00 2001 From: sega Date: Tue, 25 Aug 2026 14:12:09 +0300 Subject: [PATCH] Improve prize configurator navigation and settings input repeat --- Assets/Scenes/GameScene3D.unity | 17 ++++++- .../PrizeSystem/CharacterPrizeConfigurator.cs | 37 ++++++++++++-- .../Settings/Controls/SettingFunctions.cs | 21 +++++++- Assets/Scripts/Settings/SettingsScreen.cs | 51 +++++++++++++++++-- 4 files changed, 114 insertions(+), 12 deletions(-) diff --git a/Assets/Scenes/GameScene3D.unity b/Assets/Scenes/GameScene3D.unity index 9538e73..bd00ad7 100644 --- a/Assets/Scenes/GameScene3D.unity +++ b/Assets/Scenes/GameScene3D.unity @@ -1841,6 +1841,17 @@ RectTransform: m_CorrespondingSourceObject: {fileID: 4098477273951441249, guid: dcef42dd0beb95f4e9b230192966f091, type: 3} m_PrefabInstance: {fileID: 3117238291046753179} m_PrefabAsset: {fileID: 0} +--- !u!114 &141381090 stripped +MonoBehaviour: + m_CorrespondingSourceObject: {fileID: 7716801100805455212, guid: dcef42dd0beb95f4e9b230192966f091, type: 3} + m_PrefabInstance: {fileID: 3117238291046753179} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 141381088} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: 1bf3043857e54fd41b0d39086cd9c3be, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::CharacterPrizeConfigurator --- !u!1 &143058077 GameObject: m_ObjectHideFlags: 0 @@ -18836,7 +18847,7 @@ GameObject: m_Icon: {fileID: 0} m_NavMeshLayer: 0 m_StaticEditorFlags: 0 - m_IsActive: 1 + m_IsActive: 0 --- !u!224 &1967587903 RectTransform: m_ObjectHideFlags: 0 @@ -18908,6 +18919,7 @@ MonoBehaviour: switchAxis: 1 interactAxis: 0 intractButton: 4 + _switchRepeatInterval: 0.2 _rootRect: {fileID: 1967587903} Content: {fileID: 1843853773} _scrollBar: {fileID: 1450075491} @@ -18926,6 +18938,7 @@ MonoBehaviour: _textInputPrefab: {fileID: 5157268599116440676, guid: dc7d2a24b5df54040b311e8c0c43261e, type: 3} _canvas: {fileID: 1967587903} _settingsScreen: {fileID: 1967587905} + _prizesConfigurator: {fileID: 141381090} --- !u!114 &1967587907 MonoBehaviour: m_ObjectHideFlags: 0 @@ -22504,7 +22517,7 @@ PrefabInstance: objectReference: {fileID: 0} - target: {fileID: 5423109734219761443, guid: dcef42dd0beb95f4e9b230192966f091, type: 3} propertyPath: m_IsActive - value: 1 + value: 0 objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] diff --git a/Assets/Scripts/PrizeSystem/CharacterPrizeConfigurator.cs b/Assets/Scripts/PrizeSystem/CharacterPrizeConfigurator.cs index 4d53d28..6018b05 100644 --- a/Assets/Scripts/PrizeSystem/CharacterPrizeConfigurator.cs +++ b/Assets/Scripts/PrizeSystem/CharacterPrizeConfigurator.cs @@ -3,13 +3,17 @@ using PrizeSystem; using System; using UnityEngine; -public class CharacterPrizeConfigurator : MonoBehaviour +public class CharacterPrizeConfigurator : MonoBehaviour, IControlable { public event Action OnClosed; [SerializeField] private CharacterSelectionPanel _characterSelection; [SerializeField] private PrizesSelector _prizesSelector; + private IControlable _activePanel; + + public bool ControlsEnabled { get; set; } = true; + private void Awake() { _characterSelection.OnCharacterSelected += OpenPrizeSelector; @@ -34,11 +38,29 @@ public class CharacterPrizeConfigurator : MonoBehaviour _prizesSelector.OnConfirmed -= OpenCharacterSelection; } + public void Open() + { + if (gameObject.activeSelf) + { + OpenCharacterSelection(); + return; + } + + gameObject.SetActive(true); + } + + public void UpdateControls() + { + if (_activePanel != null && _activePanel.ControlsEnabled) + _activePanel.UpdateControls(); + } + private void OpenPrizeSelector(Character character) { _characterSelection.gameObject.SetActive(false); _prizesSelector.Open(character); - ControlsPerformer.Instance.SetControlable(_prizesSelector); + _activePanel = _prizesSelector; + SetSelfAsControlable(); } private void OpenCharacterSelection() @@ -46,9 +68,8 @@ public class CharacterPrizeConfigurator : MonoBehaviour _prizesSelector.gameObject.SetActive(false); _characterSelection.gameObject.SetActive(true); _characterSelection.Open(); - - if (ControlsPerformer.Instance != null) - ControlsPerformer.Instance.SetControlable(_characterSelection); + _activePanel = _characterSelection; + SetSelfAsControlable(); } private void SaveAndClose() @@ -62,4 +83,10 @@ public class CharacterPrizeConfigurator : MonoBehaviour gameObject.SetActive(false); OnClosed?.Invoke(); } + + private void SetSelfAsControlable() + { + if (ControlsPerformer.Instance != null) + ControlsPerformer.Instance.SetControlable(this); + } } diff --git a/Assets/Scripts/Settings/Controls/SettingFunctions.cs b/Assets/Scripts/Settings/Controls/SettingFunctions.cs index 5325942..97edc88 100644 --- a/Assets/Scripts/Settings/Controls/SettingFunctions.cs +++ b/Assets/Scripts/Settings/Controls/SettingFunctions.cs @@ -6,7 +6,17 @@ public class SettingFunctions : MonoBehaviour [SerializeField] private TextInput _textInputPrefab; [SerializeField] private RectTransform _canvas; [SerializeField] private SettingsScreen _settingsScreen; + [SerializeField] private CharacterPrizeConfigurator _prizesConfigurator; + private void Awake() + { + _prizesConfigurator.OnClosed += ReturnToSettings; + } + + private void OnDestroy() + { + _prizesConfigurator.OnClosed -= ReturnToSettings; + } public void ResetBalance() => PaymentSystem.ResetBalance(); @@ -14,7 +24,8 @@ public class SettingFunctions : MonoBehaviour public void ConfigurePrizes() { - + _prizesConfigurator.Open(); + ControlsPerformer.Instance.SetControlable(_prizesConfigurator); } public void EnterNumberAdmin() @@ -98,4 +109,10 @@ public class SettingFunctions : MonoBehaviour { } -} \ No newline at end of file + + private void ReturnToSettings() + { + _settingsScreen.BlockControls(); + ControlsPerformer.Instance.SetControlable(_settingsScreen); + } +} diff --git a/Assets/Scripts/Settings/SettingsScreen.cs b/Assets/Scripts/Settings/SettingsScreen.cs index c5e7635..651fe79 100644 --- a/Assets/Scripts/Settings/SettingsScreen.cs +++ b/Assets/Scripts/Settings/SettingsScreen.cs @@ -22,6 +22,7 @@ public class SettingsScreen : MonoBehaviour, IControlable [SerializeField] private Axis switchAxis = Axis.Vertical; [SerializeField] private Axis interactAxis = Axis.Horizontal; [SerializeField] private PlayerAction intractButton = PlayerAction.action; + [SerializeField] private float _switchRepeatInterval = 0.2f; [SerializeField] private RectTransform _rootRect; [SerializeField] private RectTransform Content; @@ -30,6 +31,8 @@ public class SettingsScreen : MonoBehaviour, IControlable private HoldTimer _exitTimer; public bool ControlsEnabled { get; set; } = false; private bool controlsBlocked = false; + private int _heldSwitchDirection; + private float _nextSwitchTime; private void Start() { @@ -41,6 +44,7 @@ public class SettingsScreen : MonoBehaviour, IControlable private void OnDisable() { _exitTimer.Reset(); + ResetSwitchRepeat(); } public void UpdateControls() @@ -49,10 +53,12 @@ public class SettingsScreen : MonoBehaviour, IControlable controlsBlocked = false; if (controlsBlocked) + { + ResetSwitchRepeat(); return; + } - Vector2Int switchAxes = In.GetAxis(JoystickSide.Both, InteractMode.Discrete); - int switchDirection = -GetAxisValue(switchAxes, switchAxis); + int switchDirection = GetSwitchDirection(); if (switchDirection != 0) SwitchSetting(switchDirection); @@ -84,7 +90,11 @@ public class SettingsScreen : MonoBehaviour, IControlable ControlsEnabled = true; } - public void BlockControls() => controlsBlocked = true; + public void BlockControls() + { + controlsBlocked = true; + ResetSwitchRepeat(); + } private void SwitchSetting(int switchDirection) { @@ -95,6 +105,41 @@ public class SettingsScreen : MonoBehaviour, IControlable UpdatePointer(); } + private int GetSwitchDirection() + { + Vector2Int switchAxes = In.GetAxis(JoystickSide.Both, InteractMode.Continious); + int switchDirection = -GetAxisValue(switchAxes, switchAxis); + return UpdateSwitchRepeat(switchDirection, Time.unscaledTime); + } + + private int UpdateSwitchRepeat(int switchDirection, float currentTime) + { + if (switchDirection == 0) + { + ResetSwitchRepeat(); + return 0; + } + + if (switchDirection != _heldSwitchDirection) + { + _heldSwitchDirection = switchDirection; + _nextSwitchTime = currentTime + _switchRepeatInterval; + return switchDirection; + } + + if (currentTime < _nextSwitchTime) + return 0; + + _nextSwitchTime = currentTime + _switchRepeatInterval; + return switchDirection; + } + + private void ResetSwitchRepeat() + { + _heldSwitchDirection = 0; + _nextSwitchTime = 0f; + } + private void UpdatePointer() {