Интервал нажатия на кнопку
Я новичёк в unity и C#.Что добавить в скрипт что бы игрок мог нажимать на кнопку только один раз в секунду?
using UnityEngine;
using UnityEngine.UI;
using UnityEngine.SceneManagement;
public class ButtonScript : MonoBehaviour
{
public Sprite[] S;
private int pos;
public SpriteRenderer SR;
public Text textComponent;
private string[] messages = {"Привет", "Как дела?"};
private int currentIndex = 0;
void Start()
{
// Получаем ссылку на компонент Text
textComponent = GameObject.Find("Text").GetComponent<Text>();
}
public void ChangeText()
{
// Меняем текст на следующее сообщение из массива
textComponent.text = messages[currentIndex];
currentIndex = (currentIndex + 1) % messages.Length;
// Если все сообщения были показаны, меняем сцену
if (currentIndex == 0)
{
SceneManager.LoadScene("NewScene"); // Замените "NewScene" на название новой сцены
}
}
public void Click()
{
pos++;
}
private void Update()
{
if (pos >= S.Length)
pos = 0;
else
SR.sprite = S[pos];
}
}
(некоторые части этого скрипта мне писала нейросеть)
Ответы (2 шт):
using System.Threading; // В самом начале
bool canClick = true;
public void Click()
{
if (canClick)
{
pos++;
Thread thread = new Thread(ClickDelay);
thread.Start();
}
}
private void ClickDelay()
{
canClick = false;
Thread.Sleep(1000) // Время "спячки" в миллисекундах (1000 мс = 1 с)
canClick = true;
}
Можно не использовать многопоточность, асинхронность и прочее в таком и похожем роде, как в других ответах. Может быть достаточно просто добавить дополнительную переменную в код кнопки, чтобы сохранить задержку. Например, сохранить время последнего нажатия кнопки:
private float nextClick = 0.0f;
private float pressCooldown = 1.0f;
void Click()
{
if (Time.time > nextClick)
{
nextClick = Time.time + pressCooldown;
// Любой ваш код при срабатывании нажатия на кнопку
}
}
Минусы: максимальное значение - это приблизительно 340282346638528859811704183484516925440, что примерно:
340282346638528859811704183484516925440 секунд
или 3938453086094084025598428049589316 суток
или 10790282427655024727666926163258 лет
или 65395651076697119561617734322 оборотов Нептуна вокруг Солнца
или 44959510115229269698612 оборотов Солнца вокруг центра галактики
или 10790282427655024727666 оборотов млечного пути вокруг своей оси.
В принципе, если вам такое подходит, то можете использовать данный метод.
Другой вариант: хранить время, оставшееся до разблокировки кнопки и, желательно. Например так:
private float delay = 0.0f;
private float pressCooldown = 0.0f;
private void Update()
{
if (delay >= 0)
delay -= Time.deltaTime;
}
public void Click()
{
if (delay < 0)
{
delay = pressCooldown;
//Ваш код
}
}
Минусы: хуже работает на очень слабых устройствах из-за необходимости постоянно уменьшать значение delay