2016-04-14 2 views
4

В моем Unity 4.3 все работает хорошо, но после обновления до 5 У меня проблема с GetComponent. Для того, чтобы протестировать новый deprecable GetComponent я должен использовать официальный учебникОбновление GetComponent с 4 до 5 не работает

using UnityEngine; 
using System.Collections; 
public class test : MonoBehaviour { 
public GameObject otherGameObject; 
private AnotherScript anotherScript; 
void Awake() 
{ 
    anotherScript = GetComponent<AnotherScript>(); 
} 

void Update() 
{ 
    Debug.Log("The player's score is " + anotherScript.playerScore); 
} 
} 

И второй сценарий

using UnityEngine; 
using System.Collections; 
public class AnotherScript : MonoBehaviour { 
public int playerScore = 9001; 
} 

Это только для тестирования,

я использовал тот же самый пример единства Учебное пособие https://unity3d.com/learn/tutorials/modules/beginner/scripting/getcomponent

После этого я связал два объекта в редакторе. Но отчет о запуске:

NullReferenceException: Ссылка на объект не указывает на экземпляр объекта test.Update() (на активы/test.cs: 22)

в единстве 4.3 работают хорошо.

+0

Попробуйте добавить конструктор к классу '' AnotherScript'', как 'public AnotherScript() {playerScore = 9001;}' это также означает, что при объявлении переменной вы должны удалить часть, где ей присвоено значение –

+1

@AlfieGoodacre. Нет. ** Никогда ** используйте конструктор в сценарии Unity, который происходит от «MonoBehavior». – Programmer

+0

@ Программист жаль, что я не лучший с Единством, поэтому я не ответил, 'Start()' то, может быть? :) –

ответ

4

Вам следует попробовать получить ссылку в методе «Пуск». Убедитесь, что оба сценария прикреплены к одному и тому же GameObject в редакторе, тогда код должен работать.

using UnityEngine; 
using System.Collections; 

public class test: MonoBehaviour 
{ 
    public int playerScore; 

    void Start() 
    { 
     anotherScript = gameObject.GetComponent<AnotherScript>(); 
    } 

    void Update() 
    { 
     Debug.Log("The player's score is " + anotherScript.playerScore); 
    } 
} 

Если оба Сценарии не прилагается к-же GameObject затем использовать:

anotherScript = GameObject.Find("Name of GameObject AnotherScript is Attched To").GetComponent<AnotherScript>(); 
+0

Когда я сказал, сделайте это в начале, я имел в виду 'GetComponent ();' в функции Start вместо Awake. -1 не от меня. Исправлено это для вас. – Programmer

+0

@Programmer Это должно быть в Awake, хотя. И текущий ответ не имеет смысла, вы объединили эти два сценария в один. – FINDarkside

+0

@FINDarkside. Нет. Это не нужно делать в «Пробудитесь». Предполагая, что оба скрипта привязаны к одному и тому же GameObject, это должно работать. – Programmer

2

Вы уверены, что AnotherScript также прилагается к тому же геймобжекты вас тест-скрипт прикреплен к?

Метод GetComponent предназначен только для компонентов, прикрепленных к GameObjects.

Простым способом было бы, конечно, сделать публикацию другого члена (так что он будет открыт в инспекторе) и перетащить ваш скрипт туда, чтобы получить ссылку.

3

Вам нужно использовать FindObjectOfType<AnotherScript>(), если скрипты не подключены к одному и тому же GameObject.

3

Я считаю, что это должно быть так:

public GameObject otherGameObject; 


private AnotherScript anotherScript; 


void Awake() 
{ 
    anotherScript = otherGameObject.GetComponent<AnotherScript>(); 

} 

void Update() 
{ 
    Debug.Log("The player's score is " + anotherScript.playerScore); 
} 

} 

И вы должны приложить otherGameObject в редакторе.

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