Создание объекта из скрипта

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Создание объекта из скрипта

Сообщение _ZEN_ 20 окт 2013, 14:27

Подскажите, пожалуйста, почему появляется ошибка:
NullReferenceException: Object reference not set to an instance of an object
TriggerCub1.Update () (at Assets/MyProject/Scripts/TriggerCub1.cs:55)

На сцене триггер. К нему приложен скрипт TriggerCub1:

Синтаксис:
Используется csharp
public a_01 a_01;
private bool trigger = false;

        void Update () {
                if (Input.GetKeyUp(KeyCode.End) && trigger) {
                trigger = false;
                a_01.nnn++;
                }
        }      
       
        public void OnTriggerEnter(Collider other) {
                if (other.gameObject.name == "MyPlayer") {
                trigger = true;
                }
        }

Из этого скрипта создаю на сцене объект, используя публичную переменную:
public GameObject thePrefab;
В Inspector в переменную скрипта thePrefab кладу свой префаб o_01. Этот префаб содержит в себе скрипт a_01:

Синтаксис:
Используется csharp
public int nnn;

        void Update () {
        Debug.Log(nnn);
        }


Почему скрипт a_01 не виден из скрипта TriggerCub1 и, как результат, переменная nnn не изменяется?
Если на сцену явно разместить префаб o_01, а не из скрипта, то всё работает.
_ZEN_
UNец
 
Сообщения: 18
Зарегистрирован: 02 окт 2013, 15:29

Re: Создание объекта из скрипта

Сообщение BornFoRdeatH 20 окт 2013, 14:51

а вы на 100 проц уверены что a_01 это переменная когда обращаетесь a_01.nnn++? или все таки это класс?
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Создание объекта из скрипта

Сообщение seaman 20 окт 2013, 14:56

1. Никогда не называйте переменные также как классы. И сами запутаетесь и всех остальных запутаете.
2. Каким образом у Вас присваивается переменная public a_01 a_01? Где вы ее присваиваете?
3. Судя по всему вопрос для почемучки, но пока подождем ответов топикастера.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Создание объекта из скрипта

Сообщение BornFoRdeatH 20 окт 2013, 15:41

seaman писал(а):1. Никогда не называйте переменные также как классы. И сами запутаетесь и всех остальных запутаете.
2. Каким образом у Вас присваивается переменная public a_01 a_01? Где вы ее присваиваете?
3. Судя по всему вопрос для почемучки, но пока подождем ответов топикастера.

Ну судя по всему достаточно дописать this, но это как-то криворуко :)
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Создание объекта из скрипта

Сообщение _ZEN_ 21 окт 2013, 14:25

BornFoRdeatH
а вы на 100 проц уверены что a_01 это переменная когда обращаетесь a_01.nnn++? или все таки это класс?

seaman
1. Никогда не называйте переменные также как классы. И сами запутаетесь и всех остальных запутаете.

Я лишь совсем недавно приступил к изучению Unity3d. Что же касаемо Ваших вопросов, то уверяю, что это не я выдумал конструкцию: public a_01 a_01; Вот, например, выдержка из статьи «Как скрипты общаются»:

-Мне часто задают вопрос о том, как обратиться из какого-либо скрипта к переменной другого скрипта, или как вызвать метод (функцию) другого скрипта. В этой маленькой статейке я бы хотел описать способы, которые можно для этого использовать.

Публичные переменные и доступ к компонентам

Допустим есть у нас такой скрипт


Синтаксис:
Используется csharp
using UnityEngine;

// скрипт, к переменной которого мы хотим получить доступ
public class ScriptWithVariable
{
   // переменная, к которой мы хотим получить доступ
   public int myPublicVariable;
}  


Далее мы хотим из другого скрипта на том же объекте менять эту переменную. Есть несколько способов это сделать:
Первый вариант подразумевает, что вы создадите публичную переменную.


Синтаксис:
Используется csharp
using UnityEngine;

public class VariableChanger
{
   // переменная, которая отобразится в редакторе Unity
   // и на которую надо перетащить скрипт ScriptWithVariable с того же или иного объекта сцены
   public ScriptWithVariable scriptWithVariable;

   public void Update()
   {
     // изменение нужной нам переменной
     scriptWithVariable.myPublicVariable++;
   }
}


seaman
2. Каким образом у Вас присваивается переменная public a_01 a_01? Где вы ее присваиваете?

