From 67f9167523c13553747c528de99a30eff3cdbedf Mon Sep 17 00:00:00 2001 From: sega Date: Wed, 5 Aug 2026 13:20:53 +0300 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D0=BE=D1=82=D0=BE=D0=B2?= =?UTF-8?q?=D0=BA=D0=B0=20=D1=80=D0=BE=D1=83=D1=82=D0=B5=D1=80=D0=B0=20?= =?UTF-8?q?=D0=BA=D0=BE=D0=BD=D1=86=D0=B0=20=D0=B8=D0=B3=D1=80=D1=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/Prefabs/ChipPrefab.prefab | 163 +++++++++++++++++- Assets/Scenes/GameScene3D.unity | 50 +++++- Assets/Scripts/Common/GameManager.cs | 1 + Assets/Scripts/Gameplay/Chip.cs | 39 ++++- Assets/Scripts/Gameplay/EndGameHandler.cs | 38 ++++ .../Scripts/Gameplay/EndGameHandler.cs.meta | 2 + Assets/Scripts/Gameplay/TurnManager.cs | 13 +- 7 files changed, 291 insertions(+), 15 deletions(-) create mode 100644 Assets/Scripts/Gameplay/EndGameHandler.cs create mode 100644 Assets/Scripts/Gameplay/EndGameHandler.cs.meta diff --git a/Assets/Prefabs/ChipPrefab.prefab b/Assets/Prefabs/ChipPrefab.prefab index 33fa893..9f7a5e0 100644 --- a/Assets/Prefabs/ChipPrefab.prefab +++ b/Assets/Prefabs/ChipPrefab.prefab @@ -35,6 +35,7 @@ Transform: m_ConstrainProportionsScale: 0 m_Children: - {fileID: 1661318112489111391} + - {fileID: 1649651658890651227} m_Father: {fileID: 0} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!96 &2785177574404548980 @@ -308,6 +309,100 @@ MonoBehaviour: acceleration: 200 maxFallingRotationSpeed: 500 spriteRenderer: {fileID: 5157516706225878083} + mask: {fileID: 4898561958825486297} + winDots: {fileID: 1649651658890651227} + winAnimationDuration: 1 +--- !u!1 &5381885663262334684 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 1649651658890651227} + - component: {fileID: 4851732468212733041} + m_Layer: 0 + m_Name: WinDots + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!4 &1649651658890651227 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5381885663262334684} + serializedVersion: 2 + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: -1.885, y: -1.411, z: 0} + m_LocalScale: {x: 0.1, y: 0.1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 2308229979791902274} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} +--- !u!212 &4851732468212733041 +SpriteRenderer: + serializedVersion: 2 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 5381885663262334684} + m_Enabled: 1 + m_CastShadows: 0 + m_ReceiveShadows: 0 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: a97c105638bdf8b4a8650670310a4cd3, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 0 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: -5330059 + m_SortingLayer: 2 + m_SortingOrder: 1 + m_MaskInteraction: 1 + m_Sprite: {fileID: 21300000, guid: 8a5c9e10e873e84469d2775643ee2963, type: 3} + m_Color: {r: 0.906171, g: 0.72264147, b: 1, a: 0.39215687} + m_FlipX: 0 + m_FlipY: 0 + m_DrawMode: 0 + m_Size: {x: 1, y: 1} + m_AdaptiveModeThreshold: 0.5 + m_SpriteTileMode: 0 + m_WasSpriteAssigned: 1 + m_SpriteSortPoint: 0 --- !u!1 &7100645357252458328 GameObject: m_ObjectHideFlags: 0 @@ -318,8 +413,9 @@ GameObject: m_Component: - component: {fileID: 1661318112489111391} - component: {fileID: 5157516706225878083} + - component: {fileID: 4898561958825486297} m_Layer: 0 - m_Name: image + m_Name: image/mask m_TagString: Untagged m_Icon: {fileID: 0} m_NavMeshLayer: 0 @@ -389,13 +485,72 @@ SpriteRenderer: m_SortingLayer: 2 m_SortingOrder: 0 m_MaskInteraction: 0 - m_Sprite: {fileID: 21300000, guid: 8d6432ff047c62946a41e3235f28ba57, type: 3} + m_Sprite: {fileID: 21300000, guid: 024833a84adf142449000086760fe890, type: 3} m_Color: {r: 1, g: 1, b: 1, a: 1} m_FlipX: 0 m_FlipY: 0 m_DrawMode: 0 - m_Size: {x: 1.6384, y: 1.6384} + m_Size: {x: 1.2641976, y: 1.2641976} m_AdaptiveModeThreshold: 0.5 m_SpriteTileMode: 0 - m_WasSpriteAssigned: 0 + m_WasSpriteAssigned: 1 m_SpriteSortPoint: 0 +--- !u!331 &4898561958825486297 +SpriteMask: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 7100645357252458328} + m_Enabled: 1 + m_CastShadows: 1 + m_ReceiveShadows: 1 + m_DynamicOccludee: 1 + m_StaticShadowCaster: 0 + m_MotionVectors: 1 + m_LightProbeUsage: 1 + m_ReflectionProbeUsage: 1 + m_RayTracingMode: 0 + m_RayTraceProcedural: 0 + m_RayTracingAccelStructBuildFlagsOverride: 0 + m_RayTracingAccelStructBuildFlags: 1 + m_SmallMeshCulling: 1 + m_ForceMeshLod: -1 + m_MeshLodSelectionBias: 0 + m_RenderingLayerMask: 1 + m_RendererPriority: 0 + m_Materials: + - {fileID: 2100000, guid: 15d0c3709176029428a0da2f8cecf0b5, type: 2} + m_StaticBatchInfo: + firstSubMesh: 0 + subMeshCount: 0 + m_StaticBatchRoot: {fileID: 0} + m_ProbeAnchor: {fileID: 0} + m_LightProbeVolumeOverride: {fileID: 0} + m_ScaleInLightmap: 1 + m_ReceiveGI: 1 + m_PreserveUVs: 0 + m_IgnoreNormalsForChartDetection: 0 + m_ImportantGI: 0 + m_StitchLightmapSeams: 1 + m_SelectedEditorRenderState: 3 + m_MinimumChartSize: 4 + m_AutoUVMaxDistance: 0.5 + m_AutoUVMaxAngle: 89 + m_LightmapParameters: {fileID: 0} + m_GlobalIlluminationMeshLod: 0 + m_SortingLayerID: 0 + m_SortingLayer: 0 + m_SortingOrder: 0 + m_MaskInteraction: 0 + m_Sprite: {fileID: 21300000, guid: 024833a84adf142449000086760fe890, type: 3} + m_MaskAlphaCutoff: 0.2 + m_FrontSortingLayerID: 0 + m_BackSortingLayerID: 0 + m_FrontSortingLayer: 0 + m_BackSortingLayer: 0 + m_FrontSortingOrder: 0 + m_BackSortingOrder: 0 + m_IsCustomRangeActive: 0 + m_SpriteSortPoint: 0 + m_MaskSource: 0 diff --git a/Assets/Scenes/GameScene3D.unity b/Assets/Scenes/GameScene3D.unity index 9cbef5b..6e96199 100644 --- a/Assets/Scenes/GameScene3D.unity +++ b/Assets/Scenes/GameScene3D.unity @@ -4287,6 +4287,50 @@ CanvasRenderer: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 233260561} m_CullTransparentMesh: 1 +--- !u!1 &240039282 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 240039284} + - component: {fileID: 240039283} + m_Layer: 0 + m_Name: EndgameHandler + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!114 &240039283 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240039282} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f7668d2cc6a5cfd4db6e4fb4d83dd1a3, type: 3} + m_Name: + m_EditorClassIdentifier: Assembly-CSharp::EndGameHandler +--- !u!4 &240039284 +Transform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 240039282} + serializedVersion: 2 + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: -2.95738, y: -3.20088, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 0} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} --- !u!1 &245771467 GameObject: m_ObjectHideFlags: 0 @@ -4630,6 +4674,7 @@ MonoBehaviour: CharactersConfigurator: {fileID: 141381088} menuGameplayTransit: {fileID: 29868612} turnManager: {fileID: 1329752846} + endGameHandler: {fileID: 240039283} setPasswordPanel: {fileID: 131572818} vitrinaPanel: {fileID: 61619038} qrPanel: {fileID: 1060301113} @@ -4642,7 +4687,7 @@ Transform: m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 259182278} serializedVersion: 2 - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} m_LocalPosition: {x: 20, y: 6, z: 0} m_LocalScale: {x: 1, y: 1, z: 1} m_ConstrainProportionsScale: 0 @@ -38771,16 +38816,17 @@ SceneRoots: m_ObjectHideFlags: 0 m_Roots: - {fileID: 1396811479} + - {fileID: 259182280} - {fileID: 1948752564} - {fileID: 519420032} - {fileID: 29868613} + - {fileID: 240039284} - {fileID: 1122363135} - {fileID: 1081324697} - {fileID: 1967587903} - {fileID: 411367487} - {fileID: 1768372452} - {fileID: 1259803112} - - {fileID: 259182280} - {fileID: 1542626845} - {fileID: 1851050357} - {fileID: 1165555974} diff --git a/Assets/Scripts/Common/GameManager.cs b/Assets/Scripts/Common/GameManager.cs index 681814b..c4f2dfa 100644 --- a/Assets/Scripts/Common/GameManager.cs +++ b/Assets/Scripts/Common/GameManager.cs @@ -65,6 +65,7 @@ public class GameManager : MonoBehaviour [SerializeField] private MenuGameplayTransit menuGameplayTransit; [SerializeField] TurnManager turnManager; + public EndGameHandler endGameHandler; //public PvpPointer pvpPointer; //public MovesAndTimeCounter movesAndTimeCounter; diff --git a/Assets/Scripts/Gameplay/Chip.cs b/Assets/Scripts/Gameplay/Chip.cs index 49d09fd..f3cb9e2 100644 --- a/Assets/Scripts/Gameplay/Chip.cs +++ b/Assets/Scripts/Gameplay/Chip.cs @@ -1,4 +1,5 @@ -using UnityEngine; +using DG.Tweening; +using UnityEngine; public class Chip : MonoBehaviour { @@ -7,14 +8,26 @@ public class Chip : MonoBehaviour [SerializeField] float maxFallingRotationSpeed = 500; [SerializeField] private SpriteRenderer spriteRenderer; + [SerializeField] private SpriteMask mask; + + [Header("Победная анимация")] + [SerializeField] private Transform winDots; + [SerializeField] private float winAnimationDuration = 1; private float chipVelocity = 0; private float rotationSpeed = 0; + private float winDotsPosition = 1.5f; + private Tween winTween; + public void Configure(Sprite sprite, Team team) { spriteRenderer.sprite = sprite; + mask.sprite = sprite; this.team = team; + + mask.enabled = false; + winDots.gameObject.SetActive(false); } public virtual void RemoveFromField() @@ -49,4 +62,28 @@ public class Chip : MonoBehaviour public void SetRandomRotationSpeed() => rotationSpeed = Random.Range(-maxFallingRotationSpeed, maxFallingRotationSpeed); public void Rotate() => transform.Rotate(Vector3.forward * rotationSpeed * Time.deltaTime); + + public void WinAnimation() + { + if(winTween != null) + { + winTween.Kill(); + winTween = null; + + } + + mask.enabled = true; + winDots.gameObject.SetActive(true); + + Vector2 startPosition = new Vector2(winDotsPosition, winDotsPosition); + winDots.localPosition = startPosition; + winTween = winDots.DOLocalMove(-startPosition, winAnimationDuration).SetEase(Ease.Linear); + + winTween.onComplete = () => + { + mask.enabled = false; + winDots.gameObject.SetActive(false); + }; + winTween.PlayForward(); + } } \ No newline at end of file diff --git a/Assets/Scripts/Gameplay/EndGameHandler.cs b/Assets/Scripts/Gameplay/EndGameHandler.cs new file mode 100644 index 0000000..f312e05 --- /dev/null +++ b/Assets/Scripts/Gameplay/EndGameHandler.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using UnityEngine; + +public class EndGameHandler : MonoBehaviour +{ + public void HandleEndGame(Team lastPlayer, GameMode gameMode, CheckResult lastResult) + { + print("Конец игры"); + + + if (lastResult.Draw) + DrawHandler(); + else + WinHandler(winner: lastPlayer, + gameMode: gameMode, + winChipsCoords: lastResult.WinningIndexes); + + } + + private void DrawHandler() + { + print("Это ничья"); + } + + private void WinHandler(Team winner, GameMode gameMode, HashSet<(int row, int col)> winChipsCoords) + { + Debug.Log($"Победа {winner}; Режим {gameMode}"); + PlayWinChipsAnimation(winChipsCoords); + } + + private void PlayWinChipsAnimation(HashSet<(int row, int col)> winChipsCoords) + { + Chip[,] grid = Board.Instance.Grid; + + foreach (var winCoord in winChipsCoords) + grid[winCoord.col, winCoord.row].WinAnimation(); + } +} diff --git a/Assets/Scripts/Gameplay/EndGameHandler.cs.meta b/Assets/Scripts/Gameplay/EndGameHandler.cs.meta new file mode 100644 index 0000000..dbd05ae --- /dev/null +++ b/Assets/Scripts/Gameplay/EndGameHandler.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: f7668d2cc6a5cfd4db6e4fb4d83dd1a3 \ No newline at end of file diff --git a/Assets/Scripts/Gameplay/TurnManager.cs b/Assets/Scripts/Gameplay/TurnManager.cs index f443864..9acd67b 100644 --- a/Assets/Scripts/Gameplay/TurnManager.cs +++ b/Assets/Scripts/Gameplay/TurnManager.cs @@ -1,9 +1,8 @@ -using Cysharp.Threading.Tasks.Triggers; -using System; +using System; using UnityEngine; public class TurnManager : MonoBehaviour -{ +{//todo: добавить отслеживание по таймеру [Header("Players")] [SerializeField] private Player player1; [SerializeField] private Player player2; @@ -92,13 +91,11 @@ public class TurnManager : MonoBehaviour { isGameOver = true; currentPlayer.Sleep(); + ControlsPerformer.Instance.SetControlable(null); - - BasePlayer lastPlayer = (BasePlayer)currentPlayer; + Team lastPlayerTeam = ((BasePlayer)currentPlayer).team; var result = FieldChecker.lastResult; - - - Debug.Log($"end: {result.End}; draw: {result.Draw}; lastPlayer: {lastPlayer.team}"); + GameManager.instance.endGameHandler.HandleEndGame(lastPlayerTeam, gameMode, result); } } \ No newline at end of file