Перейти к содержимому

Как сделать задержку в unity

  • автор:

Unity C# задержка

Всем привет,
Сейчас я изучаю скриптование под юнити на C#, сам язык я плохо знаю, так что пожалуйста не надо грузить меня терминами.
Так вот, вопрос в том, как сделать так, чтобы во время перезарядки нельзя было стрелять.

Я где-то нашёл вот такую тему:
System.Threading.Thread.Sleep(2000);
, но из за неё виснет и вся игра.

#1
16:52, 27 мар 2014

Kano_Tanaka
То есть стрельба уже сделана?

Когда начинаешь перезарядку, ставишь флажок. Если флажок поставлен, стрелять нельзя. Когда перезарядка закончена, снимаешь флажок.

  • Kano_Tanaka
  • Пользователь

#2
17:36, 27 мар 2014

Да нет, вопрос в том, как задать эту паузу и задать её продолжительность на C#

#3
18:19, 27 мар 2014

Kano_Tanaka
Когда начинаешь перезарядку, запоминаешь текущее время. Когда время на перезарядку кончилось, снимаешь флажок.

#4
18:22, 27 мар 2014

Как же ты сделал стрельбу если не можешь сделать такую простую вещь?

#5
19:06, 27 мар 2014

  • Kano_Tanaka
  • Пользователь

#6
20:11, 27 мар 2014

-Eugene-
что за флажок?

Edisoni
yutube

stantler
Вставил этот код — выдало 4 шибки: «Ожидалось определение типа или пространства имён, либо признак конца файла»

#7
20:24, 27 мар 2014

Kano_Tanaka
> что за флажок?
Булева переменная

  • Kano_Tanaka
  • Пользователь

#8
21:33, 27 мар 2014

-Eugene-
О, слушай, а можно сделать так, чтобы программа продолжила своё выполнение только по окончании звуковой дорожки перезарядки?
И если можно, то как.

  • Dan Diamond
  • Постоялец

#9
22:16, 27 мар 2014

Kano_Tanaka
// так делать неправильно 🙂
Yield return new WaitForSeconds (GetComponent ().clip.length);

#10
22:31, 27 мар 2014

Kano_Tanaka
Программу вообще никак тормозить не надо. Точно так же как не надо тормозить программу в паузах между выстрелами

  • Kano_Tanaka
  • Пользователь

#11
0:20, 28 мар 2014

-Eugene-
А что ты тогда предлагаешь?

#12
1:15, 28 мар 2014

Kano_Tanaka
> О, слушай, а можно сделать так, чтобы программа продолжила своё выполнение
> только по окончании звуковой дорожки перезарядки?
Типа и весь мир подождёт, все враги и всё движение замрёт, пока герой перезаряжает? Бред же. Ты это уже и попытался сделать в нулевом сообщении: System.Threading.Thread.Sleep(2000); Это и есть стоп программы на 2 секунды.

Kano_Tanaka
> А что ты тогда предлагаешь?
Тебе уже рассказали.

Заводишь в скрипте, который отвечает за стрельбу, переменную типа bool, например: bool bShooting; Это и будет наш флаг, разрешающий / запрещающий стрельбу.

И прежде чем разрешить стрелять, проверяешь в коде этот флаг:

if( bShooting )
<
Shoot(); //стреляем
>

Когда патроны кончились или идёт перезарядка ставишь bShooting = false;
закончилась перезарядка, ставишь bShooting = true;
Перезарядка либо длиться какое-то время, либо пока проигрывается звук перезарядки (или анимация) — что угодно. Проверяешь, когда звук проиграется, ставишь флаг в нужное положение.

Kano_Tanaka
> C#, сам язык я плохо знаю
Так учи язык и программирование в целом, раз уж собрался скрипты писать для игр. И такие вопросы сами отпадут.

  • Kano_Tanaka
  • Пользователь

#13
3:00, 28 мар 2014

