save / load dans un fichier
problème : le save et le load fonctionnait avec un string en mémoire solution : créer un fichier save.txt dans les assets quand on sauvegarde, et lire de ce fichier quand on load.
This commit is contained in:
parent
d4f32e439f
commit
f1a328122c
@ -407,7 +407,7 @@ MonoBehaviour:
|
|||||||
_isInvisible: 0
|
_isInvisible: 0
|
||||||
_isCollidable: 0
|
_isCollidable: 0
|
||||||
_isTrigger: 0
|
_isTrigger: 0
|
||||||
_renderOrder: 0
|
_renderOrder: 1
|
||||||
_renderLayer: Default
|
_renderLayer: Default
|
||||||
- _key: Spawners
|
- _key: Spawners
|
||||||
_tiles:
|
_tiles:
|
||||||
|
|||||||
@ -3,6 +3,12 @@ using UnityEngine;
|
|||||||
|
|
||||||
public interface ILevelObject
|
public interface ILevelObject
|
||||||
{
|
{
|
||||||
|
public enum ObjectType
|
||||||
|
{
|
||||||
|
Tile = 0,
|
||||||
|
Prefab = 1
|
||||||
|
}
|
||||||
|
|
||||||
string Name { get; }
|
string Name { get; }
|
||||||
Vector3 Position { get; }
|
Vector3 Position { get; }
|
||||||
void LevelUpdate();
|
void LevelUpdate();
|
||||||
|
|||||||
@ -5,6 +5,8 @@ using UnityEngine;
|
|||||||
using UnityEngine.Tilemaps;
|
using UnityEngine.Tilemaps;
|
||||||
using GatherAndDefend.LevelEditor;
|
using GatherAndDefend.LevelEditor;
|
||||||
using Unity.VisualScripting.YamlDotNet.Core.Tokens;
|
using Unity.VisualScripting.YamlDotNet.Core.Tokens;
|
||||||
|
using System.Text;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
#region [custom inspector]
|
#region [custom inspector]
|
||||||
#if UNITY_EDITOR
|
#if UNITY_EDITOR
|
||||||
@ -32,6 +34,7 @@ public class LevelManagerEditor : Editor
|
|||||||
#region [singleton level manager]
|
#region [singleton level manager]
|
||||||
public class LevelManager : Singleton<LevelManager>
|
public class LevelManager : Singleton<LevelManager>
|
||||||
{
|
{
|
||||||
|
string SavePath => Application.dataPath + "/save.txt";
|
||||||
public delegate void LevelAction(ILevelObject levelObject);
|
public delegate void LevelAction(ILevelObject levelObject);
|
||||||
public delegate bool LevelPredicate<T>(T levelObject) where T : ILevelObject;
|
public delegate bool LevelPredicate<T>(T levelObject) where T : ILevelObject;
|
||||||
public event LevelAction Added;
|
public event LevelAction Added;
|
||||||
@ -121,8 +124,6 @@ public class LevelManager : Singleton<LevelManager>
|
|||||||
toRemove.Clear();
|
toRemove.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private string saved;
|
|
||||||
|
|
||||||
public void ClearLevel()
|
public void ClearLevel()
|
||||||
{
|
{
|
||||||
foreach (var obj in _levelObjects)
|
foreach (var obj in _levelObjects)
|
||||||
@ -131,22 +132,15 @@ public class LevelManager : Singleton<LevelManager>
|
|||||||
}
|
}
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
public void SaveFile()
|
|
||||||
|
/// <summary>
|
||||||
|
/// permet de loader un scriptable object de niveau
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="level">le niveau à loader</param>
|
||||||
|
/// <param name="shouldClear">est ce qu'on veut effacer ce qui est déjà là?</param>
|
||||||
|
public void LoadLevel(Level level, bool shouldClear = false)
|
||||||
{
|
{
|
||||||
var list = _levelObjects.Select(obj => obj.ToDictionary()).ToList();
|
if (shouldClear)
|
||||||
list.Add(new Dictionary<string, object>()
|
|
||||||
{
|
|
||||||
{Database.TYPE, "Level" },
|
|
||||||
{"Name", _currentLevel.name }
|
|
||||||
});
|
|
||||||
saved = JsonConvert.SerializeObject(list);
|
|
||||||
|
|
||||||
Debug.Log("game saved successfully");
|
|
||||||
}
|
|
||||||
|
|
||||||
public void LoadLevel(Level level, bool clear = false)
|
|
||||||
{
|
|
||||||
if (clear)
|
|
||||||
{
|
{
|
||||||
ClearLevel();
|
ClearLevel();
|
||||||
}
|
}
|
||||||
@ -177,9 +171,15 @@ public class LevelManager : Singleton<LevelManager>
|
|||||||
}
|
}
|
||||||
Debug.Log("level loaded successfully");
|
Debug.Log("level loaded successfully");
|
||||||
}
|
}
|
||||||
public void LoadLevel(string levelName, bool clear = false)
|
|
||||||
|
/// <summary>
|
||||||
|
/// permet de loader un scriptable object de niveau
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="levelName">le nom du niveau à loader</param>
|
||||||
|
/// <param name="shouldClear">est ce qu'on veut effacer ce qui est déjà là?</param>
|
||||||
|
public void LoadLevel(string levelName, bool shouldClear = false)
|
||||||
{
|
{
|
||||||
if (clear)
|
if (shouldClear)
|
||||||
{
|
{
|
||||||
ClearLevel();
|
ClearLevel();
|
||||||
}
|
}
|
||||||
@ -187,18 +187,31 @@ public class LevelManager : Singleton<LevelManager>
|
|||||||
//fetch level from database
|
//fetch level from database
|
||||||
_currentLevel = Database.Instance.ScriptableObjects[levelName] as Level;
|
_currentLevel = Database.Instance.ScriptableObjects[levelName] as Level;
|
||||||
|
|
||||||
LoadLevel(_currentLevel, clear);
|
LoadLevel(_currentLevel, shouldClear);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
public void SaveFile()
|
||||||
|
{
|
||||||
|
var list = _levelObjects.Select(obj => obj.ToDictionary()).ToList();
|
||||||
|
string saved = JsonConvert.SerializeObject(list);
|
||||||
|
|
||||||
|
File.WriteAllText(SavePath, saved, Encoding.UTF8);
|
||||||
|
Debug.Log("game saved successfully");
|
||||||
|
}
|
||||||
|
|
||||||
public void LoadFile()
|
public void LoadFile()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
string saved = File.ReadAllText(SavePath, Encoding.UTF8);
|
||||||
|
var dicts = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(saved);
|
||||||
|
|
||||||
ClearLevel();
|
ClearLevel();
|
||||||
|
|
||||||
var dicts = JsonConvert.DeserializeObject<List<Dictionary<string, object>>>(saved);
|
var prefabDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Prefab));
|
||||||
|
|
||||||
var prefabDicts = dicts.FindAll(x => x[Database.TYPE].ToString() == nameof(Database.Prefabs));
|
|
||||||
foreach (var prefabDict in prefabDicts) CreatePrefab(prefabDict);
|
foreach (var prefabDict in prefabDicts) CreatePrefab(prefabDict);
|
||||||
|
|
||||||
var tileDicts = dicts.FindAll(x => x[Database.TYPE].ToString() == nameof(Database.ScriptableObjects));
|
var tileDicts = dicts.FindAll(x => x[nameof(ILevelObject.ObjectType)].ToString() == nameof(ILevelObject.ObjectType.Tile));
|
||||||
foreach (var tileDict in tileDicts) CreateTile(tileDict);
|
foreach (var tileDict in tileDicts) CreateTile(tileDict);
|
||||||
|
|
||||||
Debug.Log("game loaded successfully");
|
Debug.Log("game loaded successfully");
|
||||||
@ -228,15 +241,25 @@ public class LevelManager : Singleton<LevelManager>
|
|||||||
public class LevelManagerScript : MonoBehaviour
|
public class LevelManagerScript : MonoBehaviour
|
||||||
{
|
{
|
||||||
public Level firstLevel;
|
public Level firstLevel;
|
||||||
private static LevelManagerScript _instance;
|
private static LevelManagerScript _instance;
|
||||||
|
|
||||||
void Awake()
|
void Awake()
|
||||||
{
|
{
|
||||||
if (!_instance) _instance = this;
|
//we don't want to ever have two LevelManagerScript at the same time in the game.
|
||||||
else Destroy(gameObject);
|
//We prevent that by erasing any instances that are not registered as our main instance.
|
||||||
|
if (!_instance)
|
||||||
|
{
|
||||||
|
_instance = this;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Destroy(gameObject);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
DontDestroyOnLoad(gameObject);
|
DontDestroyOnLoad(gameObject);
|
||||||
LevelManager.Instance.LoadLevel(firstLevel.name, true);
|
if (!firstLevel) throw new System.Exception("there is no first level set in the level manager script");
|
||||||
|
LevelManager.Instance.LoadLevel(firstLevel, true);
|
||||||
}
|
}
|
||||||
void Update()
|
void Update()
|
||||||
{
|
{
|
||||||
|
|||||||
@ -40,7 +40,7 @@ public abstract class LevelObject : MonoBehaviour, ILevelObject
|
|||||||
{
|
{
|
||||||
{nameof(Name), Name },
|
{nameof(Name), Name },
|
||||||
{nameof(Position), new float[]{Position.x, Position.y, Position.z } },
|
{nameof(Position), new float[]{Position.x, Position.y, Position.z } },
|
||||||
{Database.TYPE, nameof(Database.Prefabs) }
|
{nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Prefab) }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
public virtual void LoadDictionary(Dictionary<string, object> dict)
|
public virtual void LoadDictionary(Dictionary<string, object> dict)
|
||||||
|
|||||||
@ -78,15 +78,16 @@ public abstract class LevelTile : TileBase, ILevelObject
|
|||||||
{nameof(Name), Name },
|
{nameof(Name), Name },
|
||||||
{nameof(Position), new float[]{Position.x, Position.y, Position.z } },
|
{nameof(Position), new float[]{Position.x, Position.y, Position.z } },
|
||||||
{nameof(Tilemap), Tilemap },
|
{nameof(Tilemap), Tilemap },
|
||||||
{Database.TYPE, nameof(Database.ScriptableObjects) }
|
{nameof(ILevelObject.ObjectType), nameof(ILevelObject.ObjectType.Tile) }
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
public virtual void LoadDictionary(Dictionary<string, object> dict)
|
public virtual void LoadDictionary(Dictionary<string, object> dict)
|
||||||
{
|
{
|
||||||
Name = dict[nameof(Name)].ToString();
|
Name = dict[nameof(Name)].ToString();
|
||||||
Position = dict[nameof(Position)].ToVector3();
|
Position = dict[nameof(Position)].ToVector3();
|
||||||
|
|
||||||
var tilemapName = dict[nameof(Tilemap)].ToString();
|
var tilemapName = dict[nameof(Tilemap)].ToString();
|
||||||
|
|
||||||
_tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
|
_tilemap = FindObjectOfType<Grid>().GetComponentInChildren<Tilemap>(tilemapName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@ -29,8 +29,8 @@ public class Opponent : Entity
|
|||||||
|
|
||||||
void AttackEnemy() {
|
void AttackEnemy() {
|
||||||
//Attack Cooldown
|
//Attack Cooldown
|
||||||
if(AttackSpeed < AttackSpeedWait) {
|
if(AttackSpeed < AttackSpeedWait)
|
||||||
|
{
|
||||||
Enemy.Hp-=AttackDamage;
|
Enemy.Hp-=AttackDamage;
|
||||||
Debug.Log("Ally Hp = " + Enemy.Hp);
|
Debug.Log("Ally Hp = " + Enemy.Hp);
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user