27

在 Unity 中,我希望一个对象具有所有其他对象都可以访问的下降速度变量。由于各种原因,我不能使用内置的重力来做我想做的事情。

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

4

4 回答 4

30

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

如果您希望速度变量由附加到游戏对象的组件控制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 <SpeedController> ();
float courrentSpeed = speedController.speed;

注意只有一个名为 MyObject 的对象,否则事情会变得一团糟。

或者,您可以SpeedController在需要访问的每个类中定义一个成员,speed并通过在 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");

同样,您需要参考go第一个解决方案中描述的内容。

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

于 2012-12-15T14:00:14.737 回答
4

如果我是你,我会把这个速度变量设为“静态公共”,这样你就可以从任何地方访问它。您应该始终避免使用“find.anything”等功能,它们非常慢。你没有理由去寻找你确切知道它在哪里的东西。

于 2015-03-16T14:24:56.180 回答
2

如果它在 fixedUpdate 中 – Martin j

似乎它在 Awake 中也很有效。两个脚本都添加到同一个 GameObject 中。

public class FirstScript : MonoBehaviour {
    protected internal GameObject myobject;
private void Awake() {
       myobject = (GameObject)Instantiate(Resources.Load("nameofprefab"));
       myobject.transform.parent = gameObject.transform;
...
public class SecondScript : MonoBehaviour {
    private GameObject myobject;
private void Awake() {
       myobject = gameObject.GetComponent<FirstScript>().myobject;
       myobject.SetActive(false); //for example
...       
于 2019-02-23T13:11:12.513 回答
0
other.GetComponent<class name>().object name;
于 2016-08-31T08:26:44.310 回答