Обращение к единственному экземпляру класса

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

Обращение к единственному экземпляру класса

Сообщение extravert 25 янв 2013, 21:49

Здравствуйте, сабж следующий, из азов так скажем.
Возможно ли реализовать обращение к единственному экземпляру класса в коде без особых проблем?
Например есть объект Core, который хранит данные о настройках игры, текстурах и прочем, используемые одинаково на протяжении всей игры.
Я делаю обращение следующий образом

class TCore : MonoBehavour {
public static TCore main;
public int Value; //Какое то значение для примера что класс что то хранит

void Start() {
main = this;
}
}

И это работает.
var a = TCore.main.Value;
Однако я хотел бы использовать похожую конструкцию со включенным [ExecuteInEditMode]

Пробовал засунуть присвоение Main = this в метод Awake, однако результата это не дало. Метод аля Update считаю совсем лишним. Операцию нужно сделать только один раз и не трогать и не проверять ее наличие больше.
Решение нужно по той причине, что Unity ругается в редакторе, а хотелось бы иметь чистый и красивый инстанс.

Возможно я делаю это не правильно. Если да - скажите как правильно.

З.Ы. Попутно хотел бы узнать - нет ли способа получить доступ к ассетам, лежащим в папке определенной, но не "навязанных" на игровой объект. Если да то какой. Уж очень муторно добавлять ссылочки в гейм объекте на заклинания и предметы (коих воообще тьма)
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Обращение к единственному экземпляру класса

Сообщение seaman 25 янв 2013, 22:07

Синтаксис:
Используется csharp
class TCore : MonoBehavour {
   private static TCore main;
   public int Value; //Какое то значение для примера что класс что то хранит

   void Start() {
       main = this;
   }

   public static Innstanse{
       get{
           if(main == null) main = this;
           return main;
        }
    }
}

Вместо var a = TCore.main.Value; используем
var a = TCore.Innstanse.Value;
доступ к ассетам

Resources.Load
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к единственному экземпляру класса

Сообщение extravert 25 янв 2013, 22:27

seaman писал(а):
Синтаксис:
Используется csharp
class TCore : MonoBehavour {
   private static TCore main;
   public int Value; //Какое то значение для примера что класс что то хранит

   void Start() {
       main = this;
   }

   public static Innstanse{
       get{
           if(main == null) main = this;
           return main;
        }
    }
}

Вместо var a = TCore.main.Value; используем
var a = TCore.Innstanse.Value;
доступ к ассетам

Resources.Load


ненене, стоп, так нельзя делать. В Instance в твоем случае попадает this, которое не может использоваться в поле типа static. Компилятор это не пропустит даже.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Обращение к единственному экземпляру класса

Сообщение seaman 25 янв 2013, 22:32

Ну да, не подумав скопировал. Убрать статик у private static TCore main;!
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к единственному экземпляру класса

Сообщение extravert 25 янв 2013, 22:39

seaman писал(а):Ну да, не подумав скопировал. Убрать статик у private static TCore main;!

Это не очень все меняет. В таком случае в поле типа статик Instance еще и объект main нестатичного типа, а не только this. Та же ошибка просто стала больше :)

З.Ы. Я думаю нужно что то менять в методах. Есть ли методы прогружаемые по executeInEditMode но отличные от рефреша?
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Обращение к единственному экземпляру класса

Сообщение extravert 25 янв 2013, 22:49

ЮПИ! Проблема решена и решена очень просто!

Сам код:
Синтаксис:
Используется csharp
public class MyClass : MonoBehaviour
{
    public static MyClass Main;
    public int Value; //пример поля к которому нужно обратиться

    MyClass() {
        Main = this;
    }
}
 


Пример использования в любом другом классе:
Синтаксис:
Используется csharp
MyClass.Main.Value = 10


Так все отлично работает! Как я мог забыть попробовать конструктор - ума не приложу.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Обращение к единственному экземпляру класса

Сообщение seaman 25 янв 2013, 22:51

Как я мог забыть попробовать конструктор - ума не приложу.

7. Avoid using the constructor or variable initializers.

Never initialize any values in the constructor or variable initializers in a MonoBehaviour script. Instead use Awake or Start for this purpose. Unity automatically invokes the constructor even when in edit mode. This usually happens directly after compilation of a script because the constructor needs to be invoked in order to retrieve default variable values. Not only will the constructor be called at unforeseen times, it might also be called for prefabs or inactive game objects.

Using the constructor when the class inherits from MonoBehaviour, will make the constructor to be called at unwanted times and in many cases might cause Unity to crash.

Мануал
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к единственному экземпляру класса

Сообщение extravert 25 янв 2013, 22:56

Блин, а это печальная новость. Awake то InEditMode не держит...
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Обращение к единственному экземпляру класса

Сообщение seaman 25 янв 2013, 23:00

Ну так делайте Ваш синглтон как я написал.
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к единственному экземпляру класса

Сообщение extravert 25 янв 2013, 23:03

Тогда заместо конструктора можно использовать
Синтаксис:
Используется csharp
private void OnEnable()

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

Как вы написали это же не работает, я уже объяснил почему. Вы в статике прописываете поля экземпляра. В обоих постах. Это ошибка компилятора, при том явная.
Аватара пользователя
extravert
UNIверсал
 
Сообщения: 465
Зарегистрирован: 24 дек 2012, 11:54

Re: Обращение к единственному экземпляру класса

Сообщение seaman 25 янв 2013, 23:40

Да, нужно спать ложиться... :o)
seaman
Адепт
 
Сообщения: 8352
Зарегистрирован: 24 янв 2011, 12:32
Откуда: Самара

Re: Обращение к единственному экземпляру класса

Сообщение Nicloay 26 янв 2013, 04:38

Вот вам
http://wiki.unity3d.com/index.php/Singleton

а этот синглетон можно сохранять и выгружать из playerPrefs
https://www.assetstore.unity3d.com/?#/content/4902
If you wish to make an apple pie from scratch, you must first invent the universe.(Carl Sagan, Cosmos)
| My Asset Store | coloring book | github | _wiki.unity3d.com | twitter | linkedin |
Аватара пользователя
Nicloay
Адепт
 
Сообщения: 1288
Зарегистрирован: 31 май 2012, 09:27
Откуда: Альпс
  • Сайт


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

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

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