Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Unity3D-GameObject.Find()与检查器分配性能_C#_Performance_Unity3d - Fatal编程技术网

C# Unity3D-GameObject.Find()与检查器分配性能

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

我正在为android做一个pacman的移动克隆。一切都很好,但我正在尽可能地优化我的游戏

目前在一些脚本中,我通过在脚本的
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()慢得多,不过,大多数情况下,它仍然不重要!…:[链接]()