Прежде всего: Ваша проблема не имеет ничего общего с полем serializable
или нет.
Оно скорее связано с тем, что ваше поле экземпляра класса i
недоступно из контекста static
, Как говорится в сообщении об ошибке, вам понадобится экземпляр вашего класса, чтобы получить к нему доступ , но
Как уже упоминалось, классы типа MonoBehaviour
не могут иметь какого-либо конструктора и могут не иметь быть запущенным через ключевое слово new
в Unity. Единственные разрешенные способы создания экземпляров компонентов - через Instantiate
, AddComponent
или через конструктор, например, new GameObject("someName", typeof(YOUR_COMPONENT));
.
Вам не нужен Singleton для того, что вы хотите. Звучит так, как будто вы на самом деле хотели бы go таким образом:
public class myClass : MonoBehaviour
{
// This one you set via the Inspector
[SerializeField] private int _i;
// This is now a read-only property
// That can only be set by this class
public static int i { get; private set; }
private void Awake()
{
// Your instance can always access its static fields
// So this way you can assign the value
i = _i;
}
}
В общем, нам понадобится больше информации, чтобы выяснить ваш фактический вариант использования здесь. Также возможно, что вы можете использовать полностью статический c класс, такой как, например,
public static class myClass
{
public static int i = 42;
}
, это делает ваше поле не сериализованным, а просто доступным из любого места без необходимости использования экземпляра в сцене. Вы можете просто получить к нему доступ из другого MonoBehaviour
, например,
public class Example : MonoBehaviour
{
private void Start()
{
Debug.Log(myClass.i);
}
}
. Или вы можете сделать так, чтобы ваш класс вообще не стал c, а вместо этого получил бы доступ к нему через правильную ссылку, например
* 1030. *