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

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

СообщениеДобавлено: 21 ноя 2010, 15:08
LexLotr
Приветствую всех!
Вот появился такой вопрос: есть небольшая игра, где машинка собирает предметы по карте. Нужно как нибудь сделать определенный счетчик (таймер) времени, который отводится на игру, который будет выводиться на экран. Вот скрипт на сбор предметов и сам счетчик:
Код: Выделить всё
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'. Может я не знаю просто, какой тип переменной для него присвоить?
Заранее благодарен за ответ.

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

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


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

СообщениеДобавлено: 21 ноя 2010, 17:15
Paul Siberdt
Странно, а почему не возникает желания почитать документацию?
Интересует время? Лезем в справку по Time.

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

СообщениеДобавлено: 21 ноя 2010, 20:10
LexLotr
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;

}
}

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

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

СообщениеДобавлено: 21 ноя 2010, 20:49
bgeyts667
Насколько я понял, unity ворчит, потому что вы используете Time.time при инициализации переменной. Попробуйте ее инициализировать, а потом назначить значение уже внутри функции.
Вопрос от меня - разве инициализация переменной не происходит единожды? Тогда "var tm = clos-Time.time ;" произойдет лишь один раз, так ведь?

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

СообщениеДобавлено: 21 ноя 2010, 21:15
Golandez
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.В вашем случае это попытка сложить переменные.
Ошибки в консоли не читал,может что и пропустил.

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

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

тут переменная Count вызывается из другого скрипта, но у нее тоже не символьный тип , а инт и все почему то работает :)
Попробую сделать и как вы сказали тоже.

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

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

Инты и другие типы автоматически парсятся в строку, если включены в выражение, что обрабатывает строки.

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

СообщениеДобавлено: 22 ноя 2010, 14:25
Golandez
Пф...Посыпаю себе голову пеплом...

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

СообщениеДобавлено: 22 ноя 2010, 16:03
Multirezonator
Я думаю счетчик времени можно сделать как-то так:
Синтаксис:
Используется 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.
                }
        }
}

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

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

Multirezonator
Спасибо большое за подсказку. Сейчас попробую ваш вариант.

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

СообщениеДобавлено: 22 ноя 2010, 16:08
Multirezonator
Или еще лучше сделать это с помощью корутины..
Синтаксис:
Используется 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("Время вышло!");
                //здесь делаем действия которые нужно сделать когда время закончилось
        }
}

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

СообщениеДобавлено: 22 ноя 2010, 16:17
Multirezonator
Синтаксис:
Используется 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)

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

СообщениеДобавлено: 22 ноя 2010, 18:07
Paul Siberdt
Если переменные пользуются в других местах, зачем они объявляются в апдейте? Заведите скрипт с данными и опишите там все варианты стрингов.

Я не понимаю проблемы. Есть 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 в чем-то проще... но мне всегда было до лампочки, сколько прошло времени с запуска приложения до момента, когда потребовалось включить таймер, да и всегда цифра начальная смотрится некрасиво. :)

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

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