Перемещение игрового объекта между двумя позициями в волне sin

#c# #unity3d #transform #trigonometry

#c# #unity3d #преобразование #тригонометрия

Вопрос:

У меня есть две позиции в сцене Unity, и я хочу, чтобы игровой объект sphere перемещался между ними. Это достаточно легко сделать с помощью команды move towards , но я хочу, чтобы мяч ускорялся при выходе из одной, а затем замедлялся при приближении к следующей в контролируемой кривой. Мне нужно, чтобы он перемещался между двумя позициями в поместье, аналогично тому, как катится мяч.

Мне сказали, что я мог бы сделать это с помощью волны греха, однако я не уверен, как это сделать. Есть ли простой способ сделать это?

Комментарии:

1. Если физика для вас тоже не важна, вы можете использовать iTween.

Ответ №1:

Преамбула

Существует несколько способов решить вашу проблему, не только с помощью функции sine.

Пример синусоидальной функции

Вот пример:

 public float frequency = 1.0f; // in Hz
public Vector3 positionA;
public Vector3 positionB;
private float elapsedTime = 0.0f;

public void Update()
{
    elapsedTime  = Time.deltaTime;
    float cosineValue = Mathf.Cos(2.0f * Mathf.PI * frequency * elapsedTime);
    transform.position = positionA   (positionB - positionA) * 0.5f * (1 - cosineValue);
}
  

Косинус используется здесь вместо синуса просто для удобства.

Ответ №2:

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

Вот демонстрационное видео, исходный код на Github.

Сценарий сам по себе очень прост. Все, что нам нужно сделать, это вычислить два вектора — вектор главного направления и ортогональный вектор. После этого нам нужно подчинить ортогональный вектор синусоидальной функции, а затем выполнить сложение этих двух векторов, чтобы сумма перемещала объект по точной синусоидальной кривой.

 void FixedUpdate () {
    float t = Time.time - startTime;
    rb.velocity = direction * speed   orthogonal * amplitude * Mathf.Sin (frequency * t);
}
  

Вы можете найти более подробную информацию здесь — как настроить сцену, компоненты и т.д.