Это не мешает, но сильно бесит!!

Форум для самых маленьких, а так же тех, кому недосуг читать справку самостоятельно.

Это не мешает, но сильно бесит!!

Сообщение MoJlo4Ko 18 сен 2019, 15:00

NullReferenceException: Object reference not set to an instance of an object
Grab.Update () (at Assets/Scripts/Grab.cs:37)

Синтаксис:
Используется csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Grab : MonoBehaviour
{
    [Header("Settings")]
    public float GrabPower = 10;
    public float ThrowPower = 50;
    public float distance = 3;

    [Space(10)]
    public Transform offset;

    private bool grabB;
    private bool throwB;

    [Space(10)]
    public Inventory inventory;

    RaycastHit hit;

    bool start;
    float timer = 1;

    void Start()
    {
        inventory = FindObjectOfType<Inventory>();
    }

    void Update()

    {
        Physics.Raycast(transform.position, transform.forward, out hit, distance);

        if (Input.GetKey(KeyCode.F))
        {
            //Ошибка приводит сюда!!
            if (hit.collider.tag == "Grab")
            {
                inventory.Active = true;

                grabB = true;
            }

            else
            {
                inventory.Active = false;

                grabB = false;
            }
        }

        else
        {
            inventory.Active = false;

            grabB = false;
        }

        if (timer == 1)
        {
            if (grabB)
            {
                hit.rigidbody.velocity = (offset.position - (hit.transform.position + hit.rigidbody.centerOfMass)) * GrabPower;

                if (Input.GetKey(KeyCode.Mouse0))
                {
                    start = true;
                    throwB = true;
                    grabB = false;
                }
            }
        }

        if (throwB)
        {
            hit.rigidbody.velocity = transform.forward * ThrowPower;
            throwB = false;
        }

        if (start)
        {
            timer -= Time.deltaTime;
        }

        if (timer < 0)
        {
            start = false;
            timer = 1;
        }
    }
}
MoJlo4Ko
UNIт
 
Сообщения: 56
Зарегистрирован: 07 апр 2019, 20:38

Re: Это не мешает, но сильно бесит!!

Сообщение 1max1 18 сен 2019, 15:14

Твой рейкаст не всегда возвращает что-то, проверяй коллайдер на нул

if (hit.collider != null && hit.collider.tag == "Grab")
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Это не мешает, но сильно бесит!!

Сообщение MoJlo4Ko 18 сен 2019, 15:20

1max1 писал(а):Твой рейкаст не всегда возвращает что-то, проверяй коллайдер на нул

if (hit.collider != null && hit.collider.tag == "Grab")


Спасибо большое! Учту на будущее!
MoJlo4Ko
UNIт
 
Сообщения: 56
Зарегистрирован: 07 апр 2019, 20:38

Re: Это не мешает, но сильно бесит!!

Сообщение Woland 18 сен 2019, 16:40

1max1 писал(а):Твой рейкаст не всегда возвращает что-то, проверяй коллайдер на нул

if (hit.collider != null && hit.collider.tag == "Grab")

Такой код все равно будет возвращать ошибку, так как мы одновременно проверяем, существует ли коллайдер, а также какой тэг у этого коллайдера. Соответственно если коллайдер не существует, мы все равно попробуем прочесть его тэг. Надо сначала проверять на наличие, а потом уже на тэг.
Woland
Адепт
 
Сообщения: 1240
Зарегистрирован: 20 апр 2013, 18:09
  • Сайт

Re: Это не мешает, но сильно бесит!!

Сообщение 1max1 18 сен 2019, 16:54

Woland писал(а):
1max1 писал(а):Твой рейкаст не всегда возвращает что-то, проверяй коллайдер на нул

if (hit.collider != null && hit.collider.tag == "Grab")

Такой код все равно будет возвращать ошибку, так как мы одновременно проверяем, существует ли коллайдер, а также какой тэг у этого коллайдера. Соответственно если коллайдер не существует, мы все равно попробуем прочесть его тэг. Надо сначала проверять на наличие, а потом уже на тэг.

&& и & разные операторы.
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Это не мешает, но сильно бесит!!

Сообщение Woolf 18 сен 2019, 17:48

Woland писал(а):
1max1 писал(а):Твой рейкаст не всегда возвращает что-то, проверяй коллайдер на нул

if (hit.collider != null && hit.collider.tag == "Grab")

Такой код все равно будет возвращать ошибку, так как мы одновременно проверяем, существует ли коллайдер, а также какой тэг у этого коллайдера. Соответственно если коллайдер не существует, мы все равно попробуем прочесть его тэг. Надо сначала проверять на наличие, а потом уже на тэг.


нет, у него же && в этом случае сначала проверит на нулл, если нет, то дальнейшая проверка осуществляться не будет. Но замечание верное, именно по синтаксису, обычно принято заключать подобные условия в скобки.
Синтаксис:
Используется csharp
if ((hit.collider != null) && (hit.collider.tag == "Grab"))

Правда, и tag может быть тоже null. По крайней мере, я такое встречал..
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Это не мешает, но сильно бесит!!

Сообщение Jarico 18 сен 2019, 17:56

Woolf писал(а):
Синтаксис:
Используется csharp
if ((hit.collider != null) && (hit.collider.tag == "Grab"))

Правда, и tag может быть тоже null. По крайней мере, я такое встречал..


Скобки можно убрать, IntelliSense покажет что скобки лишние...
Github: _https://github.com/redheadgektor
Discord: Конь! Чаю!#9382 (сижу редко)
YouTube: _https://www.youtube.com/channel/UCPQ04Xpbbw2uGc1gsZtO3HQ
Telegram: _https://t.me/redheadgektor
Аватара пользователя
Jarico
Адепт
 
Сообщения: 1084
Зарегистрирован: 06 янв 2019, 17:37
Откуда: 0xDEAD
Skype: none
  • Сайт

Re: Это не мешает, но сильно бесит!!

Сообщение Woolf 18 сен 2019, 18:35

Jarico писал(а):
Woolf писал(а):
Синтаксис:
Используется csharp
if ((hit.collider != null) && (hit.collider.tag == "Grab"))

Правда, и tag может быть тоже null. По крайней мере, я такое встречал..


Скобки можно убрать, IntelliSense покажет что скобки лишние...


Нуууу не знаю.. Демидомич меня за такое по рукам линейкой бил )
Разработчик theFisherOnline - там, где клюёт
Разработчик Atom Fishing II - Первая 3D MMO про рыбалку
Разработчик Atom Fishing - Рыбалка на поплавок, донку, нахлыст, блесну в постъядерный период.
Аватара пользователя
Woolf
Адепт
 
Сообщения: 7179
Зарегистрирован: 02 мар 2009, 16:59

Re: Это не мешает, но сильно бесит!!

Сообщение 1max1 18 сен 2019, 18:39

Я не уверен, но вроде можно еще так извратиться:
if (hit.collider?.tag == "Grab")
Аватара пользователя
1max1
Адепт
 
Сообщения: 5505
Зарегистрирован: 28 июн 2017, 10:51

Re: Это не мешает, но сильно бесит!!

Сообщение Saltant 18 сен 2019, 22:05

Тогда уж CompareTag
Я на Google Play _https://play.google.com/store/apps/developer?id=Saltant
Аватара пользователя
Saltant
Адепт
 
Сообщения: 2235
Зарегистрирован: 09 окт 2018, 16:40
Откуда: Химки
  • Сайт


Вернуться в Почемучка

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 22