SaveSystem.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System.IO;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. public class SaveSystem : MonoBehaviour
  5. {
  6. private string savePath;
  7. [Header("References")]
  8. public MapGenerator mapGenerator;
  9. public GameObject enemyPrefab;
  10. public GameObject orbPrefab;
  11. public Transform playerTransform;
  12. void Awake()
  13. {
  14. savePath = Path.Combine(Application.persistentDataPath, "savegame.json");
  15. }
  16. public void SaveGame()
  17. {
  18. GameData data = new GameData();
  19. // 1. Stats from GameManager
  20. data.orbsCollected = GameManager.Instance.GetOrbsInternal();
  21. data.remainingTimer = GameManager.Instance.timeRemaining;
  22. data.mapSeed = mapGenerator.noiseData.seed;
  23. // 2. Player Transform
  24. data.playerPos = new float[] { playerTransform.position.x, playerTransform.position.y, playerTransform.position.z };
  25. data.playerRot = new float[] { playerTransform.eulerAngles.x, playerTransform.eulerAngles.y, playerTransform.eulerAngles.z };
  26. // 3. Collectibles - Ensure lists are initialized
  27. data.orbPositions = new List<SaveVector3>();
  28. GameObject[] orbs = GameObject.FindGameObjectsWithTag("Collectible");
  29. Debug.Log("SaveSystem: Found " + orbs.Length + " orbs to save.");
  30. foreach (GameObject orb in orbs)
  31. {
  32. data.orbPositions.Add(new SaveVector3(orb.transform.position));
  33. }
  34. // 4. Enemies - Ensure lists are initialized
  35. data.enemyPositions = new List<SaveVector3>();
  36. data.enemyStates = new List<int>();
  37. GameObject[] enemies = GameObject.FindGameObjectsWithTag("Enemy");
  38. Debug.Log("SaveSystem: Found " + enemies.Length + " enemies to save.");
  39. foreach (GameObject enemy in enemies)
  40. {
  41. EnemyAI ai = enemy.GetComponent<EnemyAI>();
  42. if (ai != null)
  43. {
  44. data.enemyPositions.Add(new SaveVector3(enemy.transform.position));
  45. data.enemyStates.Add((int)ai.currentState);
  46. }
  47. }
  48. // Convert to JSON and save
  49. string json = JsonUtility.ToJson(data, true);
  50. File.WriteAllText(savePath, json);
  51. Debug.Log("Save file written to: " + savePath);
  52. }
  53. public void LoadGame()
  54. {
  55. if (!File.Exists(savePath))
  56. {
  57. Debug.LogWarning("No Save File Found at " + savePath);
  58. return;
  59. }
  60. string json = File.ReadAllText(savePath);
  61. GameData data = JsonUtility.FromJson<GameData>(json);
  62. // 1. Restore Map Seed & Regenerate
  63. mapGenerator.noiseData.seed = data.mapSeed;
  64. mapGenerator.DrawMapInEditor();
  65. // Refresh Collider for the new terrain shape
  66. MeshFilter mf = mapGenerator.GetComponent<MeshFilter>();
  67. mapGenerator.GetComponent<MeshCollider>().sharedMesh = mf.sharedMesh;
  68. // 2. Restore Stats in GameManager
  69. GameManager.Instance.SetDataInternal(data.orbsCollected, data.remainingTimer);
  70. // 3. Restore Player Position
  71. CharacterController cc = playerTransform.GetComponent<CharacterController>();
  72. cc.enabled = false; // Disable to allow direct position setting
  73. playerTransform.position = new Vector3(data.playerPos[0], data.playerPos[1], data.playerPos[2]);
  74. playerTransform.rotation = Quaternion.Euler(data.playerRot[0], data.playerRot[1], data.playerRot[2]);
  75. cc.enabled = true;
  76. // 4. Restore Orbs
  77. Debug.Log("Attempting to load " + data.orbPositions.Count + " orbs.");
  78. foreach (GameObject o in GameObject.FindGameObjectsWithTag("Collectible")) Destroy(o);
  79. foreach (SaveVector3 sPos in data.orbPositions)
  80. {
  81. Instantiate(orbPrefab, sPos.ToVector3(), Quaternion.identity);
  82. }
  83. // 5. Restore Enemies
  84. Debug.Log("Attempting to load " + data.enemyPositions.Count + " enemies.");
  85. foreach (GameObject e in GameObject.FindGameObjectsWithTag("Enemy")) Destroy(e);
  86. for (int i = 0; i < data.enemyPositions.Count; i++)
  87. {
  88. GameObject newEnemy = Instantiate(enemyPrefab, data.enemyPositions[i].ToVector3(), Quaternion.identity);
  89. newEnemy.GetComponent<EnemyAI>().currentState = (EnemyAI.EnemyState)data.enemyStates[i];
  90. }
  91. Debug.Log("Detailed JSON Load Complete!");
  92. }
  93. }