【问题标题】:Unity Performance Issues Finding Game Objects?Unity 性能问题查找游戏对象?
【发布时间】:2014-02-24 15:45:35
【问题描述】:

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

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

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;
}

有人请告诉我,因为我是新手,我不想一开始就以错误的方式做事。谢谢!

【问题讨论】:

  • 我同意你的观点,第二个代码示例更简洁
  • 它会影响性能,第二个脚本要快得多,因为它已经有了参考。第一个脚本必须迭代场景中的所有对象,比较它们的标签。你真的应该尽可能避免这种情况,并且只在真正动态的情况下使用它。

标签: c# performance unity3d monodevelop


【解决方案1】:

您的第二个代码是绝对正确的。有些人使用FindGameObjectWithTag(),但其他人确实使用公共变量。这就是 Unity 一开始就在编辑器中提供它们的全部原因。所以你可以把东西拖到脚本里:)

当我遇到与您类似的情况时,我个人会使用公共变量,即您有一个脚本和一个希望将其附加到脚本的 Player。

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-13
      • 1970-01-01
      • 2016-01-28
      相关资源
      最近更新 更多