2015-09-29 3 views
0

Rigidbody2D Null Ссылки Исключения после ИнстанцированияUnity: NullReferenceException когда Инстанцирование Rigidbody

мне нужно Unity игрового движка конкретного ответ.

Итак, в основном, я пишу скрипт, который управляет создателем. Это довольно общий характер, и в основном то, что он делает, - это применить силу к инстанцированному жесткому телу после его появления. Но по какой-то причине каждый раз, когда я создаю объект в первый раз, Unity выдает ошибку NullReferenceException. Я проверил свой код на предмет ошибок, но я думаю, что все в порядке. Кто-нибудь получил советы?

Кстати, точное сообщение об ошибке было:

NullReferenceException: Ссылка на объект не указывает на экземпляр объекта USBSpawner + c__Iterator0.MoveNext() (на активы/скрипты/USBSpawner.cs: 24)

Код:

using UnityEngine; 
using System.Collections; 

public class USBSpawner : MonoBehaviour { 

    public static bool isActive = true; 

    public GameObject USBPrefab; 
    public float spawnDelay = 5f; 
    public Vector2 throwForce; 

    void Start() { 
     StartCoroutine(SpawnUSB()); 
    } 
    IEnumerator SpawnUSB() { 
     yield return new WaitForSeconds(spawnDelay); 

     if(isActive) { 
      var newTransform = transform; 

      Rigidbody2D USBInstance; 
      USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D; 
      USBInstance.GetComponent<Rigidbody2D>().velocity = throwForce; 
     } 

     StartCoroutine(SpawnUSB()); 
    } 
} 

Есть идеи?

+2

Возможный дубликат [Что такое исключение NullReferenceException и как его исправить?] (Http: // stackoverflow.com/questions/4660142/what-is-a-nullreferenceexception-and-how-do-i-fix-it) – Dmitry

ответ

0

Действительно, вам нужно сделать больше исследований, прежде чем вы ставите вопрос. Это должно быть достаточно очевидным для любого программиста после их первых программ ООП. Вы используете объект, который не имеет значения. Возможно, ваше преобразование никогда не было сделано или ваш Quaternion не существует. Нечто подобное

+0

Эквивалентный вызов эквивалентен новому – Cjen1

+0

@ Cjen1 Right. Я этого не видел. Благодаря! –

0

На мой взгляд, проблема лежит в следующей строке:

USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D; 

После вызова Instantiate, вы пытаетесь привести результат к экземпляру Rigidbody2D с помощью оператора as. Теперь вот что должен сказать Microsoft об этом операторе:

Оператор as как операция литья. Однако, если преобразование невозможно, так как возвращает null вместо того, чтобы поднимать исключение.

Похоже, что преобразование невозможно, и поэтому USBInstance является null при вызове GetComponent на нем.

0

Как подробно описано на Kapol, ваша проблема не кажется, ваша попытка бросить GameObject к RigidBody2D с линией:

USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity) as Rigidbody2D; 

Поскольку этот бросок потерпит неудачу (оба типа действительно совершенно разные), эта строка кода в основном работает до USBInstance = null;, и попытка вызвать любые методы на ней даст вам NullReferenceException.

Увидев, что вы уже звоните GetComponent<Rigidbody2D>() на следующей строке, нет необходимости пытаться отличить результат Instantiate() от чего-либо; просто оставьте это как GameObject:

USBInstance = Instantiate (USBPrefab, newTransform.position, Quaternion.identity); 

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

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