【问题标题】:Unity3d - Call public static variable performanceUnity3d - 调用公共静态变量性能
【发布时间】:2026-01-13 08:20:07
【问题描述】:

我想知道如果我在 Update 或 FixedUpdate 函数中从另一个脚本调用公共静态变量,这会影响性能吗?

类似:

[RequireComponent(typeof(Rigidbody))]

public class CC : MonoBehaviour
{
    //Components
    public static Rigidbody rigidbodys;

    void Awake()
    {
        rigidbodys = GetComponent<Rigidbody>();
        rigidbodys.freezeRotation = true;
        rigidbodys.useGravity = false;
        rigidbodys.isKinematic = true;
    }
}

在另一个脚本中:

void FixedUpdate()
{
      if(CC.rigidbodys.velocity > 1)
          {
            DoSomething();
          }
}

如果我用这种方式,会不会降低性能?

【问题讨论】:

  • 与问题无关,但我认为您不希望刚体成员是静态的。 CC 是一种单一行为,可能附加到许多不同的游戏对象,每个都有自己的 OWN 刚体。静态修改器意味着所有 CC 实例将共享相同的单个刚体参考。 [如果 CC 是一个单例(意味着场景中只有一个),那么它可能并不重要。]

标签: c# performance variables unity3d static


【解决方案1】:

看起来很不错。 在您的固定更新中,您只能访问刚体(在清醒状态下设置一次),这很便宜。 您还可以制作一个普通的public Rigidbody rigbdy,然后在检查器中传递您配置的游戏对象。然后你可以将内容传递给你的静态刚体。所以你清理了觉醒。

    void Awake()
    {
        rigidbodys = ridbdy;
    }

从性能方面(> 表示更好): 静态 > 单例模式 > GetComponent/FindObject

【讨论】:

  • 谢谢,但我的问题在第二部分。当我在另一个脚本中调用静态rigidbody 时。我想知道这是一个好方法吗?还是不?
  • 我知道,这是一个好方法。在性能上比 Singletone Pattern 更好,这是从另一个类中获取刚体并确保只有一个实例的另一种方法。您可以在游戏中拥有许多 CC 实例,并且都写入同一个静态刚体。
【解决方案2】:

只要你让 getComponent() 离开 update(),它就会比在其他脚本中计算速度更快。

【讨论】:

  • 它是一个公共静态,而不仅仅是一个公共变量!公共静态变量不需要getcomponent()
  • 是的,你是对的。但我的意思是刚体。
  • getComponent() 是代码中最慢的部分,因此最好将其置于清醒状态。如果您只需要在固定更新期间检查一次,那么提供的代码就可以了;如果在一帧内多次需要条件,可以考虑将其存储在局部变量中,例如 isMoving =rigidBody.velocity > 0.0f。
  • 谢谢,但我的问题在第二部分。当我在另一个脚本中调用静态rigidbody 时。我想知道这是一个好方法吗?或不 ? @BorisLi
  • 对于您的情况,我想不出更好的替代方案,因此,我会说这是一个好方法。