游戏是一个开放的世界游戏,你可以走路和驾驶不同的车辆,并在地面上放置结构。因为世界是巨大的,我希望玩家和不同的车辆/结构留在他们离开的地方。出于这个原因,我需要以某种方式存储位置,旋转,时间戳,材料等。首先我想到了PlayerPrefs,但我读过它并不安全。所以我开始做自己的二进制文件,这是我到目前为止所做的:
using UnityEngine;
using System.Collections;
using System;
using System.Runtime.Serialization.Formatters.Binary;
using System.IO;
public class SaveLoad : MonoBehaviour {
public static void SavePlayer(){
BinaryFormatter bf = new BinaryFormatter ();
FileStream stream = new FileStream (Application.persistentDataPath + "ftv.gha", FileMode.Create);
PlayerData data = new PlayerData ();
bf.Serialize (stream, data);
stream.Close ();
}
public static float[] LoadPlayer(){
if (File.Exists (Application.persistentDataPath + "ftv.gha")) {
BinaryFormatter bf = new BinaryFormatter ();
FileStream stream = new FileStream (Application.persistentDataPath + "ftv.gha", FileMode.Open);
PlayerData data = bf.Deserialize (stream) as PlayerData;
stream.Close ();
return data.position;
} else {
Debug.LogError ("File does not exist.");
return new float[]{0,0,0};
}
}
}
[Serializable]
public class PlayerData
{
public float[] position;
public PlayerData(){
position = new float[3];
position[0] = GameObject.Find ("Astronaut").transform.position.x;
position[1] = GameObject.Find ("Astronaut").transform.position.y;
position[2] = GameObject.Find ("Astronaut").transform.position.z;
}
}
使用此脚本,我可以保存和加载仅一个游戏对象(玩家)的数据。问题是我有6-7辆车,我也需要保存。玩家也可以在世界各地放置20-30个演习,我也需要保存这些演奏数据。我甚至不打算从其他不那么重要的事情开始。
为每个对象复制粘贴此代码听起来像一个可怕的想法,但在观看了YouTube上的数十个视频(并测试它们的字面上超过20小时)后,我没有找到任何答案。我找到了两种视频:
因此。有没有更好的方法来实现我试图解释的或我做错了什么?
有人请指出我正确的方向,以便我最终能够扩大规模。
答案 0 :(得分:0)
使用序列化很好。这就是我要做的事情:
ISaveable
的方法(或两种方法save
和save
)创建一个名为load
的界面。SaveLoad
游戏对象的保存方法中,使用FindObjectsOfType(Saveable)
Unity Documentation 请参阅strategy pattern以实现ISaveable接口。