@goose141

Что делать, если Unity выдает ошибку NullReferenceException: Object reference not set ot an instance of an object?

Делал платформер по туториалу, и когда дело дошло до реализации пуль, юнити начал выдавать ошибку NullReferenceException: Object reference not set ot an instance of an object при попытке выстрелить, и указывал на часть кода
public void Shoot()
    {
        Vector3 bulletspawn = transform.position; bulletspawn.y += 0.3f;
        State = CharState.Shoot;
        Instantiate(bullet, bulletspawn, bullet.transform.rotation);
    }

А именно на строчку Instantiate(bullet, bulletspawn, bullet.transform.rotation); и говорит что cсылка на объект не установлена на экземпляр объекта, хотя все ссылки я полключил
private Bullet bullet;

private void Awake()
    {
        bullet = Resources.Load<Bullet>("Bullet");
    }


Вот код самой пули, если важен.
public class Bullet : MonoBehaviour
{
    private float speed = 10.0f;
    private Vector3 direction;
    public Vector3 Direction { set { direction = value; } }

    private SpriteRenderer sprite;

    private void Awake()
    {
        sprite = GetComponentInChildren<SpriteRenderer>();
    }

    private void Start()
    {
        Destroy(gameObject, 1.4f);
    }

    private void Update()
    {
        transform.position = Vector3.MoveTowards(transform.position, transform.position + direction, speed * Time.deltaTime);
    }
}
  • Вопрос задан
  • 46 просмотров
Решения вопроса 1
ShockWave2048
@ShockWave2048
imposter
Теоретически вы грузите класс компонента Bullet из некоего префаба Bullet.
bullet = Resources.Load<Bullet>("Bullet");
И он остается без GameObject, а следовательно и без transform
Сделайте ссылку на префаб в редакторе, перетащив его в поле
public GameObject bullet;
И инстанцируйте без загрузки.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
zagayevskiy
@zagayevskiy
Android developer at Yandex
подебажить и понять, где там у тебя null
Ответ написан
@18382774
Вместо
private Bullet bullet;

private void Awake()
    {
        bullet = Resources.Load<Bullet>("Bullet");
    }


Проще использовать public GameObject bulett;
А для появления пули можно использовать куротину:
public GameObject bullet;
void Start(){
StartCoroutine(SpawnBullet());
}
IEnumerator SpawnBullet()
    {
//в while нужно обязательно указать условие, при котором циклы будет выполняться.Если будет while(true), то это будет бесконечный цикл.
        while (true)
        {

           
            Instantiate(bullet, new Vector3(3 координаты через запятую. пример: 0f, 0f, 0f), Quaternion.identity);
            yield return new WaitForSeconds(время через которое будет спавниться пуля пример: 5f);




        }
    }

Это скрипт вешаете на врага, который стреляет и указываете условие координаты и время.А в инспекторе в юнити указываете префаб пули.
P.s При данных значениях, пуля будет спавниться пока запущена сцена, на координатах 0, 0, 0 , каждые 5 секунд.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
28 янв. 2021, в 15:21
10000 руб./за проект
28 янв. 2021, в 15:09
1000 руб./в час
28 янв. 2021, в 14:43
2490 руб./за проект