2017-01-04 4 views
2

У меня проблема с моим персонажем, когда он взаимодействует с ящиком. У меня есть геймобжекты плеер со скриптом, прикрепленным к нему, чтобы взаимодействовать с коробками в игре, сценарий:Пытается взаимодействовать с компонентом на объекте, пораженном raycast, получая NullReferenceException

using UnityEngine; 
using System.Collections; 

public class PlayerBox : MonoBehaviour { 

    public bool active = true; 
    public KeyCode key = KeyCode.E; 

    float distance = 2F; 
    RaycastHit obj; 
    BoxManager box; 

    void Start() { 
     box = GetComponent<BoxManager>(); 
    } 

    void Update() { 
     if (active && Input.GetKeyDown (key) && Physics.Raycast (this.transform.position, this.transform.forward, out obj, distance)) { 
      if (obj.collider.gameObject.tag == "Box") { 
       box.Open(); 
       Debug.Log("aperto " + box); 
      } 
     } 

    } 
} 

В сцене есть геймобжекты Box с помощью сценария для управления поведением:

using UnityEngine; 
using System.Collections; 

public class BoxManager : MonoBehaviour { 

    public void Open() { 
     Debug.Log ("Dentro"); 
    } 
} 

последний сценарий должен напечатать журнал, но когда я общаюсь с ним я получаю

NullReferenceException: ссылка на объект не указывает на экземпляр объекта PlayerBox.Update() (в Assets/E TSMB/Script/Use/PlayerBox.cs: 23)

Как правильно установить box экземпляру объекта?

+0

Вы уверены, что номер строки верен, что номер строки указывает на закрывающую фигуру из if. Что такое null, это действительно то, что вам нужно узнать ... – Dave3of5

ответ

1

Проблема здесь в том, что вы ищете в неправильном месте для BoxManager компонента при присвоить значение box в методе Start():

void Start() { 
    box = GetComponent<BoxManager>(); 
} 

GetComponent<BoxManager>() будет искать компонент BoxManager на текущий скрипт GameObject (GameObject PlayerBox, в данном случае). Однако, исходя из вашей формулировки, это звучит так: BoxManager и PlayerBox находятся на двух разных GameObjects, поэтому вы не можете найти компонент таким образом. Попытка сделать это просто даст box значение null, что является причиной исключения NullReferenceException при вызове box.Open().

Что вам нужно сделать, вместо того, чтобы это получить BoxManager от объекта, который вы получите обратно от Physics.Raycast() - так что удалить, что в вашем методе Start() и переписать содержимое вашего метода Update() к:

void Update() { 
    if (active && Input.GetKeyDown (key) && Physics.Raycast (this.transform.position, this.transform.forward, out obj, distance)) { 
     if (obj.collider.gameObject.tag == "Box") { 
      // Get the BoxManager from the object that has been hit 
      box = obj.collider.gameObject.GetComponent<BoxManager>(); 
      box.Open(); 
      Debug.Log("aperto " + box); 
     } 
    } 
} 

Надеется, что это помогает ! Дайте знать, если у вас появятся вопросы.

+0

Спасибо, что он работает и в других коробках – shawk

+0

@ DannyIelpo Отлично, рад, что я смог помочь! Не забывайте, что как только вы получите ответ, который удовлетворит ваш вопрос, вы должны его принять (нажмите галочку рядом с ним), чтобы показать всем, что ваша проблема решена. (Это также дает вам некоторые интернет-точки, если это ваша вещь.) – Serlite

1

Проблема:

void Start() { 
    box = GetComponent<BoxManager>(); 
} 

ищет компонент BoxManager на PlayerBox, а не ваш BoxManager игры объекта в сцене. Итак, если на игровом объекте PlayerBox нет скрипта BoxManager, поле будет равно null. Следовательно, ваше сообщение об ошибке.

Есть несколько способов, чтобы найти объекты в сцене (см: FindObjectsOfType), но самый простой для примера будет сделать BoxManager будки:

public BoxManager box; 

void Start() { 
    //box = GetComponent<BoxManager>(); 
} 

Затем в редакторе единства, сопротивления и отбросить объект BoxManager из иерархии сцены в полевую переменную инспектора объекта PlayerBox.

Теперь все подключено, и вы больше не должны получать исключение из null-указателя.

+0

Это хорошо работает, если в игре есть только один «BoxManager», но может быть не лучше всего подходит для ситуации, когда есть несколько ящиков (что предлагает OP говоря, что игроку нужно «взаимодействовать с коробками в игре», множественное число). – Serlite

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