2015-03-02 3 views
0

Я пытаюсь разработать игру единства, в которой пользователь перемещает объекты вокруг accoding к данным, введенным в texbox. Но я не могу сделать данные из текстового поля применимыми к объекту, который я хочу переместить. Вот C# скрипт для текстового поля:Unity 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() (at Assets/CloneSphere.cs: 20)

Что здесь не так? Как я могу сделать это число «местоположение» применимым к вертикальному смещению сферы?

+0

Тэг Unity в SO не предназначен для игрового движка Unity3d. Используйте тег единства. –

ответ

0

Похоже, что ваши два сценария не привязаны к одному и тому же объекту: когда ScriptA вызывает GetComponent<ScriptB>(), предполагается, что они прикреплены к одному и тому же объекту, иначе он никогда не сможет работать. Решение, которое работает на всей загруженной сцене (только активные объекты), равно FindObjectOfType<ScriptB>().

Хотя FindObjectOfType<T>() не очень быстрая функция. Это больше подходит для кода кодов игрушек/тестирования, а код, который действительно не может работать каким-либо другим способом. (В частности, синглтоны быстрее, это класс, который имеет только один экземпляр и статический аксессор, который ссылается на этот экземпляр.)

+0

Спасибо; что помогло. Вы правы, что я установил текстовое поле и shpere как разные игровые объекты. Только что я удалил сферу, а затем добавил скрипт CloneShpere к объекту ButtonText (используя кнопку «Добавить компонент»). Теперь шара движется. –

+0

Рад помочь. Кстати, вы можете нажать значок «Проверить» рядом с ответом, чтобы принять ответ как правильный. – piojo

+0

Является ли тот же самый текстовый скрипт для каждого объекта (например, сферы) единственным решением? Моя цель - щелкнуть текстовое поле «ОК», чтобы определить «набор данных» местоположений, по одному месту для каждого из многих объектов (например, потенциально тысячи). Каждому конкретному объекту требуется только доступ к его конкретному местоположению, чтобы переместить его. Поэтому мне кажется неэффективным, чтобы весь объект текстового поля был привязан к каждой сфере! –

Смежные вопросы