Рефакторинг обработчика конца хода. Оптимизация сериализатора призов(добавлено кэширование)

This commit is contained in:
se_ga 2026-03-10 14:49:41 +03:00
parent 042c82371b
commit 27204baca4
7 changed files with 164 additions and 142 deletions

View File

@ -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: 1, g: 0.0031421185, b: 0, a: 1}
- _GlowColor: {r: 1, g: 0.8115379, 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}

View File

@ -3321,7 +3321,7 @@ GameObject:
m_Icon: {fileID: 0}
m_NavMeshLayer: 0
m_StaticEditorFlags: 0
m_IsActive: 1
m_IsActive: 0
--- !u!224 &141381089
RectTransform:
m_ObjectHideFlags: 0
@ -6687,9 +6687,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 1065644474}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 170, y: -50.014133}
m_SizeDelta: {x: 160, y: 50}
m_Pivot: {x: 0, y: 0.5}
--- !u!114 &325463673
@ -11993,9 +11993,9 @@ RectTransform:
- {fileID: 1706253902}
m_Father: {fileID: 2024105139}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 955.625, y: -52.5}
m_SizeDelta: {x: 260, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &534572201
@ -12668,9 +12668,9 @@ RectTransform:
- {fileID: 693044069}
m_Father: {fileID: 2024105139}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 639.375, y: -52.5}
m_SizeDelta: {x: 260, y: 100.02827}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &558055375
@ -14422,9 +14422,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 2009796845}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 188.15, y: -50}
m_SizeDelta: {x: 228.7, y: 50}
m_Pivot: {x: 0, y: 0.5}
--- !u!114 &621955042
@ -16570,9 +16570,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 558055374}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 100, y: -50.014133}
m_SizeDelta: {x: 160.3, y: 50}
m_Pivot: {x: 0, y: 0.5}
--- !u!114 &693044070
@ -26930,9 +26930,9 @@ RectTransform:
- {fileID: 488531826}
m_Father: {fileID: 1065644474}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 85, y: -50.014133}
m_SizeDelta: {x: 170, y: 100.02827}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!1 &1027759316
@ -32770,9 +32770,9 @@ RectTransform:
- {fileID: 325463672}
m_Father: {fileID: 2024105139}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 1306.875, y: -52.5}
m_SizeDelta: {x: 330, y: 100.02827}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1065644475
@ -34793,9 +34793,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 558055374}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 50, y: -50.014133}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1149227638
@ -35443,9 +35443,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 534572200}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: -90}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 50, y: -50}
m_SizeDelta: {x: 100, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &1191498012
@ -51484,9 +51484,9 @@ RectTransform:
m_Children: []
m_Father: {fileID: 534572200}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 100, y: -50}
m_SizeDelta: {x: 160, y: 50}
m_Pivot: {x: 0, y: 0.5}
--- !u!114 &1706253903
@ -53558,9 +53558,9 @@ RectTransform:
- {fileID: 1956066310}
m_Father: {fileID: 2009796845}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 90, y: -50}
m_SizeDelta: {x: 180, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!4 &1811884474 stripped
@ -57400,9 +57400,9 @@ RectTransform:
- {fileID: 621955041}
m_Father: {fileID: 2024105139}
m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0}
m_AnchorMin: {x: 0, y: 0}
m_AnchorMax: {x: 0, y: 0}
m_AnchoredPosition: {x: 0, y: 0}
m_AnchorMin: {x: 0, y: 1}
m_AnchorMax: {x: 0, y: 1}
m_AnchoredPosition: {x: 240.625, y: -52.5}
m_SizeDelta: {x: 425, y: 100}
m_Pivot: {x: 0.5, y: 0.5}
--- !u!114 &2009796846
@ -57900,7 +57900,6 @@ GameObject:
- component: {fileID: 2024105141}
- component: {fileID: 2024105140}
- component: {fileID: 2024105142}
- component: {fileID: 2024105143}
m_Layer: 5
m_Name: Instruction panel
m_TagString: Untagged
@ -57995,18 +57994,6 @@ MonoBehaviour:
m_ChildScaleWidth: 0
m_ChildScaleHeight: 0
m_ReverseArrangement: 0
--- !u!114 &2024105143
MonoBehaviour:
m_ObjectHideFlags: 0
m_CorrespondingSourceObject: {fileID: 0}
m_PrefabInstance: {fileID: 0}
m_PrefabAsset: {fileID: 0}
m_GameObject: {fileID: 2024105138}
m_Enabled: 1
m_EditorHideFlags: 0
m_Script: {fileID: 11500000, guid: b627bd469bca718458ae17426c80d9af, type: 3}
m_Name:
m_EditorClassIdentifier:
--- !u!1 &2043408353
GameObject:
m_ObjectHideFlags: 0

View File