TirexiK
> закончилась перезарядка, ставишь bShooting = true;
> Перезарядка либо длиться какое-то время, либо пока проигрывается звук
> перезарядки (или анимация) — что угодно. Проверяешь, когда звук проиграется,
> ставишь флаг в нужное положение.

Так в этом вопрос с самого начала и состоял: как указать программе промежуток времени, в который идёт перезарядка, и как проверить, что перезарядка(то бишь звук перезарядки) кончилась? А не в том, как ограничить стрельбу.

#14
10:25, 28 мар 2014

Kano_Tanaka
> как указать программе промежуток времени, в который идёт перезарядка, и как
> проверить, что перезарядка(то бишь звук перезарядки) кончилась?

float reloadTimer = 3000f; //твой промежуток времени void Update() < reloadTimer -= Time.deltaTime; if ( reloadTimer >

Программирование немножко отличается от написания реферата. С увеличением сложности программы копипаст дает все меньше и меньше результата. Так что учи язык и практикуйся, не отмазывайся «плохо знаю, не надо грузить»

Как сделать задержку выполнения кода в Unity C#?

freeExec

не рекомендую делать WaitForSeconds в Update потому что по сути такой код будет начинать каждый тик (Update вызывается 60 вроде бы раз в секунду) новый интервал задержки, и сам Update может встать (или чтото еще в таком духе, надо тестить, вообщем баг явный)

на самом деле такой код может рабоатть, но только для быстрых корутин, не для ожидания 5 сек

IEnumerator Update()

аналогично из Start можно запускать корутину с ожиданием

IEnumerator Start()

лучше запустить корутину из Start() — пример же в доке есть

void Start() < //Start the coroutine we define below named ExampleCoroutine. StartCoroutine(ExampleCoroutine()); >IEnumerator ExampleCoroutine() < //Print the time of when the function is first called. Debug.Log("Started Coroutine at timestamp : " + Time.time); //yield on a new YieldInstruction that waits for 5 seconds. yield return new WaitForSeconds(5); //After we have waited 5 seconds print the time again. Debug.Log("Finished Coroutine at timestamp : " + Time.time); >

Задержка в Unity

Пыталась сделать чтобы объект пропадал на 0.1 секунду, а потом появлялся, но он только пропадает, обратно не появляется, unity 5.6.7f1.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class StarScript : MonoBehaviour < private int chanse; public SpriteRenderer star; void Update () < chanse = Random.Range (0, 100); if (chanse == 1) < star.color = new Color (star.color.r, star.color.g, star.color.b, 0); Invoke ("wait", 0.1f); star.color = new Color (star.color.r, star.color.g, star.color.b, 255); >void wait () <> > 

Отслеживать
user302909
задан 7 мар 2020 в 5:42
15 1 1 серебряный знак 5 5 бронзовых знаков

2 ответа 2

Сортировка: Сброс на вариант по умолчанию

Вы меняете цвет, запускается что-то там куда-то там, что выполнится через секунду, а не остановит текущий код на 1 секунду. Для таких вещей нужно свою корутину писать:

using System.Collections; using System.Collections.Generic; using UnityEngine; public class StarScript : MonoBehaviour < public SpriteRenderer star; private IEnumerator blinkCoroutine; void Update () < if (Random.Range (0, 100) == 1 && blinkCoroutine == null) < blinkCoroutine = Blink(0.1f); StartCoroutine(blinkCoroutine); >> private IEnumerator Blink(float waitTime) < star.color = new Color (star.color.r, star.color.g, star.color.b, 0); yield return new WaitForSeconds(waitTime); star.color = new Color (star.color.r, star.color.g, star.color.b, 255); blinkCoroutine = null; >> 

Отслеживать
ответ дан 7 мар 2020 в 7:54
user302909 user302909

