【发布时间】:2019-04-24 18:10:19
【问题描述】:
我一直在开发一个保存系统来保存我的玩家数据,并且工作正常。但是,我不确定编译所有玩家数据的最佳方法是什么,因为它的所有属性(健康等)都分为不同的类,例如 PlayerHealthManager。现在我很确定我这样做的方式完全是一团糟,而且在很多地方可能都是错误的。
我有一个使用 Singleton 的基本 Player 类,并且基本上包含对我需要其数据的所有组件的引用,例如 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);
}
}
【问题讨论】:
-
您如何将数据保存在您的 SaveSystem 中?
-
@Dave 抱歉,是的,我正在序列化数据应该已经提到了