@ -1,7 +1,7 @@
using TMPro;
using UnityEngine;
public class PrizeState : IState
public class VictoryState : IState
{
VictoryScale scale;
GameManager gameManager;
@ -50,12 +50,9 @@ public class PrizeState : IState
else
{
//победили ботов
givePrize = true;
scale = gameManager.botScale;
gameManager.winPanel.ShowWin(CellState.Empty);
//это в меню переход. Надо в показ видео и лидерборд
//nextState = new ClearFieldState(true, CellState.Player1);
@ -66,7 +63,6 @@ public class PrizeState : IState
//вкл анимацию приза
scale.SetWinState();
scale.winParticles.Play();
}
public void exit()

View File

@ -598,6 +598,20 @@ public class GameManager : MonoBehaviour
}
}
public void IncreaseScoreAndScaleOfPlayer(CellState player)
{
if (player == CellState.Player1)
{
player1score += 1;
Player1Scale.SetMedalsCount(player1score);
}
else
{
player2score += 1;
Player2Scale.SetMedalsCount(player2score);
}
}
public int GetMovesCount()
{
if (chipTransforms == null) return 0;

View File

@ -1,10 +1,9 @@
using PrizeSystem;
using Unity.VisualScripting;
using UnityEngine;
public static class EndOfTurnHandler
{
private static GameManager gm;
private static CheckResult result;
public static void NormalHandling()
@ -15,81 +14,42 @@ public static class EndOfTurnHandler
bool swipeToNextRightNow = false;
IState nextState;
IState nextState = new ShowWinnerState(result);//âðåìåííî
//pvp ðåøåíèå ïîáåäà â ðàóíäå èëè â èãðå
bool endround = result.End && !result.Draw;
bool endgame = false;
// ïîäñ÷åò î÷êîâ
if (result.End)//Ðàóíä îêîí÷åí. Ñ÷èòàåì î÷êè è ñòàâèì ñòåéò ïîêàç ïîáåäèòåëÿ
if (result.End)
{
if (gm.gameMode == GameMode.pvp && !result.Draw)
if (!result.Draw)
{
//ïîáåäèë p1
if (gm.currentPlayer == CellState.Player1)
if (gm.gameMode == GameMode.pvp)
{
gm.player1score += 1;
gm.Player1Scale.SetMedalsCount(gm.player1score);
PvpEndroundHandler();
}
else//ïîáåäèë p2
else if (gm.gameMode == GameMode.pve) //êîíåö ðàóíäà ñ áîòîì
{
gm.player2score += 1;
gm.Player2Scale.SetMedalsCount(gm.player2score);
}
PveEndroundHandler();
if (gm.currentPlayer == CellState.Player1)
{//àâòîïåðåõîä íà íåêñò áîòà.
if (gm.player1score == 5 || gm.player2score == 5)
endgame = true;
//Òóò íóæíî ïåðåéòè â ïðèçîâîå ñîñòîÿíèå
//Ïîòîì èç íåãî èäòè äàëüøå.
ShowWinnerState showWinner = CreateAutoTransitionState(result, 4);
if (endgame)
AvatarEventBus.Instance.OnEndGame?.Invoke(gm.currentPlayer);
else if (endround)
AvatarEventBus.Instance.OnEndRound?.Invoke(gm.currentPlayer);
}
else if (gm.gameMode == GameMode.pve && !result.Draw) //êîíåö ðàóíäà ñ áîòîì
{
//ÍÅ ÍÈ×Üß
VictoryScale botScale = gm.botScale;
if (gm.currentPlayer == CellState.Player1)//[ÏÎÁÅÄÀ ÈÃÐÎÊÀ]
{
if (CharacterController.CurrentCharacter.HasPrize)
{
PrizeSystemManager.GivePrize(CharacterController.CurrentCharacter.prize);
CharacterController.CurrentCharacter.HasPrize = false;
nextState = showWinner;
}
DifficultyManager.instance.IncreaseDifficulty();
gm.vsBotScore += 1;
CharacterEventBus.Instance.OnPlayerWin?.Invoke();
LightUtility.Win();
CharacterController.CurrentCharacter.Animator.SetTrigger("Lose");
swipeToNextRightNow = true;
}
else//Áîò ïîáåäèë
{
LightUtility.Lose();
CharacterController.CurrentCharacter.GetComponent<Animator>().SetTrigger("Win");
DifficultyManager.instance.DecreaseDifficulty();
if (gm.vsBotScore != 0)
gm.vsBotScore -= 1;
CharacterEventBus.Instance.OnBotWin?.Invoke();
if (TotalWin())
{//êîíåö èãðû - ïðèçîâîå ñîñòîÿíèå
nextState = new VictoryState();
ClearAllScales();
}
botScale.SetMedalsCount(gm.vsBotScore);
}
else if (gm.gameMode == GameMode.pve && result.Draw)
{
CharacterEventBus.Instance.OnDraw?.Invoke();
}
nextState = new ShowWinnerState(result);
}
else
{
@ -97,27 +57,78 @@ public static class EndOfTurnHandler
nextState = new StartTurnState();
}
if (gm.gameMode == GameMode.pve && gm.vsBotScore == gm.botsAmount) gm.upgradeFeeshkaDifficulty();
//êîíåö èãðû - ïðèçîâîå ñîñòîÿíèå
if (TotalWin())
{
nextState = new PrizeState();
ClearAllScales();
}
else if (swipeToNextRightNow)
{
ShowWinnerState showWinner = new ShowWinnerState(result);
showWinner.subState = ShowWinnerState.ShowWinnerSubstates.ExitByTime;
showWinner.timeRest = 4;
nextState = showWinner;
}
gm.stateMachine.ChangeState(nextState);
}
private static void PveEndroundHandler()
{
if (gm.currentPlayer == CellState.Player1)
{
PlayerWinHandler();
}
else//Áîò ïîáåäèë
{
BotWinHandler();
}
gm.botScale.SetMedalsCount(gm.vsBotScore);
//åñëè ôèøêó ïîáåäèëè, òî ïîâûøàåì.
if (gm.vsBotScore == gm.botsAmount) gm.upgradeFeeshkaDifficulty();
}
private static void PvpEndroundHandler()
{
CellState winner = gm.currentPlayer;
gm.IncreaseScoreAndScaleOfPlayer(winner);
if (TotalWin())
AvatarEventBus.Instance.OnEndGame?.Invoke(gm.currentPlayer);
else
AvatarEventBus.Instance.OnEndRound?.Invoke(gm.currentPlayer);
}
private static void BotWinHandler()
{
LightUtility.Lose();
CharacterController.CurrentCharacter.GetComponent<Animator>().SetTrigger("Win");
DifficultyManager.instance.DecreaseDifficulty();
if (gm.vsBotScore != 0)
gm.vsBotScore -= 1;
CharacterEventBus.Instance.OnBotWin?.Invoke();
}
private static void PlayerWinHandler()
{
if (CharacterController.CurrentCharacter.HasPrize)
{
PrizeSystemManager.GivePrize(CharacterController.CurrentCharacter.prize);
CharacterController.CurrentCharacter.HasPrize = false;
}
DifficultyManager.instance.IncreaseDifficulty();
gm.vsBotScore += 1;
CharacterEventBus.Instance.OnPlayerWin?.Invoke();
LightUtility.Win();
CharacterController.CurrentCharacter.Animator.SetTrigger("Lose");
}
private static bool TotalWin() =>
gm.player1score == 5 || gm.player2score == 5 || gm.vsBotScore == gm.botsAmount;
private static void ClearAllScales()
{
if (gm.botScale.isActiveAndEnabled) gm.botScale.ClearScale();
if (gm.Player1Scale.isActiveAndEnabled) gm.Player1Scale.ClearScale();
if (gm.Player2Scale.isActiveAndEnabled) gm.Player2Scale.ClearScale();
}
private static ShowWinnerState CreateAutoTransitionState(CheckResult result, float time)
{
var state = new ShowWinnerState(result);
state.subState = ShowWinnerState.ShowWinnerSubstates.ExitByTime;
state.timeRest = time;
return state;
}
public static void WinByTimerHandling()
{
@ -162,17 +173,13 @@ public static class EndOfTurnHandler
//êîíåö èãðû - ïðèçîâîå ñîñòîÿíèå
if (TotalWin())
{
nextState = new PrizeState();
nextState = new VictoryState();
ClearAllScales();
}
gm.stateMachine.ChangeState(nextState);
}
private static void ClearAllScales()
{
if (gm.botScale.isActiveAndEnabled) gm.botScale.ClearScale();
if (gm.Player1Scale.isActiveAndEnabled) gm.Player1Scale.ClearScale();
if (gm.Player2Scale.isActiveAndEnabled) gm.Player2Scale.ClearScale();
}
}

View File

@ -14,16 +14,34 @@ namespace PrizeSystem
static string FILE_PATH => Path.Combine(Application.persistentDataPath, CHARACTERS_PRIZES);
static int CharactersAmount => GameManager.instance.botsAmount;
private static List<Prize> cachedPrizes;
public static List<Prize> LoadPrizes()
{
if (!File.Exists(FILE_PATH))
if (cachedPrizes != null)
return cachedPrizes;
try
{
Debug.Log("Не записаны призы беру дефолт");
return GetDefaultPrizes();
if (File.Exists(FILE_PATH))
{
string fileString = File.ReadAllText(FILE_PATH);
cachedPrizes = DeserializePrizes(fileString);
}
else
{
Debug.Log($"Файл {FILE_PATH} не найден, создаю с призами по умолчанию");
cachedPrizes = GetDefaultPrizes();
SavePrizes(cachedPrizes);
}
}
catch (Exception e)
{
Debug.LogError($"Ошибка загрузки призов: {e.Message}");
cachedPrizes = GetDefaultPrizes();
}
string fileString = File.ReadAllText(FILE_PATH);
return DeserializePrizes(fileString);
return cachedPrizes;
}
/// <summary>