一尘不染

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

c#

在Unity中,我希望一个对象具有一个下降速度变量,其他所有对象都可以访问该变量。由于各种原因,我无法将内置重力用于尝试执行的操作。

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


阅读 2030

收藏
2020-05-19

共1个答案

一尘不染

有几种方法可以实现此目的。

如果要让速度变量由附加到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 <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单例管理器类

2020-05-19