Можно сделать проще.

 //Твой объект который будет выключаться и включаться public GameObject game; private void Start() < //1. Укажи метод который будет вызываться. //2. Укажи изначальную вызова метода, сейчас поставлен 0.5f это стартовая время. //3. Укажи время сколько будет повторяться метод, сейчас поставлен 5. InvokeRepeating("ActiveObject", 0.5f,5); >void ActiveObject() < //Объект выключается и включается. game.SetActive(!game.activeSelf); >
 public SpriteRenderer star; //Делаем галку для плавного появление звезды. public bool act; //добавляем управление над альфом, по умолчанию стоит 1. public float Alpha = 1; //добавляем скорость появление. public float speed =1; private void Start() < //1. Укажи метод который будет вызываться. //2. Укажи изначальную вызова метода, сейчас поставлен 0.5f это стартовая время. //3. Укажи время сколько будет повторяться метод, сейчас поставлен 5. InvokeRepeating("ActiveObject", 0.5f,5); >private void Update() < //Вводим ограничение для альфы что бы он не ушёл за пределами 1. Alpha = Mathf.Clamp(Alpha,0,1); //Привяжем альфу к звезде. star.color = new Color(star.color.r,star.color.g,star.color.b,Alpha); if (act) < //Скорость добавление. Alpha += Time.deltaTime * speed; >else < //Скорость убавление. Alpha -= Time.deltaTime * speed; >> void ActiveObject() < //Включаем галку и выключаем. act = !act; >

Task. Delay Метод

Некоторые сведения относятся к предварительной версии продукта, в которую до выпуска могут быть внесены существенные изменения. Майкрософт не предоставляет никаких гарантий, явных или подразумеваемых, относительно приведенных здесь сведений.

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

Перегрузки

Создает отменяемую задачу, которая завершается через заданное время.

Создает отменяемую задачу, которая завершается через заданное время.

Создает задачу, которая завершается через заданное время.

Создает задачу, которая завершается через заданное время.

Создает задачу, которая завершается через заданное количество миллисекунд.

Создает отменяемую задачу, которая завершается через заданное количество миллисекунд.

Delay(TimeSpan, TimeProvider, CancellationToken)

Создает отменяемую задачу, которая завершается через заданное время.

public: static System::Threading::Tasks::Task ^ Delay(TimeSpan delay, TimeProvider ^ timeProvider, System::Threading::CancellationToken cancellationToken);
public static System.Threading.Tasks.Task Delay (TimeSpan delay, TimeProvider timeProvider, System.Threading.CancellationToken cancellationToken);
static member Delay : TimeSpan * TimeProvider * System.Threading.CancellationToken -> System.Threading.Tasks.Task
Public Shared Function Delay (delay As TimeSpan, timeProvider As TimeProvider, cancellationToken As CancellationToken) As Task
Параметры

Объект TimeSpan для ожидания перед выполнением возвращаемой задачи или InfiniteTimeSpan для неограниченного ожидания.

timeProvider TimeProvider

Объект TimeProvider , с помощью которого интерпретируется delay .

cancellationToken CancellationToken

Токен отмены, который нужно контролировать во время ожидания выполнения задачи.

Возвращаемое значение

Задача, представляющая временную задержку.

Исключения

delay представляет отрицательный интервал времени, отличный от InfiniteTimeSpan.

delay TotalMilliseconds свойство больше 4294967294.

Аргумент timeProvider имеет значение null .

Маркер отмены был отменен. Это исключение сохраняется в возвращаемой задаче.

Применяется к

Delay(TimeSpan, CancellationToken)

Создает отменяемую задачу, которая завершается через заданное время.

public: static System::Threading::Tasks::Task ^ Delay(TimeSpan delay, System::Threading::CancellationToken cancellationToken);
public static System.Threading.Tasks.Task Delay (TimeSpan delay, System.Threading.CancellationToken cancellationToken);
static member Delay : TimeSpan * System.Threading.CancellationToken -> System.Threading.Tasks.Task
Public Shared Function Delay (delay As TimeSpan, cancellationToken As CancellationToken) As Task
Параметры

Время, в течение которого ожидается завершение возвращаемой задачи, или Timeout.InfiniteTimeSpan для неограниченного времени ожидания.

cancellationToken CancellationToken

Токен отмены, который нужно контролировать во время ожидания выполнения задачи.