Я уже писал выше. На сцене триггер. К нему приложен скрипт TriggerCub1. Именно в этом скрипте и описывается переменная a_01:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class TriggerCub1 : MonoBehaviour
{

        public a_01 a_01;


Где первая a_01 это тип переменной, совпадающий с названием скрипта a_01.cs, в котором я собираюсь изменять переменную nnn. Вот полное содержимое этого скрипта:
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;
public class a_01 : MonoBehaviour {
public int nnn;
        void Update () {
        Debug.Log(nnn);
        }      
}


Эта связка двух скриптов работает безукоризненно и мной проверена не раз, но только в том случае, если объект, которому принадлежит последний скрипт присутствует явно на сцене. Если же я создаю этот объект из скрипта TriggerCub1.cs, используя префаб объекта с прикреплённым к нему скриптом a_01.cs, то компилятор уже не находит пути к переменной nnn этого скрипта. Вопрос именно в этом, а не в том, почему я дважды использую одно имя a_01.
_ZEN_
UNец
 
Сообщения: 18
Зарегистрирован: 02 окт 2013, 15:29

Re: Создание объекта из скрипта

Сообщение BornFoRdeatH 21 окт 2013, 14:28

_ZEN_ писал(а):Я лишь совсем недавно приступил к изучению Unity3d. Что же касаемо Ваших вопросов, то уверяю, что это не я выдумал конструкцию: public a_01 a_01; Вот, например, выдержка из статьи «Как скрипты общаются»:

А вы внимательней посмотрите свою статью, названия скрипта с большой, название переменной с маленькой, шарп чувствителен к регистру.

_ZEN_ писал(а):Вопрос именно в этом, а не в том, почему я дважды использую одно имя a_01.

Лучше слушайте что вам говорят, а не то что вы думаете. Вам указали в чем ошибка.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Создание объекта из скрипта

Сообщение _ZEN_ 21 окт 2013, 15:05

Я это знаю, сделал класс с большой буквы A_01. Переписал скрипты. Ничего не изменилось. В Inspector для объекта триггер напротив A_01 стоит None(A_01). Но его ведь и не может быть, пока программа не запущена, не так ли?

И ещё. При написании игры я двигаюсь поступательно. Я уже писал, что эта конструкция мной отработана на разных объектах, но когда я решил усложнить игру и в случайном порядке размещать объекты на сцене, используя скрипт, появилась ошибка.
_ZEN_
UNец
 
Сообщения: 18
Зарегистрирован: 02 окт 2013, 15:29

Re: Создание объекта из скрипта

Сообщение BornFoRdeatH 21 окт 2013, 15:09

_ZEN_ писал(а):Но его ведь и не может быть, пока программа не запущена, не так ли?

И не будет, откуда ему там взяться, вы же его нигде не инициализируете. Вам нужно назначить либо в инспекторе либо в коде.
Не бойся, если ты один, бойся, если ты ноль.
BornFoRdeatH
Адепт
 
Сообщения: 2377
Зарегистрирован: 22 окт 2011, 23:41
Откуда: Украина
Skype: bornfordeath

Re: Создание объекта из скрипта

Сообщение _ZEN_ 21 окт 2013, 15:52

BornFoRdeatH

И не будет, откуда ему там взяться, вы же его нигде не инициализируете. Вам нужно назначить либо в инспекторе либо в коде.

В инспекторе я его инициализировать не могу, потому что объекта ещё физически нет на сцене. Когда я создавал объект не из скрипта, я так и делал, и всё работало в связке a_01 – a_01 (маленькими буквами), но когда создал объект программно, зашёл в тупик, ибо делаю это в первый раз. Если Вас не затруднит, подскажите, пожалуйста, что нужно добавить в код первого скрипта, чтобы из него инициализировать второй скрипт A_01, входящий в префаб o_01?

Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class TriggerCub1 : MonoBehaviour {

        public A_01 a_01;
        public GameObject thePrefab;
        private GameObject instance;
       
        void Start ()
        {
        instance = Instantiate (thePrefab, transform.position, transform.rotation) as GameObject;
        }
_ZEN_
UNец
 
Сообщения: 18
Зарегистрирован: 02 окт 2013, 15:29

Re: Создание объекта из скрипта

Сообщение seaman 21 окт 2013, 17:38

когда создал объект программно, зашёл в тупик, ибо делаю это в первый раз. Если Вас не затруднит, подскажите, пожалуйста, что нужно добавить в код первого скрипта

Если я правильно понял на каком объекте должен быть скрипт.
Синтаксис:
Используется csharp
void Start ()
{
    instance = Instantiate (thePrefab, transform.position, transform.rotation) as GameObject;
    instance.AddComponent<A_01>();
    a_01 = instance.GetComponent<A_01>();
}

Однако могу заметить, что если вы в скрипте A_01 не используете члены класса MonoBehaviour, то выгодно не наследоваться от него, т.е.
Синтаксис:
Используется csharp
public class A_01
{
    public int nnn;  
}

Тогда все проще:
Синтаксис:
Используется csharp
void Start ()
{
    instance = Instantiate (thePrefab, transform.position, transform.rotation) as GameObject;
    a_01 = new A_01();
}

Ну а выводить его значение можно в основном классе.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Создание объекта из скрипта

Сообщение _ZEN_ 22 окт 2013, 16:23

seaman

Примите мою благодарность. Снимаю шляпу!
Всё получилось.
_ZEN_
UNец
 
Сообщения: 18
Зарегистрирован: 02 окт 2013, 15:29


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: Google [Bot] и гости: 26