From be02b4720b82bf39a58a23de61020f40f4ae93b3 Mon Sep 17 00:00:00 2001 From: _sega Date: Fri, 16 Jan 2026 14:08:36 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9F=D0=BE=D1=84=D0=B8=D0=BA=D1=81=D0=B8?= =?UTF-8?q?=D0=BB=20=D0=B1=D0=B0=D0=B3=20=D1=81=20=D0=B0=D1=80=D0=BC=D0=B8?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BA=D0=BE=D1=82=D0=BE=D0=B2.=20=D0=9D=D0=B0?= =?UTF-8?q?=D1=87=D0=B0=D0=BB=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA=D1=82=D0=BE?= =?UTF-8?q?=D1=80=D0=B8=D0=BD=D0=B3=20=D0=BC=D0=B5=D0=BD=D1=8E=20=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D0=BC=D0=B0=D1=86=D0=B8=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Fonts/NEW/NexaRegular COOL.asset | 2 +- Assets/Scenes/GameScene3D.unity | 75 ++++--- Assets/Scripts/GameFSM/MenuState.cs | 2 +- Assets/Scripts/GameFSM/ShowWinnerState.cs | 2 +- Assets/Scripts/MenuUi.cs | 194 ++++++++++++++++++ Assets/Scripts/MenuUi.cs.meta | 11 + .../Scripts/DualAvatarController.cs | 23 ++- 7 files changed, 259 insertions(+), 50 deletions(-) create mode 100644 Assets/Scripts/MenuUi.cs create mode 100644 Assets/Scripts/MenuUi.cs.meta diff --git a/Assets/Fonts/NEW/NexaRegular COOL.asset b/Assets/Fonts/NEW/NexaRegular COOL.asset index a36f1e4..27b34d2 100644 --- a/Assets/Fonts/NEW/NexaRegular COOL.asset +++ b/Assets/Fonts/NEW/NexaRegular COOL.asset @@ -11349,7 +11349,7 @@ Material: - _ClipRect: {r: -32767, g: -32767, b: 32767, a: 32767} - _EnvMatrixRotation: {r: 0, g: 0, b: 0, a: 0} - _FaceColor: {r: 1, g: 1, b: 1, a: 1} - - _GlowColor: {r: 0.6280117, g: 0, b: 1, a: 1} + - _GlowColor: {r: 0.33392012, g: 1, b: 0, a: 1} - _MaskCoord: {r: 0, g: 0, b: 32767, a: 32767} - _OutlineColor: {r: 0.554717, g: 0.554717, b: 0.554717, a: 1} - _ReflectFaceColor: {r: 0, g: 0, b: 0, a: 1} diff --git a/Assets/Scenes/GameScene3D.unity b/Assets/Scenes/GameScene3D.unity index 8e07db9..ad1659a 100644 --- a/Assets/Scenes/GameScene3D.unity +++ b/Assets/Scenes/GameScene3D.unity @@ -23715,7 +23715,7 @@ GameObject: m_Component: - component: {fileID: 916045828} - component: {fileID: 916045830} - - component: {fileID: 916045829} + - component: {fileID: 916045831} m_Layer: 5 m_Name: Main menu m_TagString: Untagged @@ -23746,36 +23746,6 @@ RectTransform: m_AnchoredPosition: {x: 0, y: 0} m_SizeDelta: {x: 0, y: 0} m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &916045829 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 916045827} - m_Enabled: 0 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 1, g: 1, b: 1, a: 1} - m_RaycastTarget: 1 - m_RaycastPadding: {x: 0, y: 0, z: 0, w: 0} - m_Maskable: 1 - m_OnCullStateChanged: - m_PersistentCalls: - m_Calls: [] - m_Sprite: {fileID: 0} - m_Type: 0 - m_PreserveAspect: 0 - m_FillCenter: 1 - m_FillMethod: 4 - m_FillAmount: 1 - m_FillClockwise: 1 - m_FillOrigin: 0 - m_UseSpriteMesh: 0 - m_PixelsPerUnitMultiplier: 1 --- !u!222 &916045830 CanvasRenderer: m_ObjectHideFlags: 0 @@ -23784,6 +23754,35 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 916045827} m_CullTransparentMesh: 1 +--- !u!114 &916045831 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 916045827} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: dfb30f3a8a5e4b14c8105d4176f4594b, type: 3} + m_Name: + m_EditorClassIdentifier: + blockMoveDuration: 0.6 + TopContainer: {fileID: 0} + TopGameplayOffset: {x: 0, y: 0} + BottomContainer: {fileID: 0} + BottomGameplayOffset: {x: 0, y: 0} + PveContainer: {fileID: 0} + PveGameplayOffset: {x: 0, y: 0} + PvpContainer: {fileID: 0} + PvpGameplayOffset: {x: 0, y: 0} + PrizesOut: {fileID: 0} + PrizesOutGameplayOffset: {x: 0, y: 0} + PrizesOutGameplayPosition: {x: 0, y: 0} + PrizesOutGameplaySizeDelta: {x: 0, y: 0} + CoinCounter: {fileID: 0} + CoinCounterGameplayPosition: {x: 0, y: 0} + Board: {fileID: 0} + BoardGameplayPosition: {x: 0, y: 0} --- !u!1 &917670191 GameObject: m_ObjectHideFlags: 0 @@ -51879,7 +51878,7 @@ MonoBehaviour: m_PersistentCalls: m_Calls: [] m_text: "\u041F\u043E\u0432\u0442\u043E\u0440\u043D\u0430\u044F \u0438\u0433\u0440\u0430:
5 - \u0419\u0423\u0413\u0420\u0418\u041A\u041E\u0412" + \u0440\u0443\u0431." m_isRightToLeft: 0 m_fontAsset: {fileID: 11400000, guid: 6eadce2d7083d384dbcb7e2f40fc590d, type: 2} m_sharedMaterial: {fileID: -8978430179854350208, guid: 6eadce2d7083d384dbcb7e2f40fc590d, type: 2} @@ -51888,8 +51887,8 @@ MonoBehaviour: m_fontMaterials: [] m_fontColor32: serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} + rgba: 4278255408 + m_fontColor: {r: 0.1898483, g: 1, b: 0, a: 1} m_enableVertexGradient: 0 m_colorMode: 3 m_fontColorGradient: @@ -51906,19 +51905,19 @@ MonoBehaviour: m_faceColor: serializedVersion: 2 rgba: 4294967295 - m_fontSize: 0.32 - m_fontSizeBase: 0.32 + m_fontSize: 0.4 + m_fontSizeBase: 0.4 m_fontWeight: 400 m_enableAutoSizing: 0 m_fontSizeMin: 0.11 m_fontSizeMax: 72 - m_fontStyle: 0 + m_fontStyle: 1 m_HorizontalAlignment: 2 m_VerticalAlignment: 512 m_textAlignment: 65535 m_characterSpacing: 0 m_wordSpacing: 0 - m_lineSpacing: 0 + m_lineSpacing: -50 m_lineSpacingMax: 0 m_paragraphSpacing: 0 m_charWidthMaxAdj: 0 diff --git a/Assets/Scripts/GameFSM/MenuState.cs b/Assets/Scripts/GameFSM/MenuState.cs index c5696ec..17736fd 100644 --- a/Assets/Scripts/GameFSM/MenuState.cs +++ b/Assets/Scripts/GameFSM/MenuState.cs @@ -100,7 +100,7 @@ public class MenuState : IState CharacterController.HideCharacter(); CharacterController.I.SetAllCharactersPrizeAvailable(true); - DualAvatarController.Instance.KillCharacters(); + DualAvatarController.Instance.HideCharacters(); DifficultyManager.instance.ResetDifficulty(); diff --git a/Assets/Scripts/GameFSM/ShowWinnerState.cs b/Assets/Scripts/GameFSM/ShowWinnerState.cs index 4f7fd6e..70f3ef3 100644 --- a/Assets/Scripts/GameFSM/ShowWinnerState.cs +++ b/Assets/Scripts/GameFSM/ShowWinnerState.cs @@ -265,7 +265,7 @@ public class ShowWinnerState : IState break; case EndOption.Menu://чистим поле и переходим в меню с параметром чтобы панельки съехались обратно CharacterController.HideCharacter(); - DualAvatarController.Instance.KillCharacters(); + DualAvatarController.Instance.HideCharacters(); GameManager.stateMachine.ChangeState(new ClearFieldState(true, CellState.Player1)); break; } diff --git a/Assets/Scripts/MenuUi.cs b/Assets/Scripts/MenuUi.cs new file mode 100644 index 0000000..b697746 --- /dev/null +++ b/Assets/Scripts/MenuUi.cs @@ -0,0 +1,194 @@ +using System.Collections; +using UnityEngine; + +public class MenuUi : MonoBehaviour +{ + [Header("Время перемещения блока")] + [SerializeField] float blockMoveDuration = 0.6f; + + + + [Header("Верхний блок")] + [SerializeField] RectTransform TopContainer; + private Vector2 TopMenuPosition; + [SerializeField] Vector2 TopGameplayOffset; + + [Header("Нижний блок")] + [SerializeField] RectTransform BottomContainer; + private Vector2 BottomMenuPosition; + [SerializeField] Vector2 BottomGameplayOffset; + + [Header("Режим на одного")] + [SerializeField] RectTransform PveContainer; + private Vector2 PveMenuPosition; + [SerializeField] Vector2 PveGameplayOffset; + + [Header("Режим на двоих")] + [SerializeField] RectTransform PvpContainer; + private Vector2 PvpMenuPosition; + [SerializeField] Vector2 PvpGameplayOffset; + + [Header("Надпись призы закончились")] + [SerializeField] RectTransform PrizesOut; + private Vector2 PrizesOutMenuPosition; + [SerializeField] Vector2 PrizesOutGameplayOffset; + [SerializeField] Vector2 PrizesOutGameplayPosition; + + private Vector2 PrizesOutMenuSizeDelta; + [SerializeField] Vector2 PrizesOutGameplaySizeDelta; + + [Header("Счетчик монет")] + [SerializeField] Transform CoinCounter; + private Vector2 CoinCounterMenuPosition; + [SerializeField] Vector2 CoinCounterGameplayPosition; + + + [Header("Доска")] + [SerializeField] Transform Board; + private Vector2 BoardMenuPosition; + [SerializeField] Vector2 BoardGameplayPosition; + + + private bool _cached = false; + bool processing = false; + + bool Menu; + bool Gameplay; + + + + void InitializeIfNeed() + { + if (!_cached) CacheStartParametrs(); + } + void CacheStartParametrs() + { + //Кэшируем стартовые позиции и размеры + TopMenuPosition = TopContainer.anchoredPosition; + BottomMenuPosition = BottomContainer.anchoredPosition; + PveMenuPosition = PveContainer.anchoredPosition; + PvpMenuPosition = PvpContainer.anchoredPosition; + + PrizesOutMenuPosition = PrizesOut.anchoredPosition; + PrizesOutMenuSizeDelta = PrizesOut.sizeDelta; + + CoinCounterMenuPosition = CoinCounter.localPosition; + BoardMenuPosition = Board.localPosition; + + + _cached = true; + } + + public void OpenMenu() + { + InitializeIfNeed(); + + } + + public void CloseMenu() + { + InitializeIfNeed(); + + } + + + IEnumerator OpenGameplayAnim() + { + float t; + + //ШАГ 1. ПРЯЧЕМ МЕНЮ + t = 0; + while (t < 1) + { + t += Time.deltaTime * 2; + t = Mathf.Clamp01(t); + + + TopContainer.anchoredPosition = Vector2.Lerp(TopMenuPosition, TopMenuPosition + TopGameplayOffset, t); + + PveContainer.anchoredPosition = Vector2.Lerp(PveMenuPosition, PveMenuPosition + PveGameplayOffset, t); + PvpContainer.anchoredPosition = Vector2.Lerp(PvpMenuPosition, PvpMenuPosition + PvpGameplayOffset, t); + + BottomContainer.anchoredPosition = Vector2.Lerp(BottomMenuPosition, BottomMenuPosition + BottomGameplayOffset, t); + + PrizesOut.anchoredPosition = Vector2.Lerp(PrizesOutMenuPosition, PrizesOutMenuPosition + PrizesOutGameplayOffset, t); + PrizesOut.sizeDelta = Vector2.Lerp(PrizesOutMenuSizeDelta, PrizesOutGameplaySizeDelta, t); + + CoinCounter.localPosition = Vector2.Lerp(CoinCounterMenuPosition, CoinCounterGameplayPosition, t); + + + yield return null; + } + + //ШАГ 1. Показываем доску + t = 0; + while (t < 1) + { + t += Time.deltaTime * 2;//скорость надо высчитывать + t = Mathf.Clamp01(t); + + Board.localPosition = Vector2.Lerp(BoardMenuPosition, BoardGameplayPosition, t); + PrizesOut.anchoredPosition = Vector3.Lerp(PrizesOutMenuPosition + PrizesOutGameplayOffset, PrizesOutGameplayPosition, t); + + yield return null; + } + + } + IEnumerator OpenMenuAnim() + { + //ШАГ 1. УБРАТЬ ДОСКУ + float t = 0; + while (t < 1) + { + t += Time.deltaTime * 2;//скорости править + t = Mathf.Clamp01(t); + + Board.localPosition = Vector2.Lerp(BoardGameplayPosition, BoardMenuPosition, t); + PrizesOut.anchoredPosition = Vector2.Lerp(PrizesOutGameplayPosition, PrizesOutMenuPosition + PrizesOutGameplayOffset, t); + yield return null; + } + + + //ШАГ 2. ПОКАЗАТЬ МЕНЮ + t = 0; + while (t < 1) + { + t += Time.deltaTime * 2; + t = Mathf.Clamp01(t); + + TopContainer.anchoredPosition = Vector2.Lerp(TopMenuPosition + TopGameplayOffset, TopMenuPosition, t); + + //перемещение кнопок + PveContainer.anchoredPosition = Vector2.Lerp(PveMenuPosition + PvpGameplayOffset, PveMenuPosition, t); + PvpContainer.anchoredPosition = Vector2.Lerp(PvpMenuPosition + PvpGameplayOffset, PvpMenuPosition, t); + + PrizesOut.anchoredPosition = Vector2.Lerp(PrizesOutMenuPosition+PrizesOutGameplayOffset, PrizesOutMenuPosition, t); + + + + //монетка + //float startDistance = Vector3.Distance(coinPanel.position, sCoin); + //while (Vector3.Distance(coinPanel.position, sCoin) > 0.01f) + //{ + // float coinspeed = startDistance * Time.deltaTime * 2; + // coinPanel.localPosition = Vector3.MoveTowards(coinPanel.localPosition, sCoin, coinspeed); + // yield return null; + //} + //coinPanel.localPosition = sCoin; + //label2.localPosition = Vector3.Lerp(sLabel2, eLabel2, t); + + //SmallPrizesOut.sizeDelta = Vector2.Lerp(sSmallPrizesOutSize, eSmallPrizesOutSize, t); + + yield return null; + } + + //animationEnded = true; + + //gm.botScale.gameObject.SetActive(false); + //gm.Player1Scale.gameObject.SetActive(false); + //gm.Player2Scale.gameObject.SetActive(false); + + } + + +} diff --git a/Assets/Scripts/MenuUi.cs.meta b/Assets/Scripts/MenuUi.cs.meta new file mode 100644 index 0000000..d68229b --- /dev/null +++ b/Assets/Scripts/MenuUi.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: dfb30f3a8a5e4b14c8105d4176f4594b +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Assets/Scripts/PVP Characters/Scripts/DualAvatarController.cs b/Assets/Scripts/PVP Characters/Scripts/DualAvatarController.cs index f41727f..0b8c22b 100644 --- a/Assets/Scripts/PVP Characters/Scripts/DualAvatarController.cs +++ b/Assets/Scripts/PVP Characters/Scripts/DualAvatarController.cs @@ -38,6 +38,14 @@ public class DualAvatarController : MonoBehaviour public void Initialize() { Instance = this; + + if (!spawned) + { + avatars[PLAYER1] = CreateAvatar(characterPrefabs[0], AvatarsParent, PLAYER1); + avatars[PLAYER2] = CreateAvatar(characterPrefabs[1], AvatarsParent, PLAYER2); + spawned = true; + } + bus = AvatarEventBus.Instance; BindEvents(); } @@ -47,25 +55,22 @@ public class DualAvatarController : MonoBehaviour public void ShowCharacters() //заспвавнить и показать { - if (spawned) return; + if (characterPrefabs != null && characterPrefabs.Count < 2) Debug.LogError("Меньше 2 персонажей в списке аватаров."); //Тут возможно будет рандомизация персонажей - avatars[PLAYER1] = CreateAvatar(characterPrefabs[0], AvatarsParent, PLAYER1); - avatars[PLAYER2] = CreateAvatar(characterPrefabs[1], AvatarsParent, PLAYER2); + StartCoroutine(MoveLocal(avatars[PLAYER1], GetShownPosition(PLAYER1), CharacterMovementSpeed, OnComplete: AvatarAppeared)); StartCoroutine(MoveLocal(avatars[PLAYER2], GetShownPosition(PLAYER2), CharacterMovementSpeed, OnComplete: AvatarAppeared)); - spawned = true; } - public void KillCharacters() + public void HideCharacters() { - if (!spawned) return; - StartCoroutine(MoveLocal(avatars[PLAYER1], GetHiddenPosition(PLAYER1), CharacterMovementSpeed, OnComplete: () => Destroy(avatars[PLAYER1].gameObject))); - StartCoroutine(MoveLocal(avatars[PLAYER2], GetHiddenPosition(PLAYER2), CharacterMovementSpeed, OnComplete: () => Destroy(avatars[PLAYER1].gameObject))); - spawned = false; + StopAllCoroutines(); + StartCoroutine(MoveLocal(avatars[PLAYER1], GetHiddenPosition(PLAYER1), CharacterMovementSpeed, OnComplete: () => print("hided"))); + StartCoroutine(MoveLocal(avatars[PLAYER2], GetHiddenPosition(PLAYER2), CharacterMovementSpeed, OnComplete: () => print("hided"))); } Avatar CreateAvatar(GameObject prefab, Transform parent, CellState team)