我的简单脚本应该跟随播放器,但它停止使用“播放器”标签找到游戏对象... 我能找到的唯一解决方案是创建一个新标签,将其分配给我的播放器,然后更改所有脚本中的标签名称。
我找到了另一种找到玩家对象的方法,我更喜欢它,但我是新手,并且不知道它是否会影响性能。 这是我的原始代码无法正确找到标记
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;
}
有人请让我知道,因为我是新手,我不想开始做错事。谢谢!
答案 0 :(得分:1)
你的第二个代码是完全正确的。有些人使用FindGameObjectWithTag()
但其他人使用公共变量。这就是Unity首先在编辑器中提供它们的原因。所以你可以把东西拖到脚本上:))
当我处于和你一样的情况时,我个人使用公共变量,也就是说,你有一个脚本和一个你希望它附加到脚本的播放器。
我认为在这种情况下,使用公共变量实际上是正确的做法。想象一下,如果您稍后决定制作另一个播放器预制件,切换到那个,做一些测试,稍后再切换......您可以在编辑器中轻松更改它们。如果您使用FindGameObjectWithTag()
,则必须更改两个预制件上的标签。容易出错。
现在假设您有多个使用播放器的脚本。在这种情况下,如果要更改播放器预制件,则必须手动更改编辑器中的所有引用。这是很多工作,所以也许你只想重新标记一些东西。
在性能方面,使用公共变量实际上更快,因为它是对象的直接引用,而FindGameObjectWithTag()
将查找对象。但这并不重要,因为FindGameObjectWithTag()
非常快。
答案 1 :(得分:0)
这应该不是性能问题。 FindGameObjectWithTag返回与您作为参数传递的标记匹配的对象列表,通常在有多个具有该标记的对象时使用。 在您有许多具有标记的对象并且需要对它们全部引用的场景中,通过公共变量手动引用它们是不切实际的;更重要的是,可能存在动态生成的对象,在创建它们之前无法引用它们。