игрок не переключается на другую позицию в массиве позиций

задача: запоминать клики по экрану, чтобы объект последовательно проходил все прокликанные позиции. Я создал массив векторов, сдвигаю таргет после каждой итерации, если быстро прокликать , то все нормально,он проходит все позиции, но если он сначала дойдет до первой позиции, то дальше не идет.

public class Player : MonoBehaviour {
private Vector3 _targetPosition;
private bool _isMove;
[SerializeField] private float _speed;
private List<Vector3> _listOfTouches;
private int _target = 0,_index;

private void Start()
{
    _listOfTouches = new List<Vector3>();
    _isMove = false;
}

private void Update()
{
    if (Input.GetMouseButtonDown(0))
    {
        Vector3 touchPosition =Camera.main.ScreenToWorldPoint(Input.mousePosition);
        touchPosition.z = 0;
        if (_listOfTouches.Count < 10)
        {
            _listOfTouches.Add(touchPosition);
            Debug.Log("Добавил новую позицию: "+touchPosition);
        }
        if (transform.position == _listOfTouches[_listOfTouches.Count-1])
        {
            Debug.Log("Очищаю лист, длина листа= "+_listOfTouches.Count);
            _listOfTouches.Clear();
        }
        _isMove = true;
    }
    if (_isMove)
        Move();
}

private void Move()
{
    transform.position = Vector3.MoveTowards(transform.position, _targetPosition, Time.deltaTime * _speed);

    if (transform.position == _targetPosition)
    {
        if(_index< _listOfTouches.Count)
        {
            Debug.Log("index++ " + _index+ "_listOfTouches.Count= "+ _listOfTouches.Count);
            _index++;
            _targetPosition = _listOfTouches[_index];
        }
        else if (_index >= _listOfTouches.Count)
        {
            _isMove = false;
            _listOfTouches.Clear();
        }
    }
}

}


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

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

Я попробовал запустить Ваш код, но там черт ногу сломит, и ошибки падают с индексам:) Накидал тут на скорую, надеюсь пригодится:

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

public class Player : MonoBehaviour
{
    [SerializeField] private float _speed;

    private MoveSequence _sequence;

    private void Awake()
    {
        _sequence = new MoveSequence(_speed, this);
    }

    private void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            Vector3 touchPosition = Camera.main.ScreenToWorldPoint(Input.mousePosition);

            touchPosition.z = 0;

            _sequence.Add(touchPosition);
        }
    }
}

public class MoveSequence
{
    private Queue<Vector3> _positions = new Queue<Vector3>();

    private float _speed;
    private MonoBehaviour _target;
    private bool _isMoving;

    public MoveSequence(float speed, MonoBehaviour target)
    {
        _speed = speed;
        _target = target;
    }

    public void Add(Vector3 position)
    {
        _positions.Enqueue(position);

        if (_isMoving == false)
        {
            StartMoving();
        }
    }

    private void StartMoving()
    {
        _isMoving = true;

        _target.StartCoroutine(GetMoving());
    }

    private IEnumerator GetMoving()
    {
        while (_positions.Count > 0)
        {
            var targetPosition = _positions.Dequeue();
            var transform = _target.transform;

            while (transform.position != targetPosition)
            {
                transform.position = Vector3.MoveTowards(
                    transform.position,
                    targetPosition,
                    Time.deltaTime * _speed);

                yield return null;
            }

            transform.position = targetPosition;
        }

        _isMoving = false;
    }
}
→ Ссылка