【问题标题】:Saving data in Unity [duplicate]在 Unity 中保存数据 [重复]
【发布时间】:2017-01-03 22:34:32
【问题描述】:

该游戏是一款开放世界游戏,您可以在其中行走和驾驶不同的车辆并在地面上放置建筑物。因为世界很大,我希望玩家和不同的车辆/结构留在他们离开的地方。出于这个原因,我需要以某种方式存储位置、旋转、时间戳、材质等。首先我想到了 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. 说明如何保存一个对象的位置

所以。有没有更好的方法来实现我想要解释的内容,还是我做错了什么?

有人请指点我正确的方向,这样我终于可以开始扩大规模了。

【问题讨论】:

    标签: c# unity3d save binaryfiles


    【解决方案1】:

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

    1. 使用一个名为 save 的方法(或两个方法 saveload)创建一个名为 ISaveable 的接口。
    2. 为每个需要自己的特定可序列化对象并保存逻辑的不同对象实现接口。
    3. 将实现脚本添加到场景中的对象。
    4. SaveLoad游戏对象的保存方法中,使用FindObjectsOfType(ISaveable)Unity Documentation
    5. 遍历返回的对象并调用它们的保存方法。

    请参阅strategy pattern 以实现 ISaveable 接口。

    【讨论】:

    • 我会看看这个
    • @Jonathan 让我知道是否有需要澄清的特定步骤,我会相应地扩展答案。希望这会有所帮助!
    猜你喜欢
    • 2016-06-29
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 2023-04-10
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    相关资源
    最近更新 更多