Проблема создания экземпляра готового объекта путем вызова функции во внешнем скрипте (Unity / C #) - PullRequest
0 голосов
/ 04 мая 2019

У меня проблемы с получением одного скрипта для вызова функции создания экземпляра из другого скрипта. На следующем рисунке показано, как мне настроить игровые объекты.

enter image description here

У меня есть 2 объекта, Thing1 и Thing2, которые перемещаются по экрану на основе сценария движения, который прикреплен к каждому из них. Thing1 также приложил скрипт реакции. Когда Thing1 и Thing2 сталкиваются, должна появиться Thing 3. К Thing3 прикреплен скрипт создания экземпляра, который содержит функцию с командой создания экземпляра.

Когда я вызываю функцию инстанцирования в скрипте инстанцирования (я поместил ее в функцию Start Thing3), она работает нормально. Однако, когда я вынимаю его оттуда и пытаюсь вставить в функцию запуска скрипта реакции, прикрепленного к Thing2, я не могу заставить его работать. В настоящее время я не получаю ошибки при компиляции, но как только игра запускается, я получаю следующее (поведение Thing1 и Thing2 также, похоже, отрицательно сказывается):

"NullReferenceException: Object reference not set to an instance of an object"

Когда я ищу причину этой ошибки, я обнаруживаю, что наиболее типичной причиной этого является сборный объект, не присоединяемый к сценарию. Тем не менее, у меня действительно есть сборник, прикрепленный к сценарию. Он присоединен к сценарию создания экземпляра, который содержит функцию создания экземпляра.

Ниже приведен код для сценария создания экземпляра и сценария реакции, который вызывает функцию создания экземпляра в сценарии установки.

//Instantiation
public class Thing3Instantiation : MonoBehaviour
{
    public GameObject thing3Obj;

    void Start()
    {
        //CreateThing3();
    }

    public void CreateThing3()
    {
        Instantiate(thing3Obj);
    }
}

И

//Reaction
public class Reaction : MonoBehaviour
{
    private Thing3Instatiation thing3instantiation;

    void Awake()
    {
        thing3instantiation = GetComponent<Thing3Instantiation>();
    }

    void Start()
    {
        thing3instantiation.CreateThing3();   //This line triggers the null error
    }

Есть идеи, что я делаю не так?

Ответы [ 2 ]

2 голосов
/ 04 мая 2019

Если я правильно понимаю ваши настройки:

  • Реакция на Thing1
  • Thing3Instantiation на Thing3

Поэтому, когда реакция пробуждается , он пытается найти компонент под названием Thing3Instantiation в своем собственном gameObject (Thing1).Но это не на Thing1, это на Thing3, поэтому GetComponent возвращает null.

Следовательно, ваше исключение NullReferenceException.

1 голос
/ 04 мая 2019

Ваша проблема на самом деле находится в строке Instantiate(thing3Obj);.

Другими словами ... Когда вы создаете сценарий, вам не назначат переменные, в вашем случае thing3Obj.Независимо от того, назначили ли вы их через Инспектора, когда Instanciated, вы получите чистую копию этого класса, нераспределенную.Вы должны назначить его перед вызовом, поэтому он дает исключение Null.

...