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

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

СообщениеДобавлено: 25 авг 2009, 17:07
Tolking
А вот как вы без глобальных переменных обходитесь? Или как сделать переменную, чтоб ее везде было видно?

Например нужно зпомнить какой объект кликнули мышей последний раз и в других объектах, узнать об этом событии?

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

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

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

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


И использую переменную gl как интерфейс доступа ко всем моим "глобальным" переменным.

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

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

10 000 обращений из одного скрипта к другому, занимают 0,000015 миллисекунды на моём компьютере. Это очень быстрый метод. :ymparty:

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

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

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

...

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

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

СообщениеДобавлено: 25 авг 2009, 17:55
Neodrop
Чего то я тебя недопонял...
А если у тебя этих MyClass висит десять в сцене? Меняя на одном компоненте значение, ты сменишь на всех?

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

СообщениеДобавлено: 25 авг 2009, 18:05
gnoblin
MyClass myClass;

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

MyClass.blabla = 10; //статическая переменная, для всего класса она одна... даже не надо создавать ни одного объекта класса чтобы можно было получить к ней доступ.

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

СообщениеДобавлено: 25 авг 2009, 18:16
Neodrop
Вот, блин! Опять ученик сделал учителя. :ymparty:

Намотаю на ус. Вряд ли пригодиться... Хотя.. Удобно для задания глобальных состояний - направления ветра, силы излучения или времени суток там... :-?
Или скорости юнитов заданного типа.. Пригадиться-ааа...

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

СообщениеДобавлено: 25 авг 2009, 21:17
Tolking
gnoblin писал(а):Еще можно использовать статические переменные (относятся к классу, а не объекту).

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

...

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

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

Class Global
static gameobject TekObj;

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

Global.TekObj ? Без всякого поиска?

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

СообщениеДобавлено: 25 авг 2009, 22:19
Neodrop
ЗА тем минусом, что эта переменная сменится во всех скриптах этого типа. Так что это не всегда самое оптимальное решение.

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

СообщениеДобавлено: 25 авг 2009, 22:59
Const_47
Она изменится из любого скрипта, что очень удобно. И по моему как для глобальной переменной само то.

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

СообщениеДобавлено: 17 ноя 2009, 12:19
Tolking
Код: Выделить всё
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. тема для ФАКа

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

СообщениеДобавлено: 17 ноя 2009, 20:20
Const_47
Классы которые ты используешь как обертки для хранения глобальных переменных используй с спецификатором 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;
     }
    
  }


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

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

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

СообщениеДобавлено: 12 авг 2011, 13:04
gnoblin
а что делает скрипт?

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

не понял про ограничение с папкой Editor

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

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