Как сделать свой таймер?

Научился сам? Помоги начинающему.

Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 03:07

Я заметил что у новичков возникает много вопросов по созданию своего таймера, и поэтому решил выложить свой вариант написания, более простого скрипта в двух вариантах, c изменением положения на экране GUI и без, но с более детальным описанием
Поэтому решил на быструю руку набросать пару строчек, и выложить сюда да бы развеить новичкам их страшные сны.
версия 1:
Синтаксис:
Используется csharp
 

using UnityEngine;
using System.Collections;

public class TimerLesson : MonoBehaviour {
        public int xs, ys,;
        public int xm, ym;
        //do not edit
        public int timersecond;
        public float secondgametime = 0;
        public float secondgametimereset = 0;
        public float minedgametime = 0;
        public float minegametimereset = 0;

        void Update () {

                                //up game timer translate in second
                                secondgametime += Time.deltaTime;
                if (secondgametime >= 2.5) {
                        timersecond += 1;
                }
                if (secondgametime >= 2.5) {
                        secondgametime = secondgametimereset;
                }
                //up second time translate into minutes
                if (timersecond >= 60) {
                        minedgametime += 1;
                        timersecond = 0;
                }
                if (minedgametime >= 60) {
                        minedgametime = minegametimereset;
                }
        }

        void OnGUI (){

                GUI.Label(new Rect(Screen.width - xs,ys,xs1,ys1), " " + timersecond);
                GUI.Label(new Rect(Screen.width - xm, ym, xm1, ym1), " " + minedgametime);
        }
        }
 


Координаты для GUI - высота,ширина на экране
public int xs, ys;
public int xm, ym;

стартовые числа для счётчика
public int timersecond;
public float secondgametime = 0;
public float secondgametimereset = 0;
public float minedgametime = 0;
public float minegametimereset = 0;

Запускаем наш таймер в положительном счёте, то есть 1,2,3,4 и т.д. (Примечание, если написать вместо += , -= то будет считать наоборот -1,-2,-3 и т.д.)
secondgametime += Time.deltaTime;
Выравниваем секунды в нормальные(Unity секунды спешат где то на двадцать секунд проверял ради интересна с телефона)

Синтаксис:
Используется csharp
if (secondgametime >= 2.5) {
                        timersecond += 1;
                }
                if (secondgametime >= 2.5) {
                        secondgametime = secondgametimereset;
                }
 

Рассчитываем счётчик для минут

Синтаксис:
Используется csharp
//up second time translate into minutes
                if (timersecond >= 60) {
                        minedgametime += 1;
                        timersecond = 0;
                }
                if (minedgametime >= 60) {
                        minedgametime = minegametimereset;
                }
        }
 


Вывод Чисел на экран, причём числа не будут плясать по экрану,на разных по размеру экранам, а будут фиксироваться.
Синтаксис:
Используется csharp
void OnGUI (){
                GUI.Label(new Rect(Screen.width - xs,ys, 100, 50), " " + timersecond);
                GUI.Label(new Rect(Screen.width - xm, ym, 100, 50), " " + minedgametime);
        }
        }
 

Дальше вешаем скрипт на камеру, в инспекторе скрипта пишем координаты GUI 700,10 и 670,10 или же свои
Вывод числа не как в Unity таймере 1.343453 а культурные целые числа
Так же хочу отметить что если написать вместо апдейт, фиксапдейт, то скрипт на ос андроид будет работать немного точнее

версия 2 с подробным описанием в более оптемизированном скрипте

По этой ссылке скачивайте Asset и импортируете его в Unity
https://yadi.sk/d/X56YqD3JeoToL
Дальше откройте проект, он называется LessonTimer
Заходим папку скрипт и отрываем файл под названием TimerEmult
И так что мы видим
Изображение
Поскольку описание в скрипте есть я не буду сильно на этом останавливаться..
Дальше вешаем наш скрипт на камеру
Изображение
Запускаем и видим что отсчёт идёт
Изображение
Дальше нам к примеру надо сделать что бы секунды и минуты начинали отчёт с 20 секунд 30 минут
Идём в Inspector
Пишем на против поля Timersecond 10, а на против поля Minedgametime 30
Изображение
запускаем и видим отсчёт в секундах начался с 10 секунд, а отчёт минут с 30 минут.
Собственно сам скрипт кому лень скачивать)))

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

using UnityEngine;
using System.Collections;

