NAZYuy
@NAZYuy
Начинаю изучать Unity + C#

Как исправить ошибку nullreferenceexception: object reference not set to an instance of an object?

Начал изучать Unity + C#. Сейчас создаю игру похожую на flappy bird и столкнулся с такой проблемой. Хочу реализовать смену спрайта игрока при его падении и взлете, но столкнулся с ошибкой nullreferenceexception: object reference not set to an instance of an object.
Вот код персонажа -
using System.Collections;
using System.Collections.Generic;
using UnityEditor.U2D;
using UnityEngine;
using UnityEngine.SceneManagement;

public class PlayerControl : MonoBehaviour
{
    private bool _isAlive = true;  // введем булевую переменную указывающую на то, что персонаж жив
    public float force;
    public float speed;
    public Sprite astronaut_2;
    private Rigidbody2D _rigidbody;
    public Sprite _raisingSprite;
    public Sprite _fallSprite;
    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Jump();
        }
        if (!_isAlive && transform.position.y >= 4.4)        
        {
            SceneManager.LoadScene("level_1");
        }
        if (!_isAlive && transform.position.y <= -4)        // указываем, что если позиция меньше или равна -4, и персонаж не жив (_isAlive не равно true), то перезапускаем сцену

        {
            SceneManager.LoadScene("level_1");
        }
        { 
            if (_rigidbody.velocity.y >= 0)
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = _raisingSprite;
            }
            else
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = _fallSprite;
            }
        }
    }
    void Jump()
    {
        GetComponent<Rigidbody2D>().velocity = new Vector2(speed, 0f);
        GetComponent<Rigidbody2D>().AddForce(Vector2.up * force);            //управление персонажа
    }
    private void OnTriggerEnter2D(Collider2D collision)
    {

        if (collision.tag == "Enemy")

        {
            GetComponent<Rigidbody2D>().velocity = new Vector2(-7f, 0f);
            GetComponent<Rigidbody2D>().AddForce(Vector2.up * 300);             //отбрасывание персонажа после соприкосновения с препятсвием
            gameObject.GetComponent<SpriteRenderer>().sprite = astronaut_2;     //смена спрайта игрока после соприкосновения с препятсвием
            _isAlive = false;                                                   // после столкновения переключаем переменную в значение false, указывая на то, что персонаж погиб

        }
    }

}

Также прилагаю скриншот -
650b4bc78a06c147474485.png
  • Вопрос задан
  • 69 просмотров
Решения вопроса 1
@Ezekiel4
Охотник на пиратов и сборщик монолитов
Вы серьёзно улучшите свой код, просто вынеся ссылки на Rigidbody2D и SpriteRenderer в инспектор, как вы сделали это со спрайтами выше. Вопрос не только в повышении читаемости кода, а ещё в том, что сама операция GetComponent имеет слишком большие накладные расходы, чтобы каждый апдейт её использовать. В примере вашей игры вы разницы не увидите, но лучше начать писать сейчас, чем потом переучиваться.

Сама же ошибка от того, что скрипту не удаётся найти самому ссылку на Rigidbody2D объекта вот в этой строке:
if (_rigidbody.velocity.y >= 0) // вот тут, '_rigidbody'
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = _raisingSprite;
            }
            else
            {
                gameObject.GetComponent<SpriteRenderer>().sprite = _fallSprite;
            }


А ну и ПС. между gameObject.GetComponent и GetComponent нет разницы - это одно и то же, просто во втором случае gameObject, можно сказать, вызывается неявно.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы