Пятница, 29 Ноября 2024, 16:07

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Ошибка при создании экземпляра из префаба
HasuniДата: Понедельник, 11 Июня 2018, 20:42 | Сообщение # 1
был не раз
Сейчас нет на сайте
Здравствуйте!
Делаю 2D-платформер в учебных целях.
При создании пули из префаба Bullet в скрипте (ниже) появляется ошибка "Object reference not set to an instance of an object" на строке. С чем это может быть связано? Уже пару часов сижу и переписываю то так, то сяк, но работать не хочет -.-

Кусок срипта:

Код
public Bullet bullet; // Есть класс отдельный с описанием

private void Awake()
    {
                bullet = Resources.Load<Bullet>("Bullet");  // Если после этого пишу дебаг.лог, то ошибка тут
    }

private void Shoot() //Метод бросания камней во врагов
        {
                Vector3 position = transform.position; position.y += 0.8F; //Где создается пуля? (относительно позиции игрока)
                Bullet newBullet = Instantiate(bullet, position, bullet.transform.rotation) as Bullet; //Создание пули, если не пишу дебаг.лог выше, то пишет ошибку тут
                newBullet.Parent = GameObject.Find("Player");
                newBullet.Direction = newBullet.transform.right * (RightDirection ? -1.0F : 1.0F); // Направление пули
        }


Спасите-помогите! Т.т
drcrackДата: Понедельник, 11 Июня 2018, 20:47 | Сообщение # 2
старожил
Сейчас нет на сайте
Цитата
bullet = Resources.Load<Bullet>("Bullet"); // Если после этого пишу дебаг.лог, то ошибка тут

первый раз вижу такую конструкцию
у тебя есть папка Assets/Resources, в ней лежит файл Bullet.prefab?
в таком случае походу надо загрузить его как GameObject и с него уже GetComponent<Bullet>
но по-моему проще нужный префаб поставить в инспекторе
HasuniДата: Понедельник, 11 Июня 2018, 21:39 | Сообщение # 3
был не раз
Сейчас нет на сайте
Цитата
первый раз вижу такую конструкцию

В одном из видео-уроков на ютубе нашла : D И там все работает, естественно)

Цитата
у тебя есть папка Assets/Resources, в ней лежит файл Bullet.prefab?

Да, есть такие папки.

Цитата
в таком случае походу надо загрузить его как GameObject и с него уже GetComponent<Bullet>

Вы имеете в виду так?

Код
public GameObject bullet;
private void Awake()
    {
  bullet = Resources.Load("Bullet") as GameObject;
                Debug.Log (bullet.tag);
    }

  private void Shoot() //Метод бросания камней во врагов
    {
  Vector3 position = transform.position; position.y += 0.8F; //Где создается пуля? (относительно позиции игрока)
  GameObject newBullet = Instantiate(bullet, position, bullet.transform.rotation) as GameObject; //Создание пули
  newBullet.gameObject.GetComponent<Bullet>().Parent = GameObject.Find("Player"); //Теперь ошибка тут -_-
  newBullet.gameObject.GetComponent<Bullet>().Direction = newBullet.transform.right * (RightDirection ? -1.0F : 1.0F); // Направление пули
  Debug.Log ("Пиф-паф");
    }


Тогда следующая ошибка возникает в Shoot():
Object reference not set to an instance of an object
Дебаг первый работает >.< Не пойму, что ему не нравится...
pixeyeДата: Понедельник, 11 Июня 2018, 22:13 | Сообщение # 4
Red Winter Software
Сейчас нет на сайте
1. Resources.Load<T> - работает.
2. Особого смысла для префабов в этом нет. Инстансишь ты все равно GO. Так что будет логичным GO получать, а не сам булет.
3. bullet = Resources.Load("Bullet") as GameObject; Можешь писать без as GameObject
4. newBullet.gameObject. не имеет смысла - newBullet итак GameObject - newBullet.GetComponent<Bullet>() - на булете точно есть компонент? он активен?
5. А ты уверен что ошибка именно там? может GameObject.Find("Player") вернул null и в коде Bullet произошло обращение к Parent и все поломалось? Провеь просто например newBullet.GetComponent<Bullet>() через дебаг


ACTORS - мой фреймворк на Unity
Until We Die - игра над которой работаю



Сообщение отредактировал pixeye - Понедельник, 11 Июня 2018, 22:17
drcrackДата: Понедельник, 11 Июня 2018, 22:15 | Сообщение # 5
старожил
Сейчас нет на сайте
Код
newBullet.gameObject.GetComponent<Bullet>().Parent = GameObject.Find("Player"); //Теперь ошибка тут -_-

на префабе точно есть скрипт Bullet? потому что его отсутствие это единственное что может вызвать ошибку в этой строке

Цитата
1. Resources.Load<T> - работает.

никогда таким не пользовался, но если оно работает — то скрипта на префабе точно нет, иначе бы первый вариант не падал

Цитата
5. А ты уверен что ошибка именно там? может GameObject.Find("Player") вернул null и в коде Bullet произошло обращение к Parent и все поломалось? Провеь просто например newBullet.GetComponent<Bullet>() через дебаг

маловероятно
Parent у нее это скорее всего просто паблик поле


Сообщение отредактировал drcrack - Понедельник, 11 Июня 2018, 22:18
HasuniДата: Понедельник, 11 Июня 2018, 22:35 | Сообщение # 6
был не раз
Сейчас нет на сайте
Спасибо Вам всем огромное!
Все заработало, и я все поняла :3
Мр ~♥
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг