Unity C#如何跨类共享数据?

时间:2015-03-02 03:28:16

标签: c# unity3d

我正在尝试开发一种统一游戏,用户根据输入到texbox中的数据移动对象。但我无法使文本框中的数据应用于我想要移动的对象。 这是文本框的C#脚本:

using UnityEngine;
using System.Collections;

public class ButtonText : MonoBehaviour
{

private bool defineModel = false;
    string beta = "";
    public float number ;
    bool res ;

    void OnGUI()
    {
        if (!defineModel) {
                if (GUI.Button (new Rect (0, 0, 150, 20), "Define a shift"))
                                defineModel = true;
              } else {  
                        beta = GUI.TextField (new Rect (250, 157, 250, 25), beta, 40);
                         res = float.TryParse(beta, out number); 
                         if (res == false) { print("String is not a number");  }
                         else { number = float.Parse(beta);  }

                    if (GUI.Button (new Rect (300, 250, 100, 30), "OK")) {
                            if(!res) return;
                else { Debug.Log (" number = "  + number);
                                defineModel = false;
                                return; }

                        }
                }

    }

这里是创建一个在游戏中移动的球体的脚本

using UnityEngine;
using System.Collections;

public class CloneSphere : MonoBehaviour 
{
    public GameObject sphere;
    void Start() 
    {
        GameObject sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); // Make a new sphere
        sphere.name = "Sphere"; // give it a name
        sphere.transform.position = new Vector3(0, 0, 0); // position the sphere
        }
    float number;

    void Update () {
    sphere = GameObject.Find("Sphere");
        float location = GetComponent<ButtonText>().number ;
        sphere.transform.Translate(0, location ,0, Space.World); 
    }
}

后一个脚本的最后两行会产生错误(即,如果我将这两行注释掉,则没有错误): NullReferenceException:未将对象引用设置为对象的实例。 CloneSphere.Update()(在Assets / CloneSphere.cs:20)

这里有什么问题?我该怎么做这个号码&#34; location&#34;适用于球体的垂直位移?

1 个答案:

答案 0 :(得分:0)

看起来您的两个脚本未附加到同一个对象:当ScriptA调用GetComponent<ScriptB>()时,它会假定它们已附加到同一个对象,否则它可以永远不会工作在整个加载场景(仅限活动对象)中工作的解决方案是FindObjectOfType<ScriptB>()

虽然FindObjectOfType<T>()不是一个非常快速的功能。它更适合编码玩具/测试代码,以及真正无法以任何其他方式工作的代码。 (特别是,单例更快,这是一个只有一个实例的类,以及一个引用该实例的静态访问器。)