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

时间:2012-12-15 11:49:01

标签: c# unity3d

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

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

4 个答案:

答案 0 :(得分:25)

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

如果您希望速度变量由附加到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 singleton manager classes

答案 1 :(得分:4)

如果我是你,我会让这个速度变量&#34;静态公共&#34;所以你可以从任何地方访问它。你应该总是避免&#34; find.anything&#34;等功能,它们很慢。你没有理由去寻找你确切知道的地方。

答案 2 :(得分:2)

  

如果在fixedUpdate中-Martin j

似乎在Awake中也很好用。这两个脚本都添加到相同的GameObject中。

import dis
dis.disassemble(make_dropdown_data.__code__)
public class FirstScript : MonoBehaviour {
    protected internal GameObject myobject;
private void Awake() {
       myobject = (GameObject)Instantiate(Resources.Load("nameofprefab"));
       myobject.transform.parent = gameObject.transform;
...

答案 3 :(得分:0)

RUN echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' > /etc/nsswitch.conf