在Unity中保存数据

时间:2017-01-03 22:34:32

标签: c# unity3d save binaryfiles

游戏是一个开放的世界游戏,你可以走路和驾驶不同的车辆,并在地面上放置结构。因为世界是巨大的,我希望玩家和不同的车辆/结构留在他们离开的地方。出于这个原因,我需要以某种方式存储位置,旋转,时间戳,材料等。首先我想到了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小时)后,我没有找到任何答案。我找到了两种视频:

  1. 解释如何保存一个对象的等级,健康和力量
  2. 解释如何保存一个对象的位置
  3. 因此。有没有更好的方法来实现我试图解释的或我做错了什么?

    有人请指出我正确的方向,以便我最终能够扩大规模。

1 个答案:

答案 0 :(得分:0)

使用序列化很好。这就是我要做的事情:

  1. 使用一种名为ISaveable的方法(或两种方法savesave)创建一个名为load的界面。
  2. 为需要它的每个不同对象实现接口自己的特定可序列化对象并保存逻辑。
  3. 将实现脚本添加到场景中的对象。
  4. SaveLoad游戏对象的保存方法中,使用FindObjectsOfType(Saveable) Unity Documentation
  5. 迭代返回的对象并调用其保存方法。
  6. 请参阅strategy pattern以实现ISaveable接口。