Возвращаемое значение

Задача, представляющая временную задержку.

Исключения

delay представляет отрицательный интервал времени, отличный от Timeout.InfiniteTimeSpan .

Свойство delay аргумента TotalMilliseconds больше 4294967294 в .NET 6 и более поздних версий или Int32.MaxValue во всех предыдущих версиях.

Задача была отменена.

Предоставленный объект cancellationToken уже удален.

Примеры

В следующем примере запускается задача, которая включает вызов Delay(TimeSpan, CancellationToken) метода с задержкой в 1,5 секунды. До истечения интервала задержки маркер отменяется. В выходных данных примера показано, что в результате TaskCanceledException возникает исключение , а свойству задач Status присваивается значение Canceled.

using System; using System.Threading; using System.Threading.Tasks; public class Example < public static void Main() < CancellationTokenSource source = new CancellationTokenSource(); var t = Task.Run(async delegate < await Task.Delay(TimeSpan.FromSeconds(1.5), source.Token); return 42; >); source.Cancel(); try < t.Wait(); >catch (AggregateException ae) < foreach (var e in ae.InnerExceptions) Console.WriteLine(": ", e.GetType().Name, e.Message); > Console.Write("Task t Status: ", t.Status); if (t.Status == TaskStatus.RanToCompletion) Console.Write(", Result: ", t.Result); source.Dispose(); > > // The example displays output like the following: // TaskCanceledException: A task was canceled. // Task t Status: Canceled 
open System open System.Threading open System.Threading.Tasks let source = new CancellationTokenSource() let t = Task.Run(fun () -> task < do! Task.Delay(TimeSpan.FromSeconds(1.5), source.Token) return 42 >) source.Cancel() try t.Wait() with :? AggregateException as ae -> for e in ae.InnerExceptions do printfn $": " printf $"Task t Status: " if t.Status = TaskStatus.RanToCompletion then printf $", Result: " source.Dispose() // The example displays output like the following: // TaskCanceledException: A task was canceled. // Task t Status: Canceled 
Imports System.Threading Imports System.Threading.Tasks Module Example Public Sub Main() Dim source As New CancellationTokenSource() Dim t = Task.Run(Async Function() Await Task.Delay(TimeSpan.FromSeconds(1.5), source.Token) Return 42 End Function) source.Cancel() Try t.Wait() Catch ae As AggregateException For Each e In ae.InnerExceptions Console.WriteLine(": ", e.GetType().Name, e.Message) Next End Try Console.Write("Task t Status: ", t.Status) If t.Status = TaskStatus.RanToCompletion Then Console.Write(", Result: ", t.Result) End If source.Dispose() End Sub End Module ' The example displays output like the following: ' TaskCanceledException: A task was canceled. ' Task t Status: Canceled 

Обратите внимание, что этот пример включает потенциальное условие гонки: оно зависит от задачи, которая асинхронно выполняет задержку при отмене маркера. Хотя задержка в 1,5 секунды от вызова Delay(TimeSpan, CancellationToken) метода делает это предположение вероятным, тем не менее, возможно, что вызов Delay(TimeSpan, CancellationToken) метода может вернуться до отмены маркера. В этом случае в примере выводятся следующие выходные данные:

Task t Status: RanToCompletion, Result: 42 

Комментарии

Если маркер отмены подается до указанной задержки времени, возникает TaskCanceledException исключение, и задача завершается в Canceled состоянии . В противном случае задача завершается в RanToCompletion состоянии по истечении указанной задержки времени.

Сценарии использования и дополнительные примеры см. в документации по перегрузке Delay(Int32) .

Этот метод зависит от системных часов. Это означает, что задержка времени будет примерно равна разрешению системных часов, если delay аргумент меньше разрешения системных часов, что составляет примерно 15 миллисекундах в системах Windows.

Системные часы, которые используются, являются теми же, что и GetTickCount, на которые не влияют изменения, внесенные в timeBeginPeriod и timeEndPeriod.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *