На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS

Дорогие друзья! Поздравляем вас с Новым 2018 годом!

Всем удачи, успеха и благополучия!
В новом году ожидаем новых рекордов при подсчёте количества ёлочек на экране ;)


msm.ru
! Предназначение данного раздела
Данный раздел предназначен для публикации уроков и примеров по разработке компьютерных игр любого сорта, в том числе авторских проектов участников нашего форума. Главное условие публикации: необходимо не только выложить свое творение, но и подробно описать процесс его создания, подводные камни и прочие, интересные для собрата-разработчика, вкусности.

Если вы желаете выложить свой проект - пишите в Общеорганизационную тему. Есть какие-то другие вопросы по делу - туда же.

Модераторы: Da$aD
  
> [MMORPG своими руками] Часть X.4, Полезные утилиты для Unity своими руками
    Полезные утилиты для Unity своими руками

    В процессе работы с юнити понадобился мне функционал, изначально которого в юнити нет, (или я просто не нашел?)

    Таймеры.

    Хотя анимация и прочее графические эффекты управляются внутренними таймерами юнити, то для логики таймеров с удобными калбеками не предусмотренно. И приходится обходиться старым способом:
    ExpandedWrap disabled
      var delta : float = Time.time - mLastTick;
      if(delta >= mPeriod){
              mLastTick = Time.time;
              // do something
      }


    для того, чтобы инкапсулировать техническую информацию по каждому таймеры я сделал следующий велосипедик.
    Создаем таймер, записываем техническую информацию.
    ExpandedWrap disabled
      /**
          Создание таймера. Удалять нельзя
          @param peroid    период срабатывания таймера
          @param callback  обработчик вызова таймера. Должен иметь метод:
                              function TimerTick(id : int, _time : float)
          
          @return id таймера для управления им
      */
      function Create(period : float, callback){
          var timer : Array = new Array();
          timer.Push(false);
          timer.Push(0);
          timer.Push(period);
          timer.Push(callback);
          var id : int = mTimers.length;
          mTimers.Push(timer);
          return id;
      }


    Управляем таймером:
    ExpandedWrap disabled
      /**
          Запустить таймер
          @param id идентификатор таймера
      */
      function Active(id : int){
          mTimers[id][0] = true;
      }
       
      /**
          Остановить таймер
          @param id идентификатор таймера
      */
      function Deactive(id : int){
          mTimers[id][0] = false;
      }


    Само ядро компонента проверяет активные таймеры:
    ExpandedWrap disabled
      function Update () {
          for(var i : int = 0;i<mTimers.length;i++){
              if(mTimers[i][0]){
                  var _delta : float = Time.time - mTimers[i][1];
                  if(_delta >= mTimers[i][2]){
                      mTimers[i][1] = Time.time;
                      mTimers[i][3].TimerTick(i,_delta);
                  }
              }
          }
      }


    Небольшой примерчик использования:

    Скрытый текст
    ExpandedWrap disabled
      var mTimer : TimerCtrl;
       
      var id : int;
      var id2 : int;
       
      function Start(){
          id = mTimer.Create(1.0,this);
          id2 = mTimer.Create(2.0,this);
      }
       
      function OnGUI(){
          if(GUI.Button(Rect(10,10,100,30),"1 s - Start")){
              mTimer.Active(id);
          }
          
          if(GUI.Button(Rect(10,50,100,30),"2 s - Start")){
              mTimer.Active(id2);
          }
          
          if(GUI.Button(Rect(10,90,100,30),"1 s - Stop")){
              mTimer.Deactive(id);
          }
          
          if(GUI.Button(Rect(10,130,100,30),"2 s - Stop")){
              mTimer.Deactive(id2);
          }
      }
       
      function TimerTick(id : int,_time : float){
          print(id+":"+_time);
      }





    Таблицы игровых данных.

    В любом проекте присутствуют статические игровые данные. Описание монстров, описание персонажей. Т.к. на сервере будут присутствовать таблицы с аналогичным данным. Например, параметры монстров на клиенте нужны для отображения игроку, а на сервере для расчетов боевок. То такие записи будут иметь числовые идентификаторы, общие для клиента и сервера. Для организации таких таблиц и удобного поиска использую такую компоненту:
    Скрытый текст
    ExpandedWrap disabled
      private var mDatabase : Array = new Array();
      private var mCurTable : Array;
       
      /**
          Создать новую таблицу
          @return идентифкатор таблицы
      */
      function CreateTable(){
          var id : int = mDatabase.length;
          mDatabase.Push(new Array());
          return id;
      }
       
      /**
          Выбрать текущую таблицу
          @param table идентификатор таблицы
      */
      function SelectTable(table : int){
          mCurTable = mDatabase[table];
      }
       
      /**
          Очистить текущую таблицу
      */
      function ClearTable(){
          mCurTable.Clear();
      }
       
      /**
          Вставить запись в текущую таблицу
          @param id идентификатор записи
          @param data  данные записи
      */  
      function InsertRecord(id : int, data : Array){
          data.Unshift(id);
          mCurTable.Push(data);
      }
       
      /**
          Выбрать запись из тукущей таблицы
          @return запись или null
      */
      function SelectRecord(id : int){
          for(var i : int = 0; i < mCurTable.length; i++){
              if(mCurTable[i][0] == id){
                  return mCurTable[i];
              }
          }
          
          return null;
      }
       
      /**
          Выбрать все записи из текущей таблицы
          @return таблица
      */
      function SelectAllRecords(){
          return mCurTable;
      }



    Пример использования, хоть и синтетический:
    ExpandedWrap disabled
      var mDB : GameDatabase;
       
      function Start(){
          var t1 = mDB.CreateTable();
          var t2 = mDB.CreateTable();
          var t3 = mDB.CreateTable();
          
          mDB.SelectTable(t2);
          var d = new Array();
          d.Push("foo",1,true,"bar");
          mDB.InsertRecord(69,d);
          d = new Array();
          d.Push("x",-1.06,false,"y");
          mDB.InsertRecord(38,d);
          var r = mDB.SelectAllRecords();
          print(r[0]);
          print(r[1]);
          r = mDB.SelectRecord(38);
          r[1] = "none";
          r = mDB.SelectRecord(38);
          print(r);
       
      }

    Прикреплённая картинка
    Прикреплённая картинка
      Таймеры гораздо удобнее и более оптимально организовывать при помощи короутин.
      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0885 ]   [ 18 queries used ]   [ Generated: 20.01.18, 23:10 GMT ]