使用Unity中的Json将我的游戏对象保存在地图中[重复]

Posted

技术标签:

【中文标题】使用Unity中的Json将我的游戏对象保存在地图中[重复]【英文标题】:Saving my game objects in the map with Json in Unity [duplicate] 【发布时间】:2021-10-30 20:44:24 【问题描述】:

我在 Unity 中有一个包含岩石、树木、桶等的 3D 生存游戏。我有 json 格式的保存系统,我可以保存几乎所有内容(玩家状态、位置、库存等)。 我最不想保存的是地图中的游戏对象(树、石头)。

因此,例如,当我破坏一棵树时,它会破坏该对象,但是当我加载保存的游戏时,它当然会再次出现。

我想我必须保存对象 x、y、z 坐标,也许是旋转,但我不知道是否销毁该对象如何保存(以便在我销毁对象时可以加载或不加载该对象)。

有人可以给我一个建议或一个例子,我该怎么做这样的事情? (保存我的对象条件 - 是否被破坏,坐标和旋转 - )

先谢谢你了。

【问题讨论】:

您可以创建 Class ,您可以在其中存储名称、位置、旋转,甚至预制件名称,为所有内容着色(您不能序列化游戏对象),然后当场景加载时您可以基于 json 重新创建您的世界.具有预制名称的示例,您可以加载它docs.unity3d.com/ScriptReference/Resources.Load.html。如果某些对象被破坏,您可以拥有 InMemory 表示(列表,字典)任何集合。当您保存游戏时,只需再次序列化您的集合 【参考方案1】:

正如@phantasm 建议的那样,您需要跟踪预制件。这表明场景中的每个对象都应该是一个预制件。您可以使用以下数据结构来跟踪场景对象

public interface IStorableComponent

  string Serialize();
  void Deserialize(string payload);


[System.Serializable]
public class StorableObject

  public string _name;

  public string prefabPath;

  public Vector3 position;

  public Vector3 rotation;

  public Dictionary<string, string> storedComponents;

  public string Serialize(GameObject gameObject)
  
    // Populate stored components
    storedComponents = new Dictionary<string, string>();

    IStorableComponent[] components = gameObject.GetComponents<IStorableComponent>();
    foreach (var component in components)
    
      storedComponents.Add(component.GetType().Name, component.Serialize());
    

    // Serialize using NewtonSoft
    return JsonConvert.SerializeObject(this, Formatting.Indented);
  


【讨论】:

【参考方案2】:

基本上,当您按下保存或退出游戏按钮时,您必须保存所有要保存的对象的预制名称及其位置(如果需要,还可以保存其他内容,如旋转和缩放,但这可能会减慢处理速度) 然后当您再次加载游戏时,您可以使用预制件的名称从资源文件夹中实例化它们(https://www.youtube.com/watch?v=5PBcvTfbDn0,如果您不知道它是如何工作的),然后将位置和其他保存的数据设置为那些物体。遍历您保存的所有对象的列表,瞧:)希望它有意义?

【讨论】:

以上是关于使用Unity中的Json将我的游戏对象保存在地图中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

unity小地图掉帧严重

Unity中怎么做小地图?unity如何制作游戏中的小地图啊?

脚本中的无限对象声明

Unity PlayerPrefs类进行扩展(整个对象进行保存)

我不能在 Unity 中的游戏对象前面有 UI 元素

Unity:将精灵保存/加载为 Json