Счетчик времени. [Решено]

Программирование на Юнити.

Счетчик времени. [Решено]

Сообщение LexLotr 21 ноя 2010, 15:08

Приветствую всех!
Вот появился такой вопрос: есть небольшая игра, где машинка собирает предметы по карте. Нужно как нибудь сделать определенный счетчик (таймер) времени, который отводится на игру, который будет выводиться на экран. Вот скрипт на сбор предметов и сам счетчик:
Код: Выделить всё
static var Count : int = 0;
static var ECount : int = 0;
static var Win : int = 600;
var CollectSound : AudioClip;

function OnCollisionEnter(Gem : Collision){

   if(Gem.gameObject.tag == "gem"){
      
      Destroy(Gem.gameObject);
      Count++;
      audio.PlayOneShot(CollectSound);
   }   
   
   if(Gem.gameObject.tag == "extragem"){
      
      Destroy(Gem.gameObject);
      ECount++;
      audio.PlayOneShot(CollectSound);
   }   
   
   while(Win!=0) {
   Win.sleep(1000);
   Win--;
   
   }
   
   
}




Все объекты собираются и счетчик нормально ведет себя. Дело в том, что для таймера, он слишком быстро вычитает значение. В данном случае 600 до 0 он сбрасывает за 1-2 секунды.
Не подскажите как в ява-скрипте можно по нормальному реализовать задержку перед вычетом, скажем как есть в С++ delay();, тут можно сделать что-то на подобе?
В моем скрипте при использовании sleep выдает ошибку Assets/My Scripts/GemCollect.js(23,13): BCE0019: 'sleep' is not a member of 'int'. Может я не знаю просто, какой тип переменной для него присвоить?
Заранее благодарен за ответ.
Последний раз редактировалось LexLotr 22 ноя 2010, 22:31, всего редактировалось 1 раз.
LexLotr
UNец
 
Сообщения: 16
Зарегистрирован: 13 ноя 2010, 21:17

Re: Счетчик времени.

Сообщение Pyx 21 ноя 2010, 16:41

Используйте Time.time ,чтобы определить время с начала игры.
Как то так
Код: Выделить всё
var clos :float = 600,0;
var tm = clos-Time.time ;
while(tm>0)
{
....
}

Pyx
 

Re: Счетчик времени.

Сообщение Paul Siberdt 21 ноя 2010, 17:15

Странно, а почему не возникает желания почитать документацию?
Интересует время? Лезем в справку по Time.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Счетчик времени.

Сообщение LexLotr 21 ноя 2010, 20:10

Pyx писал(а):Используйте Time.time ,чтобы определить время с начала игры.
Как то так
Код: Выделить всё
var clos :float = 600,0;
var tm = clos-Time.time ;
while(tm>0)
{
....
}


Спасибо за подсказку.
Воспользовался вашим способом, но начали происходить необычные вещи :) Иногда при запуске проекта юнити наглухо виснет, иногда (редко) счетчик отображается и работает, и иногда проект вообще не запускается вот с такой ошибкой: ArgumentException: get_time can only be called from the main thread.
Constructors and field initializers will be executed from the loading thread when loading a scene.
Don't use this function in the constructor or field initializers, instead move initialization code to the Awake or Start function.
TimerDisplay..ctor () (at Assets/My Scripts/TimerDisplay.js:2)

Я очень плохо в этом понимаю, но видно, что то я не то делаю.
Вот сам скрипт на отображение счетчика на экран:
Код: Выделить всё
var clos : float =600.0;
var tm = clos - Time.time;



function Update () {

while(tm>0) {

var prefix = "You have a ";
var suffix = " time for win in this game!";
//guiText.color = Color.green;
guiText.text = prefix + tm + suffix;

}
}

Направьте меня , пожалуйста, на путь истинный :)
LexLotr
UNец
 
Сообщения: 16
Зарегистрирован: 13 ноя 2010, 21:17

Re: Счетчик времени.

Сообщение bgeyts667 21 ноя 2010, 20:49

Насколько я понял, unity ворчит, потому что вы используете Time.time при инициализации переменной. Попробуйте ее инициализировать, а потом назначить значение уже внутри функции.
Вопрос от меня - разве инициализация переменной не происходит единожды? Тогда "var tm = clos-Time.time ;" произойдет лишь один раз, так ведь?
_bgeyts667@gmail.com
Аватара пользователя
bgeyts667
UNITрон
 
Сообщения: 175
Зарегистрирован: 25 авг 2010, 08:30
  • ICQ

