使用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如何制作游戏中的小地图啊?