Не видит RayCast из другого скрипта

Программирование на Юнити.

Не видит RayCast из другого скрипта

Сообщение 50VAJJ 04 фев 2017, 20:50

Здравствуйте.
Есть скрипт который создаёт декаль, после вызывает метод в другом скрипте(на декале) и там создаётся такая же декаль только с другой стороны. Visual Studio ошибок не видит но когда запускаю и выполняю первый скрипт то пишет - NullReferenceException: Object reference not set to an instance of an object
Сами скрипты:
Первый -
Синтаксис:
Используется csharp
  public void _Decal()
    {    
        Vector3 Direction = RaySpawn.TransformDirection(Vector3.forward + new Vector3(Random.Range(-Spread, Spread), Random.Range(-Spread, Spread), 0));
        Ray ray = new Ray(RaySpawn.position, Direction);
        if (Physics.Raycast(ray, out Hit, 200F))
        {
            if (Hit.collider)
            {
                GameObject dec = Instantiate(Decal);
                dec.transform.position = Hit.point + Hit.normal * 0.019f;
                dec.transform.rotation = Quaternion.LookRotation(-Hit.normal);
                dec.transform.SetParent(Hit.transform);
 
                if (Hit.collider.tag == "Sweep")
                {
                    DecalScript._Decal();      
                 
                }
            }
        }
}
 

Второй -
Синтаксис:
Используется csharp
public void _Decal()
    {
        Debug.Log("True");
        RaycastHit Hit_2;
 
        Ray ray_decal = new Ray(_Pistol.Hit.point + _Pistol.ray.direction * 5, -gameObject.transform.forward);
        if (Physics.Raycast(ray_decal, out Hit_2, 3))
        {
            GameObject dec_2 = Instantiate(__Decal);
            dec_2.transform.position = Hit_2.point + Hit_2.normal * 0.019f;
            dec_2.transform.rotation = Quaternion.LookRotation(-Hit_2.normal);
            dec_2.transform.SetParent(Hit_2.transform);
        }
    }
 
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение samana 04 фев 2017, 21:42

Здесь недопонимание возникло вдруг

Синтаксис:
Используется csharp
 if (Hit.collider.tag == "Sweep")
{
      DecalScript._Decal();      
}


Что хранится в DecalScript? Какое там значение?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Не видит RayCast из другого скрипта

Сообщение 50VAJJ 04 фев 2017, 21:47

samana писал(а):Здесь недопонимание возникло вдруг

Синтаксис:
Используется csharp
 if (Hit.collider.tag == "Sweep")
{
      DecalScript._Decal();      
}


Что хранится в DecalScript? Какое там значение?



Второй скрипт же

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

public class Decal : MonoBehaviour
{
    public Pistol _Pistol;
    public GameObject __Decal;
    void Start()
    {
        __Decal = gameObject;
    }
    void Update()
    {

    }

    public void _Decal()
    {
        Debug.Log("True");
        RaycastHit Hit_2;

        Ray ray_decal = new Ray(_Pistol.Hit.point + _Pistol.ray.direction * 5, -gameObject.transform.forward);
        if (Physics.Raycast(ray_decal, out Hit_2, 3))
        {
            GameObject dec_2 = Instantiate(__Decal);
            dec_2.transform.position = Hit_2.point + Hit_2.normal * 0.019f;
            dec_2.transform.rotation = Quaternion.LookRotation(-Hit_2.normal);
            dec_2.transform.SetParent(Hit_2.transform);
        }
    }
}


 
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение seaman 04 фев 2017, 21:52

Вас не спрашивают что во втором скрипте. Вас спрашивают что в переменной DecalScript? Где вы ей присваиваете значение?

Что означает NullReferenceException? Что какой то переменной не присвоено значение. Подозрение падает именно на DecalScript.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не видит RayCast из другого скрипта

Сообщение 50VAJJ 04 фев 2017, 21:58

seaman писал(а):Вас не спрашивают что во втором скрипте. Вас спрашивают что в переменной DecalScript? Где вы ей присваиваете значение?

Что означает NullReferenceException? Что какой то переменной не присвоено значение. Подозрение падает именно на DecalScript.


Вроде присваиваю

Синтаксис:
Используется csharp
  private Decal DecalScript;

    public int i = 0;
    void Start()
    {
        DecalScript = Decal.GetComponent<Decal>();
        Bullets = MaxBullets;
        Spread /= 35;
    }
 
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение seaman 04 фев 2017, 22:06

GetComponent может вернуть null, если нет такого компонента. Так что не обязательно присваиваете.
Ну и потом. На каком объекте Вы компонент ищете? Разберитесь и в этом.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Не видит RayCast из другого скрипта

Сообщение 50VAJJ 04 фев 2017, 22:23

