игрок не переключается на другую позицию в массиве позиций
задача: запоминать клики по экрану, чтобы объект последовательно проходил все прокликанные позиции. Я создал массив векторов, сдвигаю таргет после каждой итерации, если быстро прокликать , то все нормально,он проходит все позиции, но если он сначала дойдет до первой позиции, то дальше не идет.
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;
}
}