Как сделать так, чтобы расчёты производились с использованием текущего положения 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 шт):
Возможно у тебя проблема была в том, что ты 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;
}
}