seaman писал(а):GetComponent может вернуть null, если нет такого компонента. Так что не обязательно присваиваете.
Ну и потом. На каком объекте Вы компонент ищете? Разберитесь и в этом.


На префабе где висит второй скрипт.

Попробовал так но не помогло.

Синтаксис:
Используется csharp
 if (Hit.collider)
            {
                GameObject dec = Instantiate(Decal);
                dec.transform.position = Hit.point + Hit.normal * 0.019f;
                dec.transform.rotation = Quaternion.LookRotation(-Hit.normal);
                dec.transform.SetParent(Hit.transform);

                if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = dec.GetComponent<Decal>();
                    DecalScript._Decal();

                }
            }
 


А что юзать если не GetComponent?
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение samana 04 фев 2017, 22:33

Что-то смущает ещё такой момент в вашем коде
50VAJJ писал(а):Вроде присваиваю

Синтаксис:
Используется csharp
  private Decal DecalScript;

    public int i = 0;
    void Start()
    {
        DecalScript = Decal.GetComponent<Decal>();
        Bullets = MaxBullets;
        Spread /= 35;
    }
 

----------------
Здесь у вас приватная переменная типа Decal, то-есть вы нигде не можете присвоить ей значение извне. А в старте вы пытаетесь вытащить из этой переменной - опять какой-то Decal !? Это как? :) Вытащить Decal из Decal?
То-есть в старте в момент DecalScript = Decal.GetComponent<Decal>() , DecalScript не имеет значения, как из него можно что-то вытащить? Тем более самого себя.
-----------------
Последний код в вашем сообщении должен работать нормально.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Не видит RayCast из другого скрипта

Сообщение samana 04 фев 2017, 22:39

50VAJJ писал(а):На префабе где висит второй скрипт.
Попробовал так но не помогло.

Синтаксис:
Используется csharp
 if (Hit.collider)
            {
                GameObject dec = Instantiate(Decal);
                dec.transform.position = Hit.point + Hit.normal * 0.019f;
                dec.transform.rotation = Quaternion.LookRotation(-Hit.normal);
                dec.transform.SetParent(Hit.transform);

                if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = dec.GetComponent<Decal>();
                    DecalScript._Decal();

                }
            }
 


А что юзать если не GetComponent?


У вас ведь Decal это вроде как скрипт, а как можно Instantiate скрипт? По-идее нужен ведь gameObject.
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Не видит RayCast из другого скрипта

Сообщение 50VAJJ 04 фев 2017, 22:44

samana писал(а):
50VAJJ писал(а):На префабе где висит второй скрипт.
Попробовал так но не помогло.

Синтаксис:
Используется csharp
 if (Hit.collider)
            {
                GameObject dec = Instantiate(Decal);
                dec.transform.position = Hit.point + Hit.normal * 0.019f;
                dec.transform.rotation = Quaternion.LookRotation(-Hit.normal);
                dec.transform.SetParent(Hit.transform);

                if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = dec.GetComponent<Decal>();
                    DecalScript._Decal();

                }
            }
 


А что юзать если не GetComponent?


У вас ведь Decal это вроде как скрипт, а как можно Instantiate скрипт? По-идее нужен ведь gameObject.


Decal это скрипт который весит на dec, dec это префаб на котором весит скрипт Decal, просто название переменной совпадает с названием скрипта.

Вообщем полностью скрипт
Синтаксис:
Используется csharp
using UnityEngine;
using UnityEngine.UI;
using System.Collections;

public class Pistol : MonoBehaviour
{
    public Transform RaySpawn;
    public GameObject Decal;
    public float Spread;
    public int Bullets; //Текущее кол-во патронов в обойме
    public int MaxBullets;
    public int Magazine;  //Текущее число обойм
    public AudioClip Fire; //Аудиоклип воспроизводящийся во время стрельбы
    public AudioClip Reload; //Аудиоклип воспроизводящийся во время перезарядки
    public float ReloadTimer; //Переменная для таймаута перезарядки
    public AudioSource _Audiosourse;

    public RaycastHit Hit;
    public RaycastHit Hit_2;
    public Ray ray;
    public Ray ray_decal;
    public Text AmmoText;
    private Decal DecalScript;

    public int i = 0;
    void Start()
    {
       
        Bullets = MaxBullets;
        Spread /= 35;
    }

