2016-01-26 2 views
0

У меня есть объект, у которого есть компонент скрипта.Unity3D: Несовместимость переменных скрипта с использованием OnTriggerEnter2D

public class TeleportReference : MonoBehaviour { 
    private GameObject reference; 

    void Start() { 
     reference = null; 
    } 

    public void SetReference(GameObject other){ 
     reference = other; 
    } 

    public GameObject GetReference(){ 
     return reference; 
    } 

Теперь, если при поиске объекта и проверить переменные сценария

GameObject test = GameObject.FindGameObjectWithTag("Water"); 
print(test); 
print(test.GetComponent<TeleportReference>()); 
print(test.GetComponent<TeleportReference>().GetReference()); 

это работает просто отлично и GetReference() возвращает переменную I сохраненную.

Но теперь, если я использую его Whithin OnTriggerEnter2D

private void OnTriggerEnter2D(Collider2D other) 
{ 
    if (other.tag == "Water") 
    { 
     print(other); 
     print(other.gameObject); 
     print(other.GetComponent<TeleportReference>()); 
     print(other.GetComponent<TeleportReference>().GetReference()); 
    } 
} 

GetReference() возвращает нуль (или другой переменной, которую я использовал при запуске() класса TeleportReference). Все остальные результаты тестирования остаются неизменными.

Может ли кто-нибудь дать подсказку, почему это может случиться? Означает ли это, что GetComponent создал второй экземпляр TeleportReference во втором случае?

+0

Где находится ваш код OnTriggerEnter2D? он прикреплен к объекту с помощью метки «Вода»? он привязан к другому объекту, чем «Вода»? –

+0

Когда коллайдеры входят друг в друга (и если они оба являются триггерами), на каждом из них вызывается 'OnTriggerEnter2D'. Я предлагаю вам 'Debug.Log (other.gameObject.name);' для обеспечения того, чтобы на них вызывали только указанные объекты. Надеюсь, это поможет! – andeart

ответ

0

Обнаружена проблема. Он был в порядке назначения переменных. То есть - изменения были сделаны заодно до вызова функции Start(). Таким образом, в какой-то момент кода сохраненное значение было переопределено до нуля.

Это прекрасно работает:

public class TeleportReference : MonoBehaviour { 
    private GameObject reference; 

    void Awake() { 
     reference = null; 
    } 

    public void SetReference(GameObject other){ 
     reference = other; 
    } 

    public GameObject GetReference(){ 
     return reference; 
    } 

Спасибо всем за комментарии, которые действительно помогли мне в отладке.

1

В последнем случае GetComponent не создал новый экземпляр TeleportReference. У меня есть аналогичный код в одном из моих проектов, и у меня не было никаких проблем. Поэтому в этом случае я бы посмотрел, есть ли проблема где-то в другом месте. Вы уверены, что это тот же объект «Вода»? У вас есть несколько объектов с тегом «Вода»? Вы сталкиваетесь, прежде чем назначить ссылку? Там может быть множество вещей. Просто проверьте, чтобы сузить его.

Например, попробуйте выполнить действие над объектом other.gameObject, чтобы убедиться, что это правильный объект, например, его деактивация. Также попробуйте использовать other.gameObject.GetComponent (не уверен, что это имеет значение).

+0

Спасибо, Пол, я это испытал. В этом случае есть только один объект «Вода». И первый тест, который работал отлично, был сделан до столкновения. Я боюсь, поскольку не вижу, что здесь может пойти не так. – Alex

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