【问题标题】:Reading from file more efficient than GameObject.Find?从文件中读取比 GameObject.Find 更有效?
【发布时间】:2019-02-26 21:40:02
【问题描述】:

嘿,我是 Unity 的新手,我开始创建一个塔防游戏。目前我可以创建一个关卡并让怪物产生并沿着我用空游戏对象(Waypoints)制作的路径行走。我还可以将英雄拖放到称为( PlacePoints )的某些地方;这些也是空的游戏对象。这是我的 Level_1 预制件的图片:

Level_1

到目前为止,这一切都运行良好,但我了解到 GameObject.Find 和 Transform.Find 很慢。既然我想从一开始就编写快速、干净的代码,我该如何让它更快、更高效?这是我的 LevelManager 脚本中的一个示例:

public Transform findPlacePoints()
{
    return GameObject.Find("Level_1(Clone)").transform.Find("PlacePoints");
}

问题是,将所有信息存储在 .txt 文件中并将其加载到我的 LevelManager 中,然后让每个脚本找到作为 Singleton 的 LevelManager 并询问具体信息会更快吗?基本上让LevelManager充当分发者?信息将是:

  • 生成时间
  • (SpawnPoints、Waypoints、PlacePoints 等)的位置
  • 敌人类型

【问题讨论】:

    标签: c# unity3d


    【解决方案1】:

    不要落入Premature Optimization的陷阱。 GameObject.Find 只有当你让它变慢时才会变慢(在你的场景中搜索很多对象)。如果您想了解如何在 Unity 中编写好的模式,请查看 Unity Optimizing Scripts in Unity Games提高代码性能 部分。它应该为您提供一些提示,而不必担心深入了解GameObject.Find 和磁盘操作优化。

    【讨论】:

    • 感谢您的回答,优化脚本的一般提示非常有帮助:)
    【解决方案2】:

    如前所述,这实际上取决于您要搜索的项目数量以及您如何编写代码。据我了解直接引用,例如在检查器中设置变量,是在场景中“查找”某些内容的最有效方式。

    除非您在更新中经常这样做,否则它确实不应该对性能造成太大影响。我会将优化时间集中在不破坏/实例化、将 UI 更新排除在游戏循环之外以及将轻量级脚本保留在经常使用的对象上。

    希望这会有所帮助!

    【讨论】:

      【解决方案3】:

      我会做的(不是说它是最好的)是有一个静态类来存储一些信息(不是单一行为),比如说实用程序。在其中有一个公共 GameObject[] 航路点。在您的每个关卡上,添加一个脚本,该脚本将使用它自己的 GameObject[] 变量覆盖 Utilities.waypoints。在检查器中,只需将您的航点拖放到此脚本上即可。然后你可以调用 Destroy(this),它只会在完成后删除脚本。

      【讨论】:

        猜你喜欢
        • 2010-12-25
        • 2018-10-15
        • 1970-01-01
        • 2014-04-15
        • 2010-10-07
        • 1970-01-01
        • 2022-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多