Как сделать задержку в c unity
Перейти к содержимому

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

  • автор:

Юнити как сделать задержку?

Столкнулся с проблемой. Звук не успевает проигрываться перед удалением объектов. Как можно сделать задержку чтобы не поломать основную роботу кода? Этот код прикреплен к префабу, который появляется во время игры. И если они сталкиваются то из двух объектов должен появится один новый. метод с проигрыванием звука я сделаю сам.

using System.Collections; using System.Collections.Generic; using UnityEngine; public class colTag : MonoBehaviour < private bool hasExecuted = false; public GameObject Olivca; public void MarkAsExecuted() < hasExecuted = true; >public void OnCollisionEnter2D(Collision2D collision) < if (!hasExecuted && collision.gameObject.CompareTag("Goroshec")) < //метод играть звук //задержка collision.gameObject.GetComponent().MarkAsExecuted(); Vector2 eggPosition1 = collision.gameObject.transform.position; Vector2 eggPosition2 = transform.position; Destroy(collision.gameObject); Destroy(gameObject); Vector2 centerPosition = (eggPosition1 + eggPosition2) / 2; Instantiate(Olivca, centerPosition, Quaternion.identity); > > > 

Отслеживать
задан 12 ноя 2023 в 14:59
11 2 2 бронзовых знака
У Destroy есть 2-ой атрибут с задержкой.
10 янв в 17:46
@Алексей не атрибут, а аргумент.
10 янв в 20:01

1 ответ 1

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

Я надеюсь это будет работать

using System.Collections; using System.Collections.Generic; using UnityEngine; public class colTag : MonoBehaviour < private bool hasExecuted = false; public GameObject Olivca; IEnumerator PlaySoundAndWait() < //метод играть звук yield return new WaitForSeconds(/*время задержки в секундах*/); collision.gameObject.GetComponent().MarkAsExecuted(); Vector2 eggPosition1 = collision.gameObject.transform.position; Vector2 eggPosition2 = transform.position; Destroy(collision.gameObject); Destroy(gameObject); Vector2 centerPosition = (eggPosition1 + eggPosition2) / 2; Instantiate(Olivca, centerPosition, Quaternion.identity); > public void MarkAsExecuted() < hasExecuted = true; >public void OnCollisionEnter2D(Collision2D collision) < if (!hasExecuted && collision.gameObject.CompareTag("Goroshec")) < StartCoroutine(PlaySoundAndWait()); >> > 

Отслеживать
ответ дан 12 ноя 2023 в 20:56

Работает, но неправильно. Задержка срабатывает, но создается две оливки от каждого объекта, на котором прикреплен этот код. А нужна одна оливка с двух объектов.

12 ноя 2023 в 21:41
Ну сорян, я не могу помочь. Можеж на английском погуглить как это сделать.
13 ноя 2023 в 15:22

@Hlib очевидно, что строчку кода MarkAsExecuted нужно перенести выше, до начала ожидания yield . Это же просто должно было быть. Ну и почитайте что-нибудь про корутины в Unity.

Как сделать задержку выполнения кода в 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 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 >

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

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

using System.Collections ;
using System.Collections.Generic ;
using UnityEngine ;

public class VVC3 : MonoBehaviour
{
float _TimerSleep = 0 ; // таймер задержки 1
float _TimerSleep2 = 0 ; // таймер задержки 2
bool _bTrue = true ; // проверка на одно срабатывание

// Start is called before the first frame update
void Start ( )
{

// Update is called once per frame
void Update ( )
{

if ( Input. GetKey ( KeyCode. A ) ) // зажатие на клавишу А»Eng»
{
_TimerSleep += Time. deltaTime ; // добовляем мс к _TimerSleep

Debug. Log ( _TimerSleep ) ; //Дебажим как время добовляется
}
else
{
_TimerSleep = 0 ; //начальное значение при отжатие клавишу
}

if ( _TimerSleep >= 1 )
{
Debug. Log ( «1sec» ) ; // Проверяем что таймер сработал

TimersSleep ( ) ; // запуск функции через секунду
}

if ( _bTrue == true )
{
_TimerSleep2 += Time. deltaTime ;
}

if ( _TimerSleep2 >= 3 )
{

Debug. Log ( «Запуск TimersSleep()» ) ;

_bTrue = false ;
_TimerSleep2 = 0 ;

TimersSleep ( ) ; // запуск функции через три секунды

void TimersSleep ( )
{
int tt1 = 1 ;
int tt2 = 1 ;

Debug. Log ( «Результат: » + tt1 ) ; // Результат

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

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