public class TimerEmult : MonoBehaviour {
        public int timersecond; // проверка отчёта секунд в Inspector
        private float secondgametime; //(?) - нужно для работы Time.deltaTime
        public float minedgametime;// проверка отчёта минут в Inspector
        void Update () { // обновляет код каждый кадр

                                secondgametime += Time.deltaTime;
                                // расчитывакт интерфал времени.К примеру если хотите что бы счёстчик считал быстрее
                                //измените secondgametime >=1 на secondgametime => 0.5 , медленее - наоборот
                                if (secondgametime >= 1) {
                // если secondgametime больше или равен нулю, тогда прибаляет одну секунду в наш счётчик
                                                timersecond += 1;
                                                //приравнивает счётчик Unity к нашему сеундному счётчику, тоесть счётчик Unity начинает
                                                //отчёт от 0.0000, и когда доходит до еденицы сбрасывается до нуля
                                                secondgametime = 0; // (?) - у нас в secondgametime записан счётчик Unity
                                }
                //проделываем то же самое только уже с минутами
                if (timersecond >= 60) {
                        //Если timersecond равен или больше 60, тогда к minegametime прибавляем одну минуту
                        minedgametime += 1;
                        //Сбрасываем секунды (возращяем секунды в исходное положение)
                        timersecond = 0;
                }
                //проделываем работу над сбросом минут
                if (minedgametime >= 60){
                        // Если minegametime больше или равен 60, тогда minegametime будет равен нулю
                        minedgametime = 0; //(?) - если мы запишем minegametime = 0 под if(timersecond >=60){
                                       //тогда счётчик будет думать, что если секунды больше или равны 60 ,то минуты
                                           //будут равны нулю, тоесть минуты будут постоянно 0
                }
        }
        //вывод на экран
        void OnGUI (){
                                //Screen.width не даёт расползаться GUI (Графический элемент) по всему экрану, на разных по размеру экранам
                GUI.Label(new Rect(Screen.width - 500,10,100,50), "SecondTime : " + timersecond);
                GUI.Label(new Rect(Screen.width - 500, 25, 100, 50), "MinutesTime : " + minedgametime);
        }
        }
 
Последний раз редактировалось ARTgames 20 фев 2015, 18:49, всего редактировалось 1 раз.
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение waruiyume 20 фев 2015, 04:15

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

public class TimerLesson : MonoBehaviour
{
    private float timeInSecondsP;
    private int minutsP;
    private int secondsP;

    internal void Update()
    {
        timeInSecondsP += Time.deltaTime;

        secondsP = (int)(timeInSecondsP % 60);
        minutsP = (int)(timeInSecondsP / 60);
    }

    internal void OnGUI()
    {
        GUILayout.Label(String.Format("{0:00}:{1:00}", minutsP, secondsP));
    }
}
 


Unity секунды спешат где то на двадцать секунд

Это как?
Аватара пользователя
waruiyume
Адепт
 
Сообщения: 6143
Зарегистрирован: 30 окт 2010, 05:03
Откуда: Ростов на Дону

Re: Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 04:26

Сделал тест Time.deltaTime на ноутбуке и одновременно на телефоне, зафиксировал ,то что на Unity 60 секунд, а на телефоне 20 - через секундомер естественно, причём ещё и вычел две три секунды, дабы что бы быть точным ,но всё равно погрешности есть)
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение DbIMok 20 фев 2015, 04:27

молодец, что захотел написать урок. жаль, что написал такой отстой. начинать надо с цели, которой хотим добиться. "таймер как в GTA" это ни о чем. таймер, отсчитывающий время с начала гонки, уже понятнее. то есть у нас есть некое время в виде 00:00:00.000 (миллисекунды опциональны) которое мы хотим выводить на экран, должны быть функции старта, отображения, останова и сброса этого времени. далее нашей задачей является написание такого скрипта, чтобы новичок, повесивший его на объект, увидел понятный интерфейс в инспекторе (никаких xs,ys,xs1,ys1), а запустив на выполнение и сам таймер на экране. всего этого нет. урок должен быть простым, снабжен построчными комментариями и не содержать ошибок. никаких "Unity секунды спешат где то на двадцать секунд" (это же полнейший бред).
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 04:31

Хоршо, возьму на заметку
Причина была почему этот урок оказался такой отстой, хотя я с этим не до конца согласен но согласен, ведь любая информация - это уже информация, которой в дальнейшем пригодиться
Код пытался сделать более лёгким и понятным,спасибо за указанные ошибки в работе - это приветствуется.
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение DbIMok 20 фев 2015, 05:00

легкий и понятный, имхо, это что-то типа
Синтаксис:
Используется csharp
using System;
using UnityEngine;

public class TimerSimple : MonoBehaviour {
        private DateTime timeBegin;
        private TimeSpan timeTimer;
        public string timeString;
        public Rect rectTimer = new Rect(10, 10, 100, 20);

        void Start() {
                timeBegin = DateTime.Now;
        }

        private void Update() {
                timeTimer = DateTime.Now - timeBegin;
                timeString = string.Format("{0:D2}:{1:D2}:{2:D2}", timeTimer.Hours, timeTimer.Minutes, timeTimer.Seconds);
        }

        void OnGUI() {
                GUI.Label(rectTimer, timeString);
        }
}

дальше можно усложнить bool'ами, чтобы из инспектора управлялось, добавить в гуй пару-тройку кнопок с ними связанными.
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 05:09

я бы с таймерами развивал бы тему, тем более несколько дополнительных скриптов уже есть ,и можно и дальше дополнять,глядишь neodrop ссылку на тему будет давать новичкам.
Синтаксис:
Используется csharp
P.S А вот это бы новичку понятно не было
timeString = string.Format("{0:D2}:{1:D2}:{2:D2}", timeTimer.Hours, timeTimer.Minutes, timeTimer.Seconds);
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение DbIMok 20 фев 2015, 05:19

