2015-12-29 1 views
0
Transform child = GameObject.FindWithTag("state").transform; 
    child.name = first_guy+""; child.tag = first_guy+""; 
    GameObject child_dup = Instantiate(child, new Vector3(0,0,0),Quaternion.identity) as GameObject; 
    Debug.Log (child_dup.name); 

Приведенный выше код дает мне ошибку: «NullReferenceException: ссылка на объект не установлена ​​в экземпляр объекта». Это потому, что я пытаюсь создать экземпляр локальной переменной? Как дублировать игровой объект во время выполнения?Unity3D: Instantiate создает NullReferenceException

+1

Если вы пытаетесь отправить код, вам нужно 4 пробела перед каждой строкой кода. – Draco18s

+0

Я боролся за это: D Он выдавал ошибку. –

+0

Является ли first_guy некоторой переменной строки, которую вы установили? – WearyWanderer

ответ

2

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

Instantiate(child.gameObject, ...) 
+1

Это. Вероятно, вы хотите получить фактический GameObject и продублировать его, дублируя преобразование, вы не создаете новый экземпляр объекта. Обратите внимание, но создание экземпляров разрушает вашу сборку мусора, а для игрового движка, такого как Unity, вы должны посмотреть на создание пула объектов, если вы делаете много экземпляров. – WearyWanderer

+0

Не совсем верно. Вы наиболее определенно можете создать() преобразование. Instantiate() будет использовать любой объект Unity и клонировать его. В случае Компонентов (например, Transform) он будет не только клонировать компонент, но и GameObject, к которому он привязан. Причина, по которой OP получает исключение NullReferenceException, заключается в том, что Instantiate() вернет клон объекта, который он передал, в данном случае - Transform вновь созданного GameObject. Поскольку возвращаемое значение типа Transform передается в GameObject, результат будет равен NULL, а исключение NullReferenceException будет выведено из Debug.Log(), а не Instantiate(). –

+0

@ Томас Хильберт Да, вы правы. Иногда я забываю, что Unity делает некоторые дополнительные вещи внутри черного ящика, который является Instantiate, чтобы быть более гибким. – Draco18s

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

  • Нет связанных вопросов^_^