Войти
UnityФорумПрограммирование

Помогите ошибка: Object reference not set to an instance of an object PlayerControll.Update ()

#0
12:52, 20 июня 2021

Unity выдает ошибку: NullReferenceException: Object reference not set to an instance of an object
PlayerControll.Update () (at Assets/Settings/Script/PlayerControll.cs:33)

Не понимаю сути ошибки

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerControll : MonoBehaviour
{
    public float speed = 3;
    public bool IsFlipped = false;
    private Rigidbody2D rb;
    private bool IsGrounded;
    public float distance;
    private GameObject Player;
    private GameObject dialog;
    private SpriteRenderer spRender;
    private GameObject SpriteShop;
    

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();

        Player = GameObject.Find("Player");
        dialog = GameObject.Find("Press E");
        SpriteShop = GameObject.Find("Shop");
        spRender = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        distance = Vector3.Distance(dialog.transform.position, transform.position);

        if(distance <= 0.6 && Input.GetKeyDown("e"))
        {
            SpriteShop.SetActive(true);
        }
        else if(distance >= 0.6 && Input.GetKeyDown("e"))
        {
            SpriteShop.SetActive(false);
        }

        float horizontalInput = Input.GetAxis("Horizontal");
        transform.Translate(Vector2.right * horizontalInput * speed * Time.deltaTime);
        if(IsFlipped == false && Input.GetKeyDown("a"))
        {
            Flip();
            IsFlipped = true;
        }
        else if(IsFlipped == true && Input.GetKeyDown("d"))
        {
            Flip();
            IsFlipped = false;
        }

    }
    void Flip()
    {
        IsFlipped = !IsFlipped;
        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
        IsFlipped = false;
        
    }
}

#1
13:36, 20 июня 2021

Проверь dialog на null.

#2
14:49, 20 июня 2021

Dimich
А как?

#3
15:11, 20 июня 2021

Mr_Kapitoshka
> А как?
Хотя бы так:

if (dialog == null) Debug.Log("dialog is null");
#4
15:15, 20 июня 2021

Dimich
Попробовал, но проект сразу останавливается когда я его запускаю

#5
15:39, 20 июня 2021

Короче, полю dialog ничего не присвоено. Вероятно, потому что объект "Press E" не был найден.

#6
(Правка: 19:55) 19:53, 20 июня 2021

alexzzzz
И как исправить?
Я сделал ее публичной и сам вставил, но при нажимании E происходит та же ошибка, а точнее вот: NullReferenceException: Object reference not set to an instance of an object
PlayerControll.Update () (at Assets/Settings/Script/PlayerControll.cs:36)

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class PlayerControll : MonoBehaviour
{
    public float speed = 3;
    public bool IsFlipped = false;
    private Rigidbody2D rb;
    private bool IsGrounded;
    public float distance;
    private GameObject Player;
    public GameObject dialog;
    private SpriteRenderer spRender;
    private GameObject SpriteShop;
    

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();

        Player = GameObject.Find("Player");
        SpriteShop = GameObject.Find("Shop");
        spRender = GetComponent<SpriteRenderer>();
    }

    // Update is called once per frame
    void Update()
    {
        distance = Vector3.Distance(dialog.transform.position, transform.position);

        if(distance <= 0.6 && Input.GetKeyDown("e"))
        {
            SpriteShop.SetActive(true);
        }
        else if(distance >= 0.6 && Input.GetKeyDown("e"))
        {
            SpriteShop.SetActive(false);
        }

        float horizontalInput = Input.GetAxis("Horizontal");
        transform.Translate(Vector2.right * horizontalInput * speed * Time.deltaTime);
        if(IsFlipped == false && Input.GetKeyDown("a"))
        {
            Flip();
            IsFlipped = true;
        }
        else if(IsFlipped == true && Input.GetKeyDown("d"))
        {
            Flip();
            IsFlipped = false;
        }

    }
    void Flip()
    {
        IsFlipped = !IsFlipped;
        Vector3 scale = transform.localScale;
        scale.x *= -1;
        transform.localScale = scale;
        IsFlipped = false;
        
    }
}
#7
(Правка: 21:02) 20:59, 20 июня 2021

Mr_Kapitoshka
> PlayerControll.cs:36
а где тут 36 строка?

#8
21:01, 20 июня 2021

Salamandr
SpriteShop.SetActive(false);

#9
(Правка: 21:04) 21:03, 20 июня 2021

вот так можно было вставить https://pastebin.com/8A5aDM9R
Изображение
теперь переводим код ошибки translate.google.ru

Ссылка на объект не установлена на экземпляр объекта

то есть SpriteShop изначально не установлен. Можно было перетянуть его в поле изначально и не искать. То есть твой GameObject.Find его не находит
Изображение

#10
21:08, 20 июня 2021

Salamandr
Благодарю, спасибо большое.

UnityФорумПрограммирование

Тема закрыта.