Re: Счетчик времени.

Сообщение Golandez 21 ноя 2010, 21:15

LexLotr писал(а):
Код: Выделить всё
var clos : float =600.0;
var tm = clos - Time.time;



function Update () {

while(tm>0) {

var prefix = "You have a ";
var suffix = " time for win in this game!";
//guiText.color = Color.green;
guiText.text = prefix + tm + suffix;

}
}

Направьте меня , пожалуйста, на путь истинный :)

1.Не все переменные типизированы.
2.guiText.text возвращет string.Вы же туда float засовываете.Используйте float.toString(),если не изменяет память.
3.Посмотрите как выводится правильно guiText.text.В вашем случае это попытка сложить переменные.
Ошибки в консоли не читал,может что и пропустил.
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Счетчик времени.

Сообщение LexLotr 22 ноя 2010, 00:40

bgeyts667
Объявление этой переменной происходит только тут. Наверно вы правы, нужно засунуть ее в цикл. Попробую сделать как вы сказали, после отпишусь :)
Golandez
Вот например при выводе у меня есть такой скрипт:
Код: Выделить всё
function Update () {
   
   var prefix = "Gems: ";
   var suffix = "/40";
   //guiText.color = Color.green;
   guiText.text = prefix + GemCollect.Count + suffix;
   
}

тут переменная Count вызывается из другого скрипта, но у нее тоже не символьный тип , а инт и все почему то работает :)
Попробую сделать и как вы сказали тоже.
LexLotr
UNец
 
Сообщения: 16
Зарегистрирован: 13 ноя 2010, 21:17

Re: Счетчик времени.

Сообщение Paul Siberdt 22 ноя 2010, 05:59

не проще ли в одну строчку записать, не плодя переменных?
Код: Выделить всё
guiText.text = "Gems: " + GemCollect.Count + "/40";

Инты и другие типы автоматически парсятся в строку, если включены в выражение, что обрабатывает строки.
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Счетчик времени.

Сообщение Golandez 22 ноя 2010, 14:25

Пф...Посыпаю себе голову пеплом...
Ты нужен только тогда,когда нужен.(С)
Сказать спасибо
Аватара пользователя
Golandez
Пилигрим
 
Сообщения: 1637
Зарегистрирован: 06 авг 2009, 13:55
Откуда: Харьков
Skype: lestardigital

Re: Счетчик времени.

Сообщение Multirezonator 22 ноя 2010, 16:03

Я думаю счетчик времени можно сделать как-то так:
Синтаксис:
Используется csharp
using UnityEngine;

public class Class1:MonoBehaviour {
        public float gameTime=40;//время на игру в секундах

        private float endTimePoint;//точка останова игры

        private void Start() {
                //вычисляем точку останова
                endTimePoint=Time.time+gameTime;
        }

        private void Update() {
                //если время закончилось
                if(endTimePoint<Time.time) {
                        print("Время вышло!");
                        //здесь делаем действия когда время закончилось
                        //чтобы больше не попадать в этот Update.
                }
        }
}
Скрытый текст:



Аватара пользователя
Multirezonator
UNITрон
 
Сообщения: 248
Зарегистрирован: 15 фев 2010, 16:12
Откуда: Украина, Луганск
  • Сайт

Re: Счетчик времени.

Сообщение LexLotr 22 ноя 2010, 16:07

Paul Siberdt
Проще оно так, но сделано это для типизации всего проекта и после эти переменные используются еще в других местах, просто чтобы не писать все текстом.
И ваш и мой вариант работают, но тут все дело упирается в проблему быстрого пересчета: моим первоначальным способом таймер выводится на экран и просто очень быстро сбрасывается до 0 , мне вот хочется как нибудь сделать задержки перед очередным вычетом из переменной одной единицы. Ну или как предложил уважаемый Pyx , но его способ у меня пока что не получается.

Multirezonator
Спасибо большое за подсказку. Сейчас попробую ваш вариант.
Последний раз редактировалось LexLotr 22 ноя 2010, 16:11, всего редактировалось 2 раз(а).
LexLotr
UNец
 
Сообщения: 16
Зарегистрирован: 13 ноя 2010, 21:17

Re: Счетчик времени.

Сообщение Multirezonator 22 ноя 2010, 16:08

Или еще лучше сделать это с помощью корутины..
Синтаксис:
Используется csharp
using UnityEngine;
using System.Collections;

public class Class1:MonoBehaviour {
        public float gameTime=40;//время на игру в секундах

