Змейка в unity как сделать движение через секунду

я делаю змейку в UNITY как мне сделать движение с ожиданием в 1 секунды движение на 0.5f подождать 1 секунду движение на 0.5f подождать 1 секунду движение на 0.5f подождать 1 секунду движение на 0.5f и т.д.


Ответы (3 шт):

Автор решения: ssa112112

Есть множество способов реализовать таймер в 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);
    }
}
→ Ссылка
Автор решения: Sergey Semkin

Не могу оставить комментарий(((

Была подобная проблема, я думаю, тебе поможет создание потока, для змейки. Ты усыпляешь поток на секунду, после чего она опять выполняет действие и засыпает на секунду. Не смотри Гошу Дударя по этому вопросу ещё больше запутаешься.

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 и субтитры, а статьи на английском мне переводит яндекс.браузер

→ Ссылка
Автор решения: Any 3Develop

Написал простенький код под ваше описание. Чтобы изменить вектор перемещения, нужно в методе 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;
    }
}
→ Ссылка