Как сделать так, чтобы расчёты производились с использованием текущего положения dot, а не начального?

Этот код, должен каждую итерацию выбирать одну случайную точку из трёх, и сдвигать четвёртую точку в направлении выбранной точки на половину расстояния до неё, ждать seconds и оставлять "метку". Код не вызывает ошибок но работает не правильно, такое чувство что dot(четвёртая точка), передвигается не от положения в которое она перешла во время предыдущей итерации, а от изначального положения. Проблема: dot сдвигается от своей изначальной координаты, а не от координаты полученной в предыдущей итерации.

public Transform dot;
public Transform[] points = new Transform[3];
public float seconds = 1;
public float size;
void Start()
{
    StartCoroutine(Coroutine());
}

IEnumerator Coroutine()
{
    for(int t = 0; t<=10000; t++)
    { 
        int point = Random.Range(0,3);
        switch(point)
        {
            case 0:
                dot.position = new Vector2((dot.position.x - (dot.position.x - points[0].position.x))/2,(dot.position.y - (dot.position.y - points[0].position.y))/2);
                Debug.DrawLine(new Vector3(dot.position.x,dot.position.y, 1), new Vector3(dot.position.x + 0.1f, dot.position.y, 0), Color.blue,1000,false);
                yield return new WaitForSeconds(seconds);
                break;
            case 1:
                dot.position = new Vector2((dot.position.x - (dot.position.x - points[1].position.x))/2,(dot.position.y - (dot.position.y - points[1].position.y))/2);
                Debug.DrawLine(new Vector3(dot.position.x,dot.position.y, 1), new Vector3(dot.position.x + 0.1f, dot.position.y, 0), Color.blue,1000,false);
                yield return new WaitForSeconds(seconds);
                break;
            case 2:
                dot.position = new Vector2((dot.position.x - (dot.position.x - points[2].position.x))/2,(dot.position.y - (dot.position.y - points[2].position.y))/2);
                Debug.DrawLine(new Vector3(dot.position.x,dot.position.y, 1), new Vector3(dot.position.x + 0.1f, dot.position.y, 0), Color.blue,1000,false);
                yield return new WaitForSeconds(seconds);   
                break;
        }                
    }   
}

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

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

Возможно у тебя проблема была в том, что ты dot присваивал смещение, а не прибавлял его к позиции этого dot, но это не точно, потому что искать в твоей строчке длиною в бесконечность ошибку у меня нет желания.

Зачем тебе этот свитч? Ради дубляжа кода? Если в points будет не 3 точки, а 300, ты для каждой будешь писать отдельный кейс? Почему просто не вынести перемещение точки в отдельный метод?

Зачем вычитать каждую координату отдельно? От вектора можно отнять вектор с тем же успехом.

Проще было все переписать, чем искать ошибку в твоем коде.

using UnityEngine;
using System.Collections;

public class HuiPoimiChto : MonoBehaviour
{
    [SerializeField] private Transform _dot = null;
    [SerializeField] private Transform[] _points = null;
    [SerializeField] private float _delay = 1;
    [SerializeField] private float _distanceMultiplier = 0.5f;
    [SerializeField] private float _markDuration = 10f;
    
    private void Start()
    {
        StartCoroutine(Coroutine());
    }

    private IEnumerator Coroutine()
    {
        while (true)
        {
            var index = Random.Range(0, _points.Length);
            var point = _points[index];
            MoveDotToPoint(point);

            Debug.DrawRay(_dot.position, Vector3.up, Color.blue, _markDuration);

            yield return new WaitForSeconds(_delay);
        }
    }

    private void MoveDotToPoint(Transform point)
    {
        var position = point.position - _dot.position;
        position *= _distanceMultiplier;
        _dot.position += position;
    }
}
→ Ссылка