MayHeCome/Assets/Scripts/BlobManager.cs
2024-12-18 17:55:34 +08:00

86 lines
2.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using Newtonsoft.Json;
using UnityEngine;
public class BlobManager: Singleton<BlobManager>, ISavable
{
public int CurrentID = 0;
public List<BlobController> Blobs = new();
public List<BlobController> AvailableBlobs => Blobs.Where(b => b.BelongingBuilding == null).ToList();
public Action<int> onBlobCountChange;
public void Spawn()
{
var BlobPrefab = Resources.Load<BlobController>("Blob");
var go = Instantiate(BlobPrefab, Vector3.zero, Quaternion.identity);
go.name = $"Blob_{CurrentID + 1}";
}
public int Register(BlobController blob)
{
if (Blobs.Contains(blob)) return -1;
Blobs.Add(blob);
CurrentID++;
return CurrentID;
}
public void UnRegister(BlobController blob)
{
if (Blobs.Contains(blob))
{
Blobs.Remove(blob);
}
}
public string GetPath()
{
return this.gameObject.GetPath();
}
public void LoadData(Dictionary<string, string> saveData)
{
var blobsString = saveData["blobs"];
CurrentID = int.Parse(saveData["CurrentID"]);
var savable = JsonConvert.DeserializeObject<List<Dictionary<string, string>>>(blobsString);
var blobPrefab = Resources.Load<BlobController>("Blob");
savable.ForEach(s =>
{
var go = Instantiate(blobPrefab);
go.name = s["name"];
go.blobID = int.Parse(s["blobID"]);
go.transform.position = s["position"].FromSavable<Vector3>();
});
}
public Dictionary<string, string> SaveData()
{
var savable = Blobs.Select(blob =>
{
return new Dictionary<string, string>
{
["name"] = blob.name,
["blobID"] = blob.blobID.ToString(),
["position"] = blob.transform.position.ToSavable()
};
}).ToList();
var blobsString = JsonConvert.SerializeObject(savable);
return new Dictionary<string, string>
{
["blobs"] = blobsString,
["CurrentID"] = CurrentID.ToString()
};
}
}