From fe3c8a5515acdfcc50913d5b83de8f9504e95b73 Mon Sep 17 00:00:00 2001 From: miepzerino <o.skotnik@gmail.com> Date: Sat, 23 Dec 2023 23:21:22 +0000 Subject: [PATCH] Added map save/load + seed generation --- Assets/GenerateTileMap.cs | 50 +++ Assets/Scripts/Helpers/VectorHelper.cs | 89 +++++ Assets/Scripts/Managers/GameManager.cs | 40 ++ Assets/Scripts/PlayerController.cs | 15 Assets/Prefabs/LevelChanger.prefab | 287 +++++++++++++++++++ Assets/Scripts/SaveSystem.cs | 57 +++ Assets/Scenes/GameplayScene.unity | 299 ------------------- Assets/Scripts/PauseMenu.cs | 4 Assets/Scripts/SaveData.cs | 30 + 9 files changed, 535 insertions(+), 336 deletions(-) diff --git a/Assets/GenerateTileMap.cs b/Assets/GenerateTileMap.cs index 2d3e10f..46742ed 100644 --- a/Assets/GenerateTileMap.cs +++ b/Assets/GenerateTileMap.cs @@ -1,15 +1,18 @@ using System; using System.Collections; +using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; +using UnityEngine.UIElements; public class GenerateTileMap : MonoBehaviour { + public int? seed; public int width = 256; public int height = 256; - public float scale = 20f; - public float offsetX = 0f; - public float offsetY = 0f; + private float scale; + private float offsetX; + private float offsetY; Tilemap tilemap; public RuleTile ruleTile; //public List<TileBase> tiles; @@ -17,9 +20,43 @@ private void Awake() { tilemap = GetComponent<Tilemap>(); +#if DEBUG + //seed = 0123456789; +#endif + if (seed == null) + { + seed = GenerateSeed(9); + } + + SetSettingsFromSeed(seed.Value); } - public IEnumerator GenerateTiles(Action finishedCallback) + public void SetSettingsFromSeed(int seed) + { + UnityEngine.Random.State randomState = UnityEngine.Random.state; + + UnityEngine.Random.InitState(seed); + scale = UnityEngine.Random.Range(17f, 23f); + offsetX = UnityEngine.Random.Range(-10000f, 10000f); + offsetY = UnityEngine.Random.Range(-10000f, 10000f); + + UnityEngine.Random.state = randomState; + + } + + private int GenerateSeed(int size) + { + System.Random rand = new System.Random(); + string seedNumbers = "0123456789"; + char[] chars = new char[size]; + for (int i = 0; i < size; i++) + { + chars[i] = seedNumbers[rand.Next(seedNumbers.Length)]; + } + return int.Parse(new string(chars)); + } + + public IEnumerator GenerateTiles(Action finishedCallback, List<Vector3Int> destroyedTiles) { for (int x = 0; x < width; x++) { @@ -31,7 +68,10 @@ if (perlinNoise >= 0.3f) { - tilemap.SetTile(new Vector3Int(x, y), ruleTile); + if (!destroyedTiles.Contains(new Vector3Int(x, y, 0))) + { + tilemap.SetTile(new Vector3Int(x, y), ruleTile); + } } } diff --git a/Assets/Prefabs/LevelChanger.prefab b/Assets/Prefabs/LevelChanger.prefab index f584d01..f338308 100644 --- a/Assets/Prefabs/LevelChanger.prefab +++ b/Assets/Prefabs/LevelChanger.prefab @@ -142,6 +142,215 @@ m_Script: {fileID: 11500000, guid: a75ef9c1b88892d40b6007a3ab585271, type: 3} m_Name: m_EditorClassIdentifier: +--- !u!1 &3844785706809086879 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6284251417818347539} + - component: {fileID: 1160294125566254827} + - component: {fileID: 8332668438839698828} + m_Layer: 5 + m_Name: Spinner + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 0 +--- !u!224 &6284251417818347539 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3844785706809086879} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6682212171457450865} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0.5, y: 0.5} + m_AnchorMax: {x: 0.5, y: 0.5} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 32, y: 32} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &1160294125566254827 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3844785706809086879} + m_CullTransparentMesh: 1 +--- !u!114 &8332668438839698828 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 3844785706809086879} + m_Enabled: 1 + 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: -161760997, guid: 8bdab73b8571efc4ba2f350bfc5bf34c, type: 3} + 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!1 &4140913647654720710 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 712703440348202741} + - component: {fileID: 4758794796871118532} + - component: {fileID: 4321010892148685286} + m_Layer: 5 + m_Name: GameLoadingText (TMP) + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &712703440348202741 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4140913647654720710} + m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 0.75, y: 0.75, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: [] + m_Father: {fileID: 6682212171457450865} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 1, y: 0} + m_AnchorMax: {x: 1, y: 0} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 450, y: 100} + m_Pivot: {x: 1, y: 0} +--- !u!222 &4758794796871118532 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4140913647654720710} + m_CullTransparentMesh: 1 +--- !u!114 &4321010892148685286 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 4140913647654720710} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Game loading... + m_isRightToLeft: 0 + m_fontAsset: {fileID: 11400000, guid: dfaa183353a3e5c4bbc9aabee7dd8268, type: 2} + m_sharedMaterial: {fileID: -8621457483150523135, guid: dfaa183353a3e5c4bbc9aabee7dd8268, type: 2} + m_fontSharedMaterials: [] + m_fontMaterial: {fileID: 0} + m_fontMaterials: [] + m_fontColor32: + serializedVersion: 2 + rgba: 4294967295 + m_fontColor: {r: 1, g: 1, b: 1, a: 1} + m_enableVertexGradient: 0 + m_colorMode: 3 + m_fontColorGradient: + topLeft: {r: 1, g: 1, b: 1, a: 1} + topRight: {r: 1, g: 1, b: 1, a: 1} + bottomLeft: {r: 1, g: 1, b: 1, a: 1} + bottomRight: {r: 1, g: 1, b: 1, a: 1} + m_fontColorGradientPreset: {fileID: 0} + m_spriteAsset: {fileID: 0} + m_tintAllSprites: 0 + m_StyleSheet: {fileID: 0} + m_TextStyleHashCode: -1183493901 + m_overrideHtmlColors: 0 + m_faceColor: + serializedVersion: 2 + rgba: 4294967295 + m_fontSize: 78 + m_fontSizeBase: 78 + m_fontWeight: 400 + m_enableAutoSizing: 0 + m_fontSizeMin: 18 + m_fontSizeMax: 72 + m_fontStyle: 0 + m_HorizontalAlignment: 32 + m_VerticalAlignment: 8192 + m_textAlignment: 65535 + m_characterSpacing: 0 + m_wordSpacing: 0 + m_lineSpacing: 0 + m_lineSpacingMax: 0 + m_paragraphSpacing: 0 + m_charWidthMaxAdj: 0 + m_enableWordWrapping: 1 + m_wordWrappingRatios: 0.4 + m_overflowMode: 0 + m_linkedTextComponent: {fileID: 0} + parentLinkedComponent: {fileID: 0} + m_enableKerning: 1 + m_enableExtraPadding: 0 + checkPaddingRequired: 0 + m_isRichText: 1 + m_parseCtrlCharacters: 1 + m_isOrthographic: 1 + m_isCullingEnabled: 0 + m_horizontalMapping: 0 + m_verticalMapping: 0 + m_uvLineOffset: 0 + m_geometrySortingOrder: 0 + m_IsTextObjectScaleStatic: 0 + m_VertexBufferAutoSizeReduction: 0 + m_useMaxVisibleDescender: 1 + m_pageToDisplay: 1 + m_margin: {x: 0, y: 0, z: 0, w: 0} + m_isUsingLegacyAnimationComponent: 0 + m_isVolumetricText: 0 + m_hasFontAssetChanged: 0 + m_baseMaterial: {fileID: 0} + m_maskOffset: {x: 0, y: 0, z: 0, w: 0} --- !u!1 &4958470436171505954 GameObject: m_ObjectHideFlags: 0 @@ -174,6 +383,7 @@ m_ConstrainProportionsScale: 0 m_Children: - {fileID: 6098923997719688514} + - {fileID: 6682212171457450865} m_Father: {fileID: 7044154378667287598} m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} m_AnchorMin: {x: 0, y: 0} @@ -244,3 +454,80 @@ m_BlockingMask: serializedVersion: 2 m_Bits: 4294967295 +--- !u!1 &8556222640122415663 +GameObject: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + serializedVersion: 6 + m_Component: + - component: {fileID: 6682212171457450865} + - component: {fileID: 8205283534925286976} + - component: {fileID: 5749254209960849005} + m_Layer: 5 + m_Name: LoadingScreen + m_TagString: Untagged + m_Icon: {fileID: 0} + m_NavMeshLayer: 0 + m_StaticEditorFlags: 0 + m_IsActive: 1 +--- !u!224 &6682212171457450865 +RectTransform: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8556222640122415663} + m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} + m_LocalPosition: {x: 0, y: 0, z: 0} + m_LocalScale: {x: 1, y: 1, z: 1} + m_ConstrainProportionsScale: 0 + m_Children: + - {fileID: 6284251417818347539} + - {fileID: 712703440348202741} + m_Father: {fileID: 1837984479501285253} + m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} + m_AnchorMin: {x: 0, y: 0} + m_AnchorMax: {x: 1, y: 1} + m_AnchoredPosition: {x: 0, y: 0} + m_SizeDelta: {x: 0, y: 0} + m_Pivot: {x: 0.5, y: 0.5} +--- !u!222 &8205283534925286976 +CanvasRenderer: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8556222640122415663} + m_CullTransparentMesh: 1 +--- !u!114 &5749254209960849005 +MonoBehaviour: + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_GameObject: {fileID: 8556222640122415663} + m_Enabled: 1 + m_EditorHideFlags: 0 + m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} + m_Name: + m_EditorClassIdentifier: + m_Material: {fileID: 0} + m_Color: {r: 0, g: 0, b: 0, a: 0} + m_RaycastTarget: 0 + 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 diff --git a/Assets/Scenes/GameplayScene.unity b/Assets/Scenes/GameplayScene.unity index 0cc8649..91795ec 100644 --- a/Assets/Scenes/GameplayScene.unity +++ b/Assets/Scenes/GameplayScene.unity @@ -1027,11 +1027,6 @@ m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 5549e8180a8b1ba49bf0de3848e7bcf9, type: 3} ---- !u!224 &405367630 stripped -RectTransform: - m_CorrespondingSourceObject: {fileID: 1837984479501285253, guid: 1727dce3407104540a6bf21deb2957a8, type: 3} - m_PrefabInstance: {fileID: 1007461191} - m_PrefabAsset: {fileID: 0} --- !u!4 &427702723 stripped Transform: m_CorrespondingSourceObject: {fileID: 3069410814361871794, guid: 5549e8180a8b1ba49bf0de3848e7bcf9, type: 3} @@ -1734,83 +1729,6 @@ m_EditorClassIdentifier: cam: {fileID: 519420031} followTarget: {fileID: 254538002} ---- !u!1 &700639980 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 700639981} - - component: {fileID: 700639983} - - component: {fileID: 700639982} - m_Layer: 5 - m_Name: LoadingScreen - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &700639981 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 700639980} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: - - {fileID: 1083067552} - - {fileID: 1934276584} - m_Father: {fileID: 405367630} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0, y: 0} - m_AnchorMax: {x: 1, y: 1} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 0, y: 0} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &700639982 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 700639980} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: fe87c0e1cc204ed48ad3b37840f39efc, type: 3} - m_Name: - m_EditorClassIdentifier: - m_Material: {fileID: 0} - m_Color: {r: 0, g: 0, b: 0, a: 0} - m_RaycastTarget: 0 - 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 &700639983 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 700639980} - m_CullTransparentMesh: 1 --- !u!1 &720777868 stripped GameObject: m_CorrespondingSourceObject: {fileID: 8421115849835234403, guid: 19b26cb080fd5b841970a693f820fc0f, type: 3} @@ -2226,10 +2144,7 @@ objectReference: {fileID: 0} m_RemovedComponents: [] m_RemovedGameObjects: [] - m_AddedGameObjects: - - targetCorrespondingSourceObject: {fileID: 1837984479501285253, guid: 1727dce3407104540a6bf21deb2957a8, type: 3} - insertIndex: -1 - addedObject: {fileID: 700639981} + m_AddedGameObjects: [] m_AddedComponents: [] m_SourcePrefab: {fileID: 100100000, guid: 1727dce3407104540a6bf21deb2957a8, type: 3} --- !u!1 &1029677422 @@ -2464,81 +2379,6 @@ m_PrefabInstance: {fileID: 0} m_PrefabAsset: {fileID: 0} m_GameObject: {fileID: 1042147644} - m_CullTransparentMesh: 1 ---- !u!1 &1083067551 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1083067552} - - component: {fileID: 1083067554} - - component: {fileID: 1083067553} - m_Layer: 5 - m_Name: Spinner - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 0 ---- !u!224 &1083067552 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1083067551} - m_LocalRotation: {x: 0, y: 0, z: 0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 1, y: 1, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 700639981} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 0.5, y: 0.5} - m_AnchorMax: {x: 0.5, y: 0.5} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 32, y: 32} - m_Pivot: {x: 0.5, y: 0.5} ---- !u!114 &1083067553 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1083067551} - m_Enabled: 1 - 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: -161760997, guid: 8bdab73b8571efc4ba2f350bfc5bf34c, type: 3} - 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 &1083067554 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1083067551} m_CullTransparentMesh: 1 --- !u!1 &1219825711 GameObject: @@ -4657,144 +4497,7 @@ m_EditorClassIdentifier: width: 256 height: 256 - scale: 20 - offsetX: 0 - offsetY: 0 ruleTile: {fileID: 11400000, guid: e77c00aec3ec74f4a9ec15ef63c3f9a7, type: 2} ---- !u!1 &1934276583 -GameObject: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - serializedVersion: 6 - m_Component: - - component: {fileID: 1934276584} - - component: {fileID: 1934276586} - - component: {fileID: 1934276585} - m_Layer: 5 - m_Name: GameLoadingText (TMP) - m_TagString: Untagged - m_Icon: {fileID: 0} - m_NavMeshLayer: 0 - m_StaticEditorFlags: 0 - m_IsActive: 1 ---- !u!224 &1934276584 -RectTransform: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1934276583} - m_LocalRotation: {x: -0, y: -0, z: -0, w: 1} - m_LocalPosition: {x: 0, y: 0, z: 0} - m_LocalScale: {x: 0.75, y: 0.75, z: 1} - m_ConstrainProportionsScale: 0 - m_Children: [] - m_Father: {fileID: 700639981} - m_LocalEulerAnglesHint: {x: 0, y: 0, z: 0} - m_AnchorMin: {x: 1, y: 0} - m_AnchorMax: {x: 1, y: 0} - m_AnchoredPosition: {x: 0, y: 0} - m_SizeDelta: {x: 450, y: 100} - m_Pivot: {x: 1, y: 0} ---- !u!114 &1934276585 -MonoBehaviour: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1934276583} - m_Enabled: 1 - m_EditorHideFlags: 0 - m_Script: {fileID: 11500000, guid: f4688fdb7df04437aeb418b961361dc5, 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_text: Game loading... - m_isRightToLeft: 0 - m_fontAsset: {fileID: 11400000, guid: dfaa183353a3e5c4bbc9aabee7dd8268, type: 2} - m_sharedMaterial: {fileID: -8621457483150523135, guid: dfaa183353a3e5c4bbc9aabee7dd8268, type: 2} - m_fontSharedMaterials: [] - m_fontMaterial: {fileID: 0} - m_fontMaterials: [] - m_fontColor32: - serializedVersion: 2 - rgba: 4294967295 - m_fontColor: {r: 1, g: 1, b: 1, a: 1} - m_enableVertexGradient: 0 - m_colorMode: 3 - m_fontColorGradient: - topLeft: {r: 1, g: 1, b: 1, a: 1} - topRight: {r: 1, g: 1, b: 1, a: 1} - bottomLeft: {r: 1, g: 1, b: 1, a: 1} - bottomRight: {r: 1, g: 1, b: 1, a: 1} - m_fontColorGradientPreset: {fileID: 0} - m_spriteAsset: {fileID: 0} - m_tintAllSprites: 0 - m_StyleSheet: {fileID: 0} - m_TextStyleHashCode: -1183493901 - m_overrideHtmlColors: 0 - m_faceColor: - serializedVersion: 2 - rgba: 4294967295 - m_fontSize: 78 - m_fontSizeBase: 78 - m_fontWeight: 400 - m_enableAutoSizing: 0 - m_fontSizeMin: 18 - m_fontSizeMax: 72 - m_fontStyle: 0 - m_HorizontalAlignment: 32 - m_VerticalAlignment: 8192 - m_textAlignment: 65535 - m_characterSpacing: 0 - m_wordSpacing: 0 - m_lineSpacing: 0 - m_lineSpacingMax: 0 - m_paragraphSpacing: 0 - m_charWidthMaxAdj: 0 - m_enableWordWrapping: 1 - m_wordWrappingRatios: 0.4 - m_overflowMode: 0 - m_linkedTextComponent: {fileID: 0} - parentLinkedComponent: {fileID: 0} - m_enableKerning: 1 - m_enableExtraPadding: 0 - checkPaddingRequired: 0 - m_isRichText: 1 - m_parseCtrlCharacters: 1 - m_isOrthographic: 1 - m_isCullingEnabled: 0 - m_horizontalMapping: 0 - m_verticalMapping: 0 - m_uvLineOffset: 0 - m_geometrySortingOrder: 0 - m_IsTextObjectScaleStatic: 0 - m_VertexBufferAutoSizeReduction: 0 - m_useMaxVisibleDescender: 1 - m_pageToDisplay: 1 - m_margin: {x: 0, y: 0, z: 0, w: 0} - m_isUsingLegacyAnimationComponent: 0 - m_isVolumetricText: 0 - m_hasFontAssetChanged: 0 - m_baseMaterial: {fileID: 0} - m_maskOffset: {x: 0, y: 0, z: 0, w: 0} ---- !u!222 &1934276586 -CanvasRenderer: - m_ObjectHideFlags: 0 - m_CorrespondingSourceObject: {fileID: 0} - m_PrefabInstance: {fileID: 0} - m_PrefabAsset: {fileID: 0} - m_GameObject: {fileID: 1934276583} - m_CullTransparentMesh: 1 --- !u!1 &1990316377 GameObject: m_ObjectHideFlags: 0 diff --git a/Assets/Scripts/Helpers/VectorHelper.cs b/Assets/Scripts/Helpers/VectorHelper.cs index 6e72915..75b92d0 100644 --- a/Assets/Scripts/Helpers/VectorHelper.cs +++ b/Assets/Scripts/Helpers/VectorHelper.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Reflection; +using Unity.VisualScripting.Dependencies.NCalc; using UnityEngine; using static UnityEngine.Rendering.DebugUI; @@ -19,19 +21,6 @@ result[0] = value.x; result[1] = value.y; result[2] = value.z; - return result; - } - - /// <summary> - /// Will get a float array for a given vector2 value - /// </summary> - /// <param name="value"></param> - /// <returns>float[x,y]</returns> - public static float[] ConvertToFloatArray(this Vector2 value) - { - float[] result = new float[2]; - result[0] = value.x; - result[1] = value.y; return result; } @@ -57,6 +46,19 @@ } /// <summary> + /// Will get a float array for a given vector2 value + /// </summary> + /// <param name="value"></param> + /// <returns>float[x,y]</returns> + public static float[] ConvertToFloatArray(this Vector2 value) + { + float[] result = new float[2]; + result[0] = value.x; + result[1] = value.y; + return result; + } + + /// <summary> /// Will get a vector2 for a given float array value /// </summary> /// <param name="value"></param> @@ -75,5 +77,66 @@ } return result; } + + /// <summary> + /// Will get a float array for a given vector2 value + /// </summary> + /// <param name="value"></param> + /// <returns>float[x,y]</returns> + public static List<int[]> ConvertToListIntArray(this List<Vector3Int> value) + { + List<int[]> result = new List<int[]>(); + for (int i = 0; i < value.Count; i++) + { + int[] intVector = new int[2]; + intVector[0] = value[i].x; + intVector[1] = value[i].y; + result.Add(intVector); + } + return result; + } + + /// <summary> + /// Will get a vector2 for a given float array value + /// </summary> + /// <param name="value"></param> + /// <returns>Vector2</returns> + public static List<Vector3Int> ConvertToVector3Int(this List<int[]> value) + { + List<Vector3Int> result = new List<Vector3Int>(); + if (value != null && value.Count > 0) + { + for (int i = 0; i < value.Count; i++) + { + Vector3Int vector = new Vector3Int(); + vector.x = value[0][0]; + vector.y = value[0][1]; + result.Add(vector); + } + + } + return result; + } + + public static Vector3Int ConvertToVector3Int(this int[] value) + { + Vector3Int result = new Vector3Int(); + switch (value.Length) + { + case 2: + result.x = value[0]; + result.y = value[1]; + break; + case 3: + result.x = value[0]; + result.y = value[1]; + result.z = value[2]; + break; + default: + Debug.Assert(false, "ConvertToVector3Int() got wrong array size, expected size is 2 or 3. recieved size: " + value.Length); + break; + } + return result; + } } } \ No newline at end of file diff --git a/Assets/Scripts/Managers/GameManager.cs b/Assets/Scripts/Managers/GameManager.cs index 6c12eb4..13f8eb3 100644 --- a/Assets/Scripts/Managers/GameManager.cs +++ b/Assets/Scripts/Managers/GameManager.cs @@ -1,5 +1,10 @@ using Assets.Scripts.Enums; +using Assets.Scripts.Helpers; +using System; +using System.Collections.Generic; +using System.Linq; using TMPro; +using Unity.VisualScripting; using UnityEngine; using UnityEngine.Tilemaps; @@ -11,7 +16,10 @@ public Canvas pauseMenuUI; public GameObject levelChanger; public Tilemap tilemap; - GenerateTileMap generateTileMap; + [NonSerialized] + public GenerateTileMap generateTileMap; + [NonSerialized] + public List<Vector3Int> destroyedTiles = new List<Vector3Int>(); private void Awake() { @@ -22,16 +30,37 @@ private void LoadTileMaps(bool loadFromSave) { + generateTileMap = tilemap.GetComponent<GenerateTileMap>(); pauseMenuUI.GetComponent<PauseMenu>().Pause(); levelChanger.GetComponent<Animator>().SetBool("SceneLoading", true); - generateTileMap = tilemap.GetComponent<GenerateTileMap>(); - Debug.Log("waiting for async"); - StartCoroutine(generateTileMap.GenerateTiles(LoadTileMapsFinished)); + if (loadFromSave) + { + LoadMapState(); + } + Debug.Log("waiting for async map loading"); + StartCoroutine(generateTileMap.GenerateTiles(LoadTileMapsFinished, destroyedTiles)); + } + + private void LoadMapState() + { + SaveDataMap mapState = SaveSystem.LoadMapState(); + if (mapState != null) + { + generateTileMap.SetSettingsFromSeed(mapState.seed); + if (mapState.destroyedTiles != null && mapState.destroyedTiles.Count > 0) + { + // TODO rework load map (it's fucky wucky currently as I had to make an extra class for it to jsonify the tiles correctly, as unity does not like lists of arrays or 2d arrays) + foreach (DestroyedTile tile in mapState.destroyedTiles) + { + destroyedTiles.Add(tile.tileCoord.ConvertToVector3Int()); + } //destroyedTiles.AddRange(mapState.destroyedTiles.Select(tile => { return tile.tileCoord; }).ToList().ConvertToVector3Int()); + } + } } public void LoadTileMapsFinished() { - Debug.Log("done async"); + Debug.Log("done async map loading"); levelChanger.GetComponent<Animator>().SetBool("SceneLoading", false); GameLoaded(); } @@ -101,6 +130,7 @@ if (tilemap.HasTile(cellCoord)) { tilemap.SetTile(cellCoord, null); + destroyedTiles.Add(cellCoord); Vector3 moveToPosition = grid.CellToWorld(cellCoord); moveToPosition.x += 0.5f; moveToPosition.y += 0.5f; diff --git a/Assets/Scripts/PauseMenu.cs b/Assets/Scripts/PauseMenu.cs index 90c5270..630aa70 100644 --- a/Assets/Scripts/PauseMenu.cs +++ b/Assets/Scripts/PauseMenu.cs @@ -74,7 +74,9 @@ public void OnGameSaveClicked() { PlayerController playerController = GameObject.Find("Player").GetComponent<PlayerController>(); - SaveSystem.SavePlayer(playerController); + SaveSystem.SavePlayer(new SaveDataPlayer(playerController)); + GameManager gameManager= GameObject.Find("GameManager").GetComponent<GameManager>(); + SaveSystem.SaveMapState(new SaveDataMap(gameManager.destroyedTiles, gameManager.generateTileMap.seed.Value)); animator.SetTrigger("GameSaved"); } diff --git a/Assets/Scripts/PlayerController.cs b/Assets/Scripts/PlayerController.cs index 37838d6..081b55e 100644 --- a/Assets/Scripts/PlayerController.cs +++ b/Assets/Scripts/PlayerController.cs @@ -110,14 +110,19 @@ boxCollider = GetComponent<BoxCollider2D>(); if (SaveSystem.isGameLoaded) { - SaveData save = SaveSystem.LoadPlayer(); - health.MaxHealth = save.maxHealth; - health.Health = save.health; - transform.position = VectorHelper.ConvertToVector3(save.position); - rb.velocity = VectorHelper.ConvertToVector2(save.velocity); + LoadPlayer(); } } + private void LoadPlayer() + { + SaveDataPlayer save = SaveSystem.LoadPlayer(); + health.MaxHealth = save.maxHealth; + health.Health = save.health; + transform.position = VectorHelper.ConvertToVector3(save.position); + rb.velocity = VectorHelper.ConvertToVector2(save.velocity); + } + private void FixedUpdate() { if (CanMove) diff --git a/Assets/Scripts/SaveData.cs b/Assets/Scripts/SaveData.cs index 9af6777..5ee1f34 100644 --- a/Assets/Scripts/SaveData.cs +++ b/Assets/Scripts/SaveData.cs @@ -5,13 +5,13 @@ using UnityEngine; [Serializable] -public class SaveData +public class SaveDataPlayer { public int maxHealth; public int health; public float[] position; public float[] velocity; - public SaveData(PlayerController player) + public SaveDataPlayer(PlayerController player) { maxHealth = player.health.MaxHealth; health = player.health.Health; @@ -19,3 +19,29 @@ velocity = player.rb.velocity.ConvertToFloatArray(); } } + +[Serializable] +public class SaveDataMap +{ + public int seed; + public List<DestroyedTile> destroyedTiles; + public SaveDataMap(List<Vector3Int> destroyedTiles, int seed) + { + this.seed = seed; + this.destroyedTiles = new List<DestroyedTile>(); + foreach (var item in destroyedTiles.ConvertToListIntArray()) + { + this.destroyedTiles.Add(new DestroyedTile(item)); + } + } +} + +[Serializable] +public class DestroyedTile +{ + public DestroyedTile(int[] tileCoord) + { + this.tileCoord = tileCoord; + } + public int[] tileCoord; +} diff --git a/Assets/Scripts/SaveSystem.cs b/Assets/Scripts/SaveSystem.cs index 71ff8ee..bfe2c48 100644 --- a/Assets/Scripts/SaveSystem.cs +++ b/Assets/Scripts/SaveSystem.cs @@ -5,14 +5,13 @@ public static class SaveSystem { public static bool isGameLoaded = false; - public static void SavePlayer(PlayerController player) + public static void SavePlayer(SaveDataPlayer player) { if (player != null) { string path = System.IO.Path.Combine(Application.persistentDataPath, "player.savefile"); - SaveData saveData = new SaveData(player); - string saveDataJSON = JsonUtility.ToJson(saveData); + string saveDataJSON = JsonUtility.ToJson(player); using (FileStream fs = new FileStream(path, FileMode.Create)) { @@ -25,13 +24,13 @@ } else { - Debug.Log("Not saved as no playerController was sent"); + Debug.Log("Not saved as no playerData was sent"); } } - public static SaveData LoadPlayer () + public static SaveDataPlayer LoadPlayer() { - SaveData result; + SaveDataPlayer result; string path = System.IO.Path.Combine(Application.persistentDataPath, "player.savefile"); if (File.Exists(path)) { @@ -40,7 +39,51 @@ using (StreamReader sr = new StreamReader(fs)) { string saveData = sr.ReadToEnd(); - result = JsonUtility.FromJson<SaveData>(saveData); + result = JsonUtility.FromJson<SaveDataPlayer>(saveData); + } + } + } + else + { + Debug.LogError("Save file not found in: " + path); + return null; + } + return result; + } + public static void SaveMapState(SaveDataMap mapState) + { + if (mapState != null) + { + string path = System.IO.Path.Combine(Application.persistentDataPath, "map.savefile"); + string saveDataJSON = JsonUtility.ToJson(mapState); + + using (FileStream fs = new FileStream(path, FileMode.Create)) + { + using (StreamWriter sw = new StreamWriter(fs)) + { + sw.Write(saveDataJSON); + + } + } + } + else + { + Debug.Log("Not saved as no mapData was sent"); + } + } + + public static SaveDataMap LoadMapState() + { + SaveDataMap result; + string path = System.IO.Path.Combine(Application.persistentDataPath, "map.savefile"); + if (File.Exists(path)) + { + using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read)) + { + using (StreamReader sr = new StreamReader(fs)) + { + string saveData = sr.ReadToEnd(); + result = JsonUtility.FromJson<SaveDataMap>(saveData); } } } -- Gitblit v1.9.3