Unity性能问题寻找游戏对象?

时间:2014-02-24 02:48:04

标签: c# performance unity3d monodevelop

我的简单脚本应该跟随播放器,但它停止使用“播放器”标签找到游戏对象... 我能找到的唯一解决方案是创建一个新标签,将其分配给我的播放器,然后更改所有脚本中的标签名称。

我找到了另一种找到玩家对象的方法,我更喜欢它,但我是新手,并且不知道它是否会影响性能。 这是我的原始代码无法正确找到标记

public Vector3 offset;
private Transform player;

void Awake (){
    player = GameObject.FindGameObjectWithTag("Player").transform;
}
void Update (){
    transform.position = player.position + offset;
}    

如果我将其公开,那么我可以将我的播放器对象拖到检查器中的脚本上,这是否会影响性能,这不是一个好主意吗?

我的常识告诉我这是一个糟糕的方法,因为我已经看过其他人的脚本,他们使用FindGameObjectWithTag()。为什么要在你可以这样做的时候经历编写额外线条的麻烦......

public Vector3 offset;          // The offset at which the Health Bar follows the player.   
public Transform player;        // Reference to the player.

void Update ()
{
    transform.position = player.position + offset;
}

有人请让我知道,因为我是新手,我不想开始做错事。谢谢!

2 个答案:

答案 0 :(得分:1)

你的第二个代码是完全正确的。有些人使用FindGameObjectWithTag()但其他人使用公共变量。这就是Unity首先在编辑器中提供它们的原因。所以你可以把东西拖到脚本上:))

当我处于和你一样的情况时,我个人使用公共变量,也就是说,你有一个脚本和一个你希望它附加到脚本的播放器。

我认为在这种情况下,使用公共变量实际上是正确的做法。想象一下,如果您稍后决定制作另一个播放器预制件,切换到那个,做一些测试,稍后再切换......您可以在编辑器中轻松更改它们。如果您使用FindGameObjectWithTag(),则必须更改两个预制件上的标签。容易出错。

现在假设您有多个使用播放器的脚本。在这种情况下,如果要更改播放器预制件,则必须手动更改编辑器中的所有引用。这是很多工作,所以也许你只想重新标记一些东西。

在性能方面,使用公共变量实际上更快,因为它是对象的直接引用,而FindGameObjectWithTag()将查找对象。但这并不重要,因为FindGameObjectWithTag()非常快。

答案 1 :(得分:0)

这应该不是性能问题。 FindGameObjectWithTag返回与您作为参数传递的标记匹配的对象列表,通常在有多个具有该标记的对象时使用。 在您有许多具有标记的对象并且需要对它们全部引用的场景中,通过公共变量手动引用它们是不切实际的;更重要的是,可能存在动态生成的对象,在创建它们之前无法引用它们。