Змейка в unity как сделать движение через секунду
я делаю змейку в UNITY как мне сделать движение с ожиданием в 1 секунды движение на 0.5f подождать 1 секунду движение на 0.5f подождать 1 секунду движение на 0.5f подождать 1 секунду движение на 0.5f и т.д.
Ответы (3 шт):
Есть множество способов реализовать таймер в Unity. Например:
using UnityEngine;
public class Timer : MonoBehaviour
{
private const float TIMER_MAX_TIME = 1f; //время таймера
private float timerCurrentTime = TIMER_MAX_TIME; //внутренняя переменная
void Update()
{
if (timerCurrentTime > 0)
{
timerCurrentTime -= Time.deltaTime; //уменьшаем внутреннюю переменную
}
else
{
timerCurrentTime = TIMER_MAX_TIME; //рестарт таймера
Move(); //двигаемся или выполняем другую активность
}
}
private void Move()
{
//todo: добавить switch / if для определения направления движения
transform.Translate(0.5f,0,0);
}
}
Не могу оставить комментарий(((
Была подобная проблема, я думаю, тебе поможет создание потока, для змейки. Ты усыпляешь поток на секунду, после чего она опять выполняет действие и засыпает на секунду. Не смотри Гошу Дударя по этому вопросу ещё больше запутаешься.
upd:
Здесь англоязычные ребята разбирают подобный вопрос https://stackoverflow.com/questions/30056471/how-to-make-the-script-wait-sleep-in-a-simple-way-in-unity
Это документация юнити https://docs.unity3d.com/ScriptReference/Rigidbody.Sleep.html
Тут парень рассказывает в видео https://www.youtube.com/watch?v=7wG1VSFAe7w
Статейка с хабр https://habr.com/ru/post/147315/
Вообще стоит почитать про потоки, лишним не будет В видео с английским я ставлю скорость >0,75 и субтитры, а статьи на английском мне переводит яндекс.браузер
Написал простенький код под ваше описание. Чтобы изменить вектор перемещения, нужно в методе GetNextPoint поменять направление - transform.forward допустим на transform.right
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class SnakeMover : MonoBehaviour
{
[SerializeField] private float _speed = 2f; // скорость перемещения
[SerializeField] private bool _canMove = false; // флаг перемещения
private const float _maximumDelta = 0.5f; // максимальная дистанция перемещения
private const float _waitBeforeMove = 1f; // время задержки таймера
private float _timerNextMove = 0f; // таймер
private Coroutine _moveProcess; // процесс движения
private void Update()
{
if (Input.GetKeyDown(KeyCode.W)) // по нажатию W клавиши разрешаем или запрещаем перемещение
{
_canMove = !_canMove; // пинг-понг
if(!_canMove && _moveProcess != null) // если перемещение запрещено и процесс перемещения работает то, нужно прервать процесс.
{
StopCoroutine(_moveProcess);
_moveProcess = null;
}
}
if (_canMove && _moveProcess == null) // если движение разрешено и процесс движения не запущен
{
if (_timerNextMove <= Time.time) // если таймер готов, то можно начать процесс движения
{
_moveProcess = StartCoroutine(Move()); // запуск процесса перемещения
}
}
}
private Vector3 GetNextPoint(float distance) // Создаем точку
{
return transform.localPosition + (transform.forward * distance);
}
private IEnumerator Move()
{
var pointToMove = GetNextPoint(_maximumDelta); // получаем точку для движение
while (transform.localPosition != pointToMove) // ждем пока достигнем цели
{
transform.localPosition = Vector3.MoveTowards(transform.position, pointToMove, _speed * Time.deltaTime);
yield return null;
}
_moveProcess = null;
_timerNextMove = Time.time + _waitBeforeMove;
}
}