C# Unity3D-GameObject.Find()与检查器分配性能
我正在为android做一个pacman的移动克隆。一切都很好,但我正在尽可能地优化我的游戏 目前在一些脚本中,我通过在脚本的C# Unity3D-GameObject.Find()与检查器分配性能,c#,performance,unity3d,C#,Performance,Unity3d,我正在为android做一个pacman的移动克隆。一切都很好,但我正在尽可能地优化我的游戏 目前在一些脚本中,我通过在脚本的Start()函数中执行GameObject.Find()来查找GameObject,如下所示: void Start() { ghosts = GameObject.FindGameObjectsWithTag("Ghost"); pacman = GameObject.Find("Pacman"); gameManager
Start()
函数中执行GameObject.Find()
来查找GameObject
,如下所示:
void Start()
{
ghosts = GameObject.FindGameObjectsWithTag("Ghost");
pacman = GameObject.Find("Pacman");
gameManager = GameObject.Find("Game Manager").GetComponent<GameManager>();
}
void Start()
{
ghosts=GameObject.FindGameObjectsWithTag(“Ghost”);
pacman=GameObject.Find(“pacman”);
gameManager=GameObject.Find(“游戏管理器”).GetComponent();
}
我的问题是,如果我让这些GameObject
的检查器分配一些变量,而不是执行.Find()
,性能会提高吗
这会提高性能速度吗?还是会像我在Start()
函数中执行.Find()
那样没有任何区别
显然,如果在
Update()
中调用它,性能会下降,因为脚本会尝试在每一帧中查找GameObject
,但是Start()
函数只会搜索一次它?这种事情在启动时的性能完全可以忽略不计,检查器分配需要反序列化,虽然Find
需要发送消息,但这两种操作都很慢,如果您认为这很重要,请对此进行分析
反正我会用
FindObjectOfType()作为游戏管理器
如果可能的话,我不会使用编辑器检查,因为手动接线是许多小错误的根源。因此,我给出了一个人工时间性能理由:
不要使用编辑器检查,因为如果您没有连接到某些东西,您将不得不调试一个空指针,从长远来看,它将占用您数小时的时间
无论如何,如果您不需要仅查找一个组件,就必须使用编辑器安全设置,而无需解决此问题(除非您使用的是Svelto或Svelto ECS,这是相当高级的主题。)不确定如何回答此问题。不,您不应该注意到任何性能变化,是的,当您在Start或Awake中使用Find()时,它只执行一次。感谢v有益的解释,像我这样的新开发人员可能需要注意的一点是FindObjectOfType()
查找此类型的第一个组件,因此如果您确定只有一个这样的组件,然后很好,例如我在场景中使用它,这取决于点击一个PolygonCallider2D
组件。但是对于同一场景中的animator组件,我有不止一个,所以我可能会使用GameObject.Find()
,甚至是Inspector。否则guess将需要使用FindObjectsOfType()
和for循环,迭代检查所需组件是否在其中,代码行数更多,因此不太整洁。很抱歉添加第二条注释,但此答案提供了更详细的解释,实际上是针对手机游戏,Inspector赋值比GameObject.Find()快得多,但同样地,如果你的游戏很小,它也可能无关紧要。同一页还提到了GameObject.FindWithTag()
比Find()快得多,但FindObjectOfType()慢得多,不过,大多数情况下,它仍然不重要!…:[链接]()