我正在尝试开发一种统一游戏,用户根据输入到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;适用于球体的垂直位移?
答案 0 :(得分:0)
看起来您的两个脚本未附加到同一个对象:当ScriptA
调用GetComponent<ScriptB>()
时,它会假定它们已附加到同一个对象,否则它可以永远不会工作在整个加载场景(仅限活动对象)中工作的解决方案是FindObjectOfType<ScriptB>()
。
虽然FindObjectOfType<T>()
不是一个非常快速的功能。它更适合编码玩具/测试代码,以及真正无法以任何其他方式工作的代码。 (特别是,单例更快,这是一个只有一个实例的类,以及一个引用该实例的静态访问器。)