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

Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:09
Let_out
Создал такой класс:
Синтаксис:
Используется csharp
public class User : MonoBehaviour
{
    public int topicNumber;
    public int questionNumber;

    public User(int topic = 1, int question = 1)
    {
        topicNumber = topic;
        questionNumber = question;
    }

    public User()
    {
        topicNumber = 1;
        questionNumber = 1;
    }

    public void GetInfo()
    {
        Debug.Log("Тема: " + topicNumber + ", Завдання: " + questionNumber);
    }
}

Его экземпляр
Синтаксис:
Используется csharp
User CurrentTask = new User()


После чего Юнити выдало такую ошибку:
You are trying to create a MonoBehaviour using the 'new' keyword. This is not allowed. MonoBehaviours can only be added using AddComponent(). Alternatively, your script can inherit from ScriptableObject or no base class at all
UnityEngine.MonoBehaviour:.ctor()
User:.ctor() (at Assets/NewBehaviourScript.cs:17)
NewBehaviourScript:Update() (at Assets/NewBehaviourScript.cs:49)

В инете нашел что можно исправить таким способом:
Синтаксис:
Используется csharp
this.gameObject.AddComponent<User>();
User CurrentTask = this.gameObject.GetComponent<User>();

Но если так, то я не могу заполнять поля.

Вопрос, можно ли использовать new для создание экземпляра, чтобы юнька не жаловалась. И если нет какие решения есть? Понимаю что объяснил не внятно, но я не знаю как еще это сделать

Re: Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:17
Jarico
В MonoBehaviour нельзя создавать конструкторы и деструкторы т.к. MonoBehaviour-Behaviour->Component->Object создаётся нативным кодом движка

Re: Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:22
Let_out
Тогда как заполнять поля? И где можно почитать об этом?

Re: Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:26
1max1
Ты же сам ответил на свой вопрос.
Синтаксис:
Используется csharp
go.AddComponent<User>();
User CurrentTask = go.GetComponent<User>();
CurrentTask.topicNumber = 123;

Re: Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:29
Let_out
Просто это очень неудобно, в отличии от стандартной записи в одну строку, т.к. у меня в этом классе будет с десяток полей. Получается это единственный способ?

Re: Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:31
1max1
Let_out писал(а):Просто это очень неудобно, в отличии от стандартной записи в одну строку, т.к. у меня в этом классе будет с десяток полей. Получается это единственный способ?

Сделай в классе метод Init, и вызывай его.
Вот запись в 1 строку:
Синтаксис:
Используется csharp
class XXX : MonoBehaviour
{
    void Start()
    {
        gameObject.AddComponent<User>().Init();
    }
}

class User : MonoBehaviour
{
    public int topicNumber;
    public int questionNumber;

    public void Init(int topic = 1, int question = 1)
    {
        topicNumber = topic;
        questionNumber = question;
    }
}

Re: Создание экземпляра класса на Юнити

СообщениеДобавлено: 18 мар 2020, 16:41
Let_out
Спасибо! Это то что нужно