Я работал над системой сохранения, чтобы сохранить данные моих игроков, и это работает нормально.Однако я не уверен, каков наилучший способ собрать все мои данные игроков, так как все их атрибуты (здоровье и т. Д.) Разделены на разные классы, например PlayerHealthManager.Прямо сейчас я почти уверен, что то, как я это делаю, - полный беспорядок, и, вероятно, во многих местах это неправильно.
У меня есть базовый класс Player, который использует Singleton и в основном содержит ссылки на всекомпоненты, данные которых мне нужны, например PlayerHealthManager.Затем у меня есть класс PlayerDataManager, который использует информацию из синглтона, чтобы скомпилировать данные Player в структуру и отправить их в SaveSystem, однако это выглядит очень грязно.Код прилагается ниже.Если кто-нибудь знает лучший способ сделать что-то или если это правильно, то мы очень ценим
public class PlayerDataManager : MonoBehaviour
{
public static event Action<PlayerData> OnPlayerDataLoaded = delegate { };
void Start()
{
PlayerData data = (PlayerData)SaveSystem.LoadPlayer();
OnPlayerDataLoaded(data);
}
void OnDisable()
{
SavePlayerData();
}
public PlayerData GetPlayerData()
{
if (Player.instance != null)
{
var playerData = new PlayerData();
Player p = Player.instance;
// Players Health Fields
playerData.health = p.HealthManager.Health;
playerData.maxHealth = p.HealthManager.MaxHealth;
// Player position fields
playerData.position = new float[2];
playerData.position[0] = p.transform.position.x;
playerData.position[1] = p.transform.position.y;
return playerData;
}
else
{
Debug.LogError("No player found");
return new PlayerData();
}
}
public void SavePlayerData()
{
SaveSystem.SavePlayer(GetPlayerData());
}
}
[RequireComponent(typeof(PlayerHealthManager))]
public class Player : MonoBehaviour
{
PlayerHealthManager healthManager;
public static Player instance = null;
public PlayerHealthManager HealthManager { get { return healthManager; } }
void Awake()
{
if (instance == null)
{
instance = this;
}
else
{
Destroy(gameObject);
}
}
void OnEnable()
{
healthManager = GetComponent<PlayerHealthManager>();
PlayerDataManager.OnPlayerDataLoaded += InitializeData;
}
void OnDisable()
{
PlayerDataManager.OnPlayerDataLoaded -= InitializeData;
}
void InitializeData(PlayerData data)
{
Vector2 newPosition = new Vector2(data.position[0], data.position[1]);
transform.position = newPosition;
healthManager.InitializeData(data);
}
}