Страница 1 из 1

null странно

СообщениеДобавлено: 28 ноя 2021, 13:18
_user_
Всем привет! Такой вот баг произошел.
Есть некий класс Figure:
Синтаксис:
Используется csharp
class Figure : MonoBehaviour
{
    private readonly byte index;
    private readonly Transform position;
    public Figure(in byte index, in Transform position) //конструктор класса
    {
        this.index = index;
        this.position = position;
    }
}
 


И есть другой класс, который содержит Figure:
Синтаксис:
Используется csharp
class otherClass : MonoBehaviour
{
    private Figure[] figures;
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]); //Вывод - "1) figures[i] =  "
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //Вывод - "2) figures[i] =  null" //Почему null
        }
    }
}
 


Почему во втором выводе может быть null, если я создаю новый экземпляр класса Figure?

Re: null странно

СообщениеДобавлено: 28 ноя 2021, 14:16
samana
Синтаксис:
Используется csharp
figures[i] = new Figure(i, transform);

Но у класса otherClass нет свойства transform, там вообще должно выводится исключение.
Может вы мели ввиду?
Синтаксис:
Используется csharp
figures[i] = new Figure(i, thisTransform);

Re: null странно

СообщениеДобавлено: 28 ноя 2021, 14:31
_user_
Только класс otherClass висит на игровом объекте, что означает, что у него есть transform (компонент Transform на этом же объекте). Только всё таки почем null?

Re: null странно

СообщениеДобавлено: 28 ноя 2021, 14:33
_user_
_user_ писал(а):Только класс otherClass висит на игровом объекте, что означает, что у него есть transform (компонент Transform на этом же объекте). Только всё таки почем null?

По факту вот так будет выглядеть:
Синтаксис:
Используется csharp
class otherClass : MonoBehaviour
{
    private Transform transform;
    private Figure[] figures;
    private void Start()
    {
        transform = gameObject.GetComponent<Transform>();
    }
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]); //Вывод - "1) figures[i] =  "
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //Вывод - "2) figures[i] =  null" //Почему null
        }
    }
}
 

Re: null странно

СообщениеДобавлено: 28 ноя 2021, 17:48
Xtir
Как он может висеть на объекте, если он даже не наследуются от MonoBehaviour?

Re: null странно

СообщениеДобавлено: 28 ноя 2021, 18:08
_user_
Это я как пример писал, с реального шаблона. Сейчас исправлю.

Re: null странно

СообщениеДобавлено: 28 ноя 2021, 20:26
samana
Запустил ваш код

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

public class otherClass : MonoBehaviour
{
    void Start()
    {
        InitializeFigures(3, transform);
    }

    private Figure[] figures;
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]);
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //figures[i] =  Figure"
        }
    }
}
public class Figure
{
    private readonly byte index;
    private readonly Transform position;
    public Figure(in byte index, in Transform position) //конструктор класса
    {
        this.index = index;
        this.position = position;
    }
}


Никаких null-ов нет, всё работает нормально.

И ещё какая-то подозрительная фишка с модификатором in для параметров метода. Вы точно знаете, что он делает и что в этом есть необходимость?

Re: null странно

СообщениеДобавлено: 29 ноя 2021, 17:40
_user_
samana писал(а):Запустил ваш код

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

public class otherClass : MonoBehaviour
{
    void Start()
    {
        InitializeFigures(3, transform);
    }

    private Figure[] figures;
    public void InitializeFigures(in byte count, in Transform thisTransform)
    {
        figures = new Figure[count];
        for (byte i = 0; i < count; i++)
        {
            Debug.Log("1) figures[i] = " + figures[i]);
            figures[i] = new Figure(i, transform);
            Debug.Log("2) figures[i] = " + figures[i]); //figures[i] =  Figure"
        }
    }
}
public class Figure
{
    private readonly byte index;
    private readonly Transform position;
    public Figure(in byte index, in Transform position) //конструктор класса
    {
        this.index = index;
        this.position = position;
    }
}


Никаких null-ов нет, всё работает нормально.

И ещё какая-то подозрительная фишка с модификатором in для параметров метода. Вы точно знаете, что он делает и что в этом есть необходимость?


Значит у меня сборщик мусора гребёт? модификатор in - ссылка на данные, не копируя эти данные в промежуточную переменную. Вот если что урок - https://www.youtube.com/watch?v=4Z6e-qw ... N&index=61
Только проблема в том, что даже без in код не рабортает(возвращается null).

Re: null странно

СообщениеДобавлено: 29 ноя 2021, 18:34
1max1
Здесь либо код неполный, либо ты неверно понимаешь консольный вывод.

Re: null странно

СообщениеДобавлено: 29 ноя 2021, 18:38
_user_
Конечно код не полный, я вытащил только ту часть, в которой должна быть ошибка. Ладно, попробую всё переписать, что получится, напишу.

Re: null странно

СообщениеДобавлено: 29 ноя 2021, 18:52
_user_
Нашел решение!!!
Оказалось, что:
Синтаксис:
Используется csharp
class otherClass : MonoBehaviour
{
    ****
            figures[i] = <span style="text-decoration: underline">new</span> Figure(i, transform); //new - подчёркивалось в visual studio, код - UNT0010
    ****
}
 

посмотрел этот код в гугле, класс Figure не может наследоваться от MonoBehaviour в этом случае.
Спасибо всем!

Re: null странно

СообщениеДобавлено: 30 ноя 2021, 00:21
1max1
Вообще-то может, но создавать MonoBehaviour через new не надо.