从文件读取比GameObject.Find更有效?

时间:2019-02-26 21:40:02

标签: c# unity3d

嘿,我是Unity的新手,我开始创建塔防游戏。目前,我可以创建一个关卡,并让怪物生成并沿着我用空GameObjects(Waypoints)创建的路径行走。我还可以将Heroes拖放到名为(PlacePoints)的某些位置;这些也是空的GameObjects。这是我的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可以充当分发服务器吗?信息将是:

  • 生成时间
  • (SpawnPoint,Waypoint,PlacePoint等)的位置
  • 敌人类型

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如上所述,它实际上取决于您要搜索的项目数以及编写代码的方式。根据我的理解,直接引用(例如在检查器中设置变量)是“查找”场景中最有效的方法。

除非您在更新中做了很多工作,否则它确实不会对性能造成很大的影响。我将优化时间集中在不破坏/实例化,使UI更新不出现在游戏循环中以及使常用脚本保持明亮的脚本上。

希望这会有所帮助!

答案 2 :(得分:0)

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