在Unity中,如何将值从一个脚本传递到另一个脚本?

在Unity中,我希望一个对象具有一个所有其他对象都可以访问的下降速度变量。 出于各种原因,我无法使用内置的引力来实现我的目标。

如何重复访问一个对象中的变量,以便在更新时从另一个对象获取更新的变量?

有几种方法可以实现这一目标。

如果您希望速度变量由附加到GameObject MyObject的组件控制

 public class SpeedController : MonoBehaviour public float speed; // maybe you want restrict this to have read access, then you should use a property instead 

在其他课程中,您可以:

 GameObject go = GameObject.Find ("MyObject"); SpeedController speedController = go.GetComponent  (); float courrentSpeed = speedController.speed; 

请注意,只有一个名为MyObject的对象,否则会搞乱。

或者,您可以在需要访问speed每个类中定义SpeedController成员,并通过Unity编辑器中的拖放设置引用。 然后保存查找,但是如果在许多类中需要,这当然非常不方便。


另一种方法是创建一个包含speed变量的单例,并具有:

 public class MyGlobalSpeedController { private static MyGlobalSpeedController instance = null; public static MyGlobalSpeedController SharedInstance { get { if (instance == null) { instance = new MyGlobalSpeedController (); } return instance; } } public float speed; } 

所以所有类都可以访问:

 float currentSpeed = MyGlobalSpeedController.SharedInstance.speed 

正如Jan Dvorak在评论部分所述:

 public class SpeedController : MonoBehaviour public static float speed; 

[更新]感谢Jerdak。 是的Component.SendMessage肯定应该在列表中:

 go.SendMessage("GetFallingSpeed"); 

您需要再次参考第一个解决方案中描述的内容。

这个问题还有更多解决方案。 如果您正在考虑在所有场景中都处于活动状态的游戏对象,您应该查看Unity单例管理器类

如果我是你,我会让这个速度变量“静态公开”,这样你就可以从任何地方访问它。 你应该总是避免“find.anything”等function,它们很慢。 你没有理由寻找你确切知道它在哪里的东西。

 other.GetComponent().object name;