Глобальные переменные

Общие вопросы о Unity3D

Глобальные переменные

Сообщение Tolking 25 авг 2009, 17:07

А вот как вы без глобальных переменных обходитесь? Или как сделать переменную, чтоб ее везде было видно?

Например нужно зпомнить какой объект кликнули мышей последний раз и в других объектах, узнать об этом событии?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Глобальные переменные

Сообщение Neodrop 25 авг 2009, 17:42

Я во всех программах пишу скрипт CsGlobals.cs
В него складываю все глобальные переменные и частовызываемые функции данного проекта. И вешаю скрипт на GO в сцене. Но только в единственном экземпляре.
В скриптах пишу :

Код: Выделить всё
CsGlobals gl;

void Start()
{
   gl = GameObject.FindObjectOfType(typeof(CsGlobals)) as CsGlobals;
}


И использую переменную gl как интерфейс доступа ко всем моим "глобальным" переменным.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Глобальные переменные

Сообщение Neodrop 25 авг 2009, 17:45

Кстати, к примеру, если в CsGlobals собрать все запросы к классу Input (GetKeyDown, GetMouseButtonUp и пр.) и из прочих скриптов вызывать не класс Input а наш CsGlobals и от него получать состояние часто вызываемых клавиш (а он их проверяет в кадре) то этот метод в 20 раз быстрее прямого запроса к Input.
Вот такая находочка.

10 000 обращений из одного скрипта к другому, занимают 0,000015 миллисекунды на моём компьютере. Это очень быстрый метод. :ymparty:
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Глобальные переменные

Сообщение gnoblin 25 авг 2009, 17:49

Еще можно использовать статические переменные (относятся к классу, а не объекту).

в объявлении класса MyClass:
...
static int blabla;

...

в скриптах:
MyClass.blabla = 10;
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Глобальные переменные

Сообщение Neodrop 25 авг 2009, 17:55

Чего то я тебя недопонял...
А если у тебя этих MyClass висит десять в сцене? Меняя на одном компоненте значение, ты сменишь на всех?
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Глобальные переменные

Сообщение gnoblin 25 авг 2009, 18:05

MyClass myClass;

myClass.someVar = 10; //обычная переменная, уникальна для этого экземпляра класса

MyClass.blabla = 10; //статическая переменная, для всего класса она одна... даже не надо создавать ни одного объекта класса чтобы можно было получить к ней доступ.
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Глобальные переменные

Сообщение Neodrop 25 авг 2009, 18:16

Вот, блин! Опять ученик сделал учителя. :ymparty:

Намотаю на ус. Вряд ли пригодиться... Хотя.. Удобно для задания глобальных состояний - направления ветра, силы излучения или времени суток там... :-?
Или скорости юнитов заданного типа.. Пригадиться-ааа...
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Глобальные переменные

Сообщение Tolking 25 авг 2009, 21:17

gnoblin писал(а):Еще можно использовать статические переменные (относятся к классу, а не объекту).

в объявлении класса MyClass:
...
static int blabla;

...

в скриптах:
MyClass.blabla = 10;

Т.е. я в каком-то гейм объекте пишу:

Class Global
static gameobject TekObj;

Потом везде можно делать просто

Global.TekObj ? Без всякого поиска?
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Глобальные переменные

Сообщение Neodrop 25 авг 2009, 22:19

ЗА тем минусом, что эта переменная сменится во всех скриптах этого типа. Так что это не всегда самое оптимальное решение.
Добавить neodrop в Skype
Изображение
"Спасибо!" нашему порталу, вы сможете сказать ЗДЕСЬ.
Если проблема не решается честно, нужно её обмануть! || Per stupiditas at Astra!
Страх порождает слабость. Бесстрашных поражают пули.
Протратившись на блядях байтах, на битах не экономят.
Аватара пользователя
Neodrop
Админ
 
Сообщения: 8480
Зарегистрирован: 08 окт 2008, 15:42
Откуда: Питер
Skype: neodrop
  • Сайт

Re: Глобальные переменные

Сообщение Const_47 25 авг 2009, 22:59

Она изменится из любого скрипта, что очень удобно. И по моему как для глобальной переменной само то.
Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Глобальные переменные

Сообщение Tolking 17 ноя 2009, 12:19

Код: Выделить всё
public class Global
{
    public static int test;
 
}


вот так нужно объявлять глобалы, в любом скрипте например:

Код: Выделить всё
using UnityEngine;
using System.Collections;


public class Global
{
    public static int test;
 
}


public class CamPivot: MonoBehaviour {

   // Use this for initialization
   void Start () {
        DontDestroyOnLoad(this);
   }
   
   // Update is called once per frame
   void Update () {
   
   }
}


P.S. тема для ФАКа
Ковчег построил любитель, профессионалы построили Титаник.
Аватара пользователя
Tolking
Адепт
 
Сообщения: 2716
Зарегистрирован: 08 июн 2009, 18:22
Откуда: Тула

Re: Глобальные переменные

Сообщение Const_47 17 ноя 2009, 20:20

Классы которые ты используешь как обертки для хранения глобальных переменных используй с спецификатором static. Это гарантирует тебе невозможность создания экземпляра класса, а значит ты заведомо предотвратишь возможную ошибку. Если у тебя есть много глобальных переменных, и некоторые из них близки по логическому смыслу используй вложенные классы, это улучшит читабельность и сопровождение кода.
Например.
Код: Выделить всё
  public static class Global  {
    
   public static class Agent
     {
        public static string Tanya;
        public static string  Kolya;
     }
    
   public static class Country
     {
        public static string Russia;
        public static string USA;
     }
    
  }

Const_47
Герой Форума
 
Сообщения: 271
Зарегистрирован: 23 мар 2009, 19:24
Откуда: Украина. Львов\Новояворовск

Re: Глобальные переменные

Сообщение AndreyMust19 12 авг 2011, 11:27

Создаю класс для редактора с using UnityEditor. Глобальные значения хранятся в статических переменных, другие скрипты их получают так: Имя_класса.Имя_переменной. В папку Editor скрипт положить не могу, поскольку он обращается к объектам сцены.
При запуске игры в редакторе значения статических переменных скрипта возвращаются к начальным (заданным при объявлении). А нужно чтобы они сохранялись.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19

Re: Глобальные переменные

Сообщение gnoblin 12 авг 2011, 13:04

а что делает скрипт?

значения можно хранить в объекте сцены в паблик переменных

не понял про ограничение с папкой Editor
skypeid: madkust
Мои крайние проекты:
Убойный Хоккей
Cube Day Z (альфа)
Аватара пользователя
gnoblin
Адепт
 
Сообщения: 4633
Зарегистрирован: 08 окт 2008, 17:23
Откуда: Минск, Беларусь
Skype: madkust
  • Сайт

Re: Глобальные переменные

Сообщение AndreyMust19 12 авг 2011, 13:31

Скрипт должен работать в режиме редактора. Но положить его в папку Editor не могу, поскольку другие игровые скрипты, обращаются к нему, спрашивая настройки в глобальных переменных. Не знаю куда положить эти глобальные переменные.
Думаю создать отдельный скрипт для объекта сцены, чтобы хранить в нем настройки.
Нужна помощь? Сами, сами, сами, сами, сами... делаем все сами
AndreyMust19
Адепт
 
Сообщения: 1119
Зарегистрирован: 07 июн 2011, 13:19


Вернуться в Общие вопросы

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

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