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

Dak*_*ras 19 c# unity-game-engine

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

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

Kay*_*Kay 26

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

如果您希望速度变量由附加到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
Run Code Online (Sandbox Code Playgroud)

在其他课程中,您可以:

GameObject go = GameObject.Find ("MyObject");
SpeedController speedController = go.GetComponent <SpeedController> ();
float courrentSpeed = speedController.speed;
Run Code Online (Sandbox Code Playgroud)

注意只有一个名为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;
}   
Run Code Online (Sandbox Code Playgroud)

所以所有类都可以访问:

float currentSpeed = MyGlobalSpeedController.SharedInstance.speed
Run Code Online (Sandbox Code Playgroud)

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

public class SpeedController : MonoBehaviour
    public static float speed;
Run Code Online (Sandbox Code Playgroud)

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

go.SendMessage("GetFallingSpeed");
Run Code Online (Sandbox Code Playgroud)

您需要再次引用go第一个解决方案中描述的内容.

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

  • 不要忘记[SendMessage](http://docs.unity3d.com/Documentation/ScriptReference/Component.SendMessage.html)这是def.不是最好的选择,但它偶尔会有用. (2认同)

小智 5

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

  • 我正在阅读这些答案,想知道这个答案出了什么问题? (3认同)