【问题标题】:How to store a list of GameObjects with all components (scripts, colliders etc)如何存储包含所有组件(脚本、碰撞器等)的 GameObjects 列表
【发布时间】:2019-05-25 15:19:01
【问题描述】:

我将游戏中所有建筑物的信息存储在一个列表中。每个建筑物都有一个附有其信息的脚本。 我正在使用保存工具,它会再次加载列表,如果我开始我的游戏,游戏对象会出现,但没有必要的信息。有没有简单的方法来解决这个问题?我可以为示例创建一个包含所有脚本的第二个列表并在重新启动后重新附加它们吗?

这是我的清单:

    public static List<GameObject> buildingsList = new List<GameObject>();

而我现在所做的一切都是在唤醒方法中重新加载这个列表,并且构建出现,但没有任何信息。

    private void Awake()
    {
        if (ES3.KeyExists("buildingsList"))
            buildingsList = ES3.Load<List<GameObject>>("buildingsList");
        else
            Debug.Log("There aren't any buildings yet!");
    }

如果我在 Game 中建造新房子,会调用以下代码:

      buildingsList.Add(clone);
      ES3.Save<List<GameObject>>("buildingsList", buildingsList);

ES3 在重启时会加载这个列表。问题是,该列表仅包含游戏对象,没有任何有关附加内容的信息。

【问题讨论】:

  • 我担心这个问题太宽泛了。似乎这个 ES3 使用某种字典来存储信息。将其转换为“深拷贝”游戏对象的所有属性需要一些重大修改和反思。此外,并非所有类型和组件都受支持,请参阅 Supported types
  • @derHugo 这是否意味着带有 GameObjects 的列表包含有关附加脚本及其初始保存值的所有信息,而我使用 ES3 方法丢失了这些信息? - 因为在 Supported Types 文档中写到它支持 GameObject 的所有组件。
  • A List&lt;GameObject&gt; 存储对 GameObjects 的引用。它不存储任何进一步的信息。在 Unity 中,您可以使用 GetComponent 之类的东西来获取对这些组件的引用。您可以尝试使用Component[] components = someGameObject.GetComponents&lt;Component&gt;(); 来获取GameObject 上的所有组件并将它们也存储起来.. 但正如再次所说,它基本上将是对组件的引用.. 我不知道ES3 在内部和并非所有组件类型都受支持。
  • 这绝对感觉就像您正在重新创建一个预制件(或者可能是一个场景)。你这样做有充分的理由而不是使用预制件或场景吗?预制件和场景的加载速度都比任何自定义序列化方法都快。

标签: c# list unity3d save gameobject


【解决方案1】:

这听起来像是 Serialization可能 ScriptableObjects 的工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 2017-09-25
    相关资源
    最近更新 更多