    void Update()
    {
        AmmoText.text = Bullets + " / " + Magazine;
        if (Input.GetButtonDown("Fire") && Bullets > 0 && ReloadTimer <= 1) //Если нажата ЛКМ и кол-во патронов больше 0
        {
            Shoot();
        }
        if (Input.GetButtonDown("Reload") && Magazine > 0 && ReloadTimer <= 0 && Bullets < MaxBullets) //Если нажата кнопка Reload Weapon
        {
            ReloadTimer = 2.5f;
            Magazine -= 1;    //-1 обойма
            Bullets = MaxBullets;    //Число патронов в обойме = максимальному числу патронов
            _Audiosourse.PlayOneShot(Reload);      //проигрываем звук перезарядки
        }
        if (ReloadTimer > 0)                    //если таймер больше 0
        {
            ReloadTimer -= Time.deltaTime; //Переменная перезарядки уменьшается с течением времени
        }
        Debug.DrawRay(RaySpawn.position, RaySpawn.forward);
    }

    void Shoot()
    {
        Bullets -= 1;
        _Audiosourse.PlayOneShot(Fire);

        _Decal();
    }
    public void _Decal()
    {
        Vector3 Direction = RaySpawn.TransformDirection(Vector3.forward + new Vector3(Random.Range(-Spread, Spread), Random.Range(-Spread, Spread), 0));
        Ray ray = new Ray(RaySpawn.position, Direction);
        if (Physics.Raycast(ray, out Hit, 200F))
        {
            if (Hit.collider)
            {
                GameObject dec = Instantiate(Decal);
                dec.transform.position = Hit.point + Hit.normal * 0.019f;
                dec.transform.rotation = Quaternion.LookRotation(-Hit.normal);
                dec.transform.SetParent(Hit.transform);

                if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = Decal.GetComponent<Decal>();
                    DecalScript._Decal();

                }
            }
        }
    }
}


 
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение samana 04 фев 2017, 23:00

50VAJJ писал(а):Decal это скрипт который весит на dec, dec это префаб на котором весит скрипт Decal, просто название переменной совпадает с названием скрипта.


Такого лучше не допускать. Попробуйте переименовать
Синтаксис:
Используется csharp
public GameObject Decal;

хотя бы в
Синтаксис:
Используется csharp
public GameObject DecalPrefab;

и соответственно изменить создание
Синтаксис:
Используется csharp
GameObject dec = Instantiate(DecalPrefab);
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Не видит RayCast из другого скрипта

Сообщение samana 04 фев 2017, 23:03

И ещё изменить

Синтаксис:
Используется csharp
 if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = dec.GetComponent<Decal>(); //<--- обратиться к скрипту только что созданного объекта (dec), а не скрипту префаба.
                    DecalScript._Decal();

                }
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

Re: Не видит RayCast из другого скрипта

Сообщение 50VAJJ 04 фев 2017, 23:13

samana писал(а):И ещё изменить

Синтаксис:
Используется csharp
 if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = dec.GetComponent<Decal>(); //<--- обратиться к скрипту только что созданного объекта (dec), а не скрипту префаба.
                    DecalScript._Decal();

                }


Ничего не помогло :( :(
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение 50VAJJ 05 фев 2017, 13:01

50VAJJ писал(а):
samana писал(а):И ещё изменить

Синтаксис:
Используется csharp
 if (Hit.collider.tag == "Sweep")
                {
                    DecalScript = dec.GetComponent<Decal>(); //<--- обратиться к скрипту только что созданного объекта (dec), а не скрипту префаба.
                    DecalScript._Decal();

                }


Ничего не помогло :( :(


Странно. Ошибка пропала но теперь даже дебаг ray_decal не видно

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

public class Decal : MonoBehaviour
{
    public Pistol _Pistol;
    public GameObject __Decal;
    void Start()
    {
        __Decal = gameObject;
    }
    void Update()
    {

    }

    public void _Decal()
    {
        RaycastHit Hit_2;

        Ray ray_decal = new Ray(_Pistol.Hit.point + _Pistol.ray.direction * 5, -gameObject.transform.forward);
        Debug.DrawRay(_Pistol.Hit.point, _Pistol.ray.direction * 5, Color.green, 10);
        if (Physics.Raycast(ray_decal, out Hit_2, 3))
        {
            GameObject dec_2 = Instantiate(__Decal);
            dec_2.transform.position = Hit_2.point + Hit_2.normal * 0.019f;
            dec_2.transform.rotation = Quaternion.LookRotation(-Hit_2.normal);
            dec_2.transform.SetParent(Hit_2.transform);
        }
    }
}
 
50VAJJ
UNIт
 
Сообщения: 102
Зарегистрирован: 26 дек 2015, 23:44

Re: Не видит RayCast из другого скрипта

Сообщение samana 05 фев 2017, 13:33

А в _Pistol точно есть все эти свойства - Hit, point?
Аватара пользователя
samana
Адепт
 
Сообщения: 4738
Зарегистрирован: 21 фев 2015, 13:00
Откуда: Днепропетровск

След.

Вернуться в Скрипты

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

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