timeString = timeTimer.ToString().Substring(0, 8);
правильный вопрос - половина ответа. учитесь формулировать вопросы понятно.
Новости > _Telegram чат @unity3d_ru (11.6k/4.8k online) > _Telegram канал @unity_news (4.6k подписчиков) > Телеграм тема > "Спасибо"
Аватара пользователя
DbIMok
Адепт
 
Сообщения: 6372
Зарегистрирован: 31 июл 2009, 14:05

Re: Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 05:43

Ну вот,совсем другое дело)
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение ilkalawson 20 фев 2015, 13:15

я бы с таймерами развивал бы тему

Великие велосипедисты, этот туда же
Скрытый текст:
Хотя нужно отдать должное Моряку за то что развил идею, т к это лучшее что я когда либо создавал - в том смысле что эта вещь настолько очевидна и практична что она используется буквально в КАЖДОМ моем проекте.
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity

Re: Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 15:34

Здесь есть маленькое отличие:
1.Всё что требует базовые навыки.
2.Статью будет легко найти в поисковике - сразу отпадает приличное количество вопросов.
3.Зачем замудренности с кодом, когда можно сделать легче, а эффект будет тот же самый.
4.Если посмотреть в интернете например в youtube, можно так же найти приличное кол-во велосипедов, с таким же на подобие кодом или с таким же на подобием кодом,только на другом языке программирования.
5.Статью писал в первый раз, код проверял,работает.
Вообще было бы хорошо если вы бы сюда кидали линки(ссылки) на похожие уроки, да бы исключить лишнее бегание по форуму,а не делать как обычно, для того что бы статья умерла, и вся информация сгинула в лету :-?
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение ilkalawson 20 фев 2015, 15:45

Если посмотреть в интернете например в youtube, можно так же найти приличное кол-во велосипедов, с таким же на подобие кодом или с таким же на подобием кодом,только на другом языке программирования.

То есть вы ЗА такое развитие сообщества - не качественное, а колличественное!?
Ну и ладно.
ilkalawson
UNIверсал
 
Сообщения: 412
Зарегистрирован: 19 янв 2015, 20:38
Skype: lawsonunity

Re: Как сделать свой таймер?

Сообщение ARTgames 20 фев 2015, 15:54

Я конечно за качественное развитие, но всё таки хотелось бы что бы в этой статье были и другие источники, что бы упростить пользователю жизнь, и не заставлять бегать его по всему форуму, а просто собрать информацию с работой таймеров в одной статье
А вы знаете что я знаю?
Аватара пользователя
ARTgames
UNIт
 
Сообщения: 89
Зарегистрирован: 17 сен 2010, 17:39
Откуда: Тимашевск
Skype: ARTgames3

Re: Как сделать свой таймер?

Сообщение Potmbottom 19 июл 2016, 11:32

Синтаксис:
Используется csharp
[System.Serializable]
    public class GameTime {
        public int Minute {
            get { return _minute; }
        }

        public int Second {
            get { return _second; }
        }

        public int Millisecond {
            get { return _millisecond; }
        }

        public float CompareValue {
            get { return _compareValue; }
        }

        private int _minute;
        private int _second;
        private int _millisecond;
        private float _time;
        private float _compareValue;
        private StringBuilder _formattedMinute = new StringBuilder();
        private StringBuilder _formattedSecond = new StringBuilder();
        private StringBuilder _formattedMillisecond = new StringBuilder();

        public static GameTime Compare(GameTime a, GameTime b) {
            return a.CompareValue < b.CompareValue ? a : b;
        }

        public void AddTime(float deltaTime) {
            _compareValue += deltaTime;
            _time += deltaTime;
            if(_time >= 0.01f) {
                while(_time >= 0.01f) {
                    _time -= 0.01f;
                    _millisecond++;
                }
            }
            if(_millisecond >= 100) {
                _millisecond = 0;
                _second++;
            }
            if(_second < 60) return;
            _second = 0;
            _minute++;
        }

        public string FormattedTime() {
            return String.Format("{0}:{1}:{2}",
                ZeroAdder(ref _formattedMinute,Minute),
                ZeroAdder(ref _formattedSecond, Second),
                ZeroAdder(ref _formattedMillisecond, Millisecond));
        }

        private StringBuilder ZeroAdder(ref StringBuilder builder, int value) {
            builder.Remove(0, builder.Length);
            return (value >= 10) ? builder.Append(value) : builder.Append("0" + value);
        }
    }

Использовать вот так.
Синтаксис:
Используется csharp
var GameTime = new GameTime();
GameTime.AddTime(Time.deltaTime);
 

Умеет :
1. Возвращать отдельно минуты\секунды\миллисекунды
2. Выводить форматированное время типа (00:00:00)
Potmbottom
UNец
 
Сообщения: 1
Зарегистрирован: 19 июл 2016, 11:23


Вернуться в Уроки

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

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