gpt4 book ai didi

c# - 在 Unity 中使用 JSON 保存游戏

转载 作者:太空宇宙 更新时间:2023-11-03 12:29:28 24 4
gpt4 key购买 nike

<分区>

我使用 Unity 的 JSON 序列化在 Unity 中创建了一个简单的保存游戏系统。我的保存游戏非常简单,我只保存角色的位置并加载它。

保存游戏在游戏中运行良好。当我启动游戏并单击“保存”时,游戏被保存并且 JSON 文件更新为我的玩家位置。当我点击“加载”时,游戏加载正常,我的玩家被移动到之前保存的位置。

但是我的问题是,每当我关闭游戏并重新启动它时,“加载”功能只会将我的角色重置到我生成它的位置。它不会在我之前在上一场比赛中保存的位置加载角色。

现在是我的代码。我有一个 Actor 类,其中包含我的 Actor 数据:

using UnityEngine;
using System.Collections;
using System;

public class Actor : MonoBehaviour
{

public ActorData data = new ActorData(); // to store our data

public void StoreData() // for storing our data
{
data.pos = transform.position;
}

public void LoadData() // for loadinjg our data
{
transform.position = data.pos;
}

public void ApplyData()
{
SaveData.AddActorData(data);
}

void OnEnable() // to enable the save/load to avoid hanging
{
SaveData.OnLoaded += LoadData;
SaveData.OnBeforeSave += StoreData;
SaveData.OnBeforeSave += ApplyData;
}

void OnDisable() // to disable the save/load to avoid hanging
{
SaveData.OnLoaded -= LoadData;
SaveData.OnBeforeSave -= StoreData;
SaveData.OnBeforeSave -= ApplyData;
}
}

[Serializable] // for storing in JSON
public class ActorData // our players attributes in JSON
{
public Vector3 pos;
}

我还有一个 ActorContainer 来保存不同玩家的数据:

using System.Collections.Generic;
using System;

[Serializable]
public class ActorContainer
{

// To store our different actors data
public List<ActorData> actors = new List<ActorData>();
}

我有一个执行序列化的 SaveData 类:

    using UnityEngine;
using System.Collections;
using System.IO;

public class SaveData
{

// every actos will be sorted in this actor container when loading the game
public static ActorContainer actorContainer = new ActorContainer(); // static so that we dont have to recreacte savedata everytime

public delegate void SerializeAction();
public static event SerializeAction OnLoaded; // happens after loading
public static event SerializeAction OnBeforeSave; // right before saving

public static void Load(string path) // where the load is
{
actorContainer = LoadActors(path);

OnLoaded();

ClearActorList(); // so that there's no duplicates
}

public static void Save(string path, ActorContainer actors)
{
OnBeforeSave(); // to throw of the data that was in OnBeforeSave

SaveActors(path, actors); // store all of our actors as json in the file

ClearActorList(); // clear the list so that the next time we save theres no duplicates
}

public static void AddActorData(ActorData data)
{
actorContainer.actors.Add(data);
}

public static void ClearActorList() // to avoid duplicate data
{
actorContainer.actors.Clear(); // access actors and clear it
}

private static ActorContainer LoadActors(string path) // path to the JSON
{
string json = File.ReadAllText(path); // loading all the text out of the file into a string, assuming the text is all JSON

return JsonUtility.FromJson<ActorContainer>(json); // parse the JSON into an ActorContainer type and return in the LoadActors
}

private static void SaveActors(string path, ActorContainer actors) // where to save and the actors to save
{
string json = JsonUtility.ToJson(actors);

StreamWriter sw = File.CreateText(path); // if file doesnt exist, make the file in the specified path
sw.Close();

File.WriteAllText(path, json); // fill the file with the data(json)
}
}

最后我有一个 GameController 类,它充当与 Unity 的通信器:

using UnityEngine;
using System.Collections;
using UnityEngine.UI;
using System.IO;

public class GameController : MonoBehaviour
{ // to tell unity what it has to do, a communicator to be used with unity

// trigger buttons
public Button saveButton;
public Button loadButton;

private static string dataPath = string.Empty;

void Awake()
{
dataPath = System.IO.Path.Combine(Application.persistentDataPath, "actors.json"); // persistentDataPath unity save game path, actors.json name of the file containing actors
}

// for button
public void Save()
{
SaveData.Save(dataPath, SaveData.actorContainer);
}

// for button
public void Load()
{
SaveData.Load(dataPath);
}
}

我的 JSON 文件 actors.json 包含以下内容:

{"actors":[{"pos":{"x":419.6240539550781,"y":5.0189208984375,"z":0.0}}]}

欢迎提出任何建议。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com