        private void Start() {
                //вызываем коронтайм функцию
                StartCoroutine(OnTimer());
        }

        private IEnumerator OnTimer() {
                //ожидаем нужное время
                yield return new WaitForSeconds(gameTime);
                //выводим сообщение о окончании игры
                print("Время вышло!");
                //здесь делаем действия которые нужно сделать когда время закончилось
        }
}
Скрытый текст:



Аватара пользователя
Multirezonator
UNITрон
 
Сообщения: 248
Зарегистрирован: 15 фев 2010, 16:12
Откуда: Украина, Луганск
  • Сайт

Re: Счетчик времени.

Сообщение Multirezonator 22 ноя 2010, 16:17

Синтаксис:
Используется csharp
using UnityEngine;

public class Class1:MonoBehaviour {
        public float gameTime=40;//время на игру в секундах

        public float endTimePoint;//точка останова игры

        private void Start() {
                //вычисляем точку останова
                endTimePoint=Time.time+gameTime;
        }

        private void Update() {
                //выводим оставшееся время игры
                print((endTimePoint-Time.time).ToString("0")+" sec");
                //если время закончилось
                if(endTimePoint<Time.time) {
                        print("Время вышло!");
                        //здесь делаем действия когда время закончилось
                        //чтобы больше не попадать в этот Update
                }
        }
}


сделали переменную endTimePoint паблик и можем использовать ее из других скриптов
+ добавили вывод времени до конца игры(естественно то же самое можно делать и с помощью GUI вместо print)
Скрытый текст:



Аватара пользователя
Multirezonator
UNITрон
 
Сообщения: 248
Зарегистрирован: 15 фев 2010, 16:12
Откуда: Украина, Луганск
  • Сайт

Re: Счетчик времени.

Сообщение Paul Siberdt 22 ноя 2010, 18:07

Если переменные пользуются в других местах, зачем они объявляются в апдейте? Заведите скрипт с данными и опишите там все варианты стрингов.

Я не понимаю проблемы. Есть Time.deltaTime, которая считает доли секунды между соседними кадрами. Если в апдейте вы будете каждый раз к счетчику прибавлять Time.deltaTime, то получите 1.0 ровно через секунду времени. Почему вы с удовольствием читаете ответы-листинги, а не смотрите в документацию?

Кроме того, если у вас в проекте не изменяется ток времени, можно не считать счетчики вручную, а воспользоваться коротинами:

когда надо, вызываем функцию, скажем, BuBuBu(5.0);
Код: Выделить всё
BuBuBu(5.0); // секунды
function BuBuBu( _time : float ) {
  yield WaitForSeconds( _time );
  print ("Ta-Da!");
}


если все же хотите крутить таймер руками в коротине:

Код: Выделить всё
BuBuBu(5.0); // секунды
function BuBuBu( _time : float ){
  var t : float = 0.0;
  while (t < 1.0) {
   t += Time.deltaTime * (1.0/_time);
   yield;
  }
  print ("Ta-Da!");
}


если пофиг на единицы таймера:

Код: Выделить всё
BuBuBu(5.0);
function BuBuBu( _time : float ){
  var t : float = 0.0;
  while (t < _time) {
   t += Time.deltaTime;
   yield;
  }
  print ("Ta-Da!");
}


если хотите крутить таймер руками в апдейте:

Код: Выделить всё
var _time : float = 5.0;
var t : float = 0.0;
function Update(){
.....
  if (t < 1.0) {
   t += Time.deltaTime * (1.0/_time);
  }
  else print ("Ta-Da!");
.....
}


Может быть, конечно, пользовать Time.time в чем-то проще... но мне всегда было до лампочки, сколько прошло времени с запуска приложения до момента, когда потребовалось включить таймер, да и всегда цифра начальная смотрится некрасиво. :)
Аватара пользователя
Paul Siberdt
Адепт
 
Сообщения: 5317
Зарегистрирован: 20 июн 2009, 21:24
Откуда: Moscow, Russia
Skype: siberdt
  • Сайт

Re: Счетчик времени.

Сообщение LexLotr 22 ноя 2010, 22:30

Paul Siberdt
Multirezonator
Golandez
bgeyts667
Pyx
Спасибо за помощь ребята. Все ваши наставления пошли на пользу и все получилось сделать. Таймер тикает и работает и игра заканчивается по его истечению. :)
LexLotr
UNец
 
Сообщения: 16
Зарегистрирован: 13 ноя 2010, 21:17


Вернуться в Скрипты

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

Сейчас этот форум просматривают: Yandex [Bot] и гости: 7