Если я правильно понимаю, вы просто хотите убедиться, что объект переворачивает определенное количество времени в воздухе во время полета. Вы можете использовать что-то вроде этого:
using UnityEngine;
using System.Collections;
public class RotaionManager : MonoBehaviour {
// Motion start point
public Transform origin;
// Motion end point
public Transform destination;
// Start and en anle - 360 for single full rotation
public float startAngle = 0;
public float endAngle = 360;
void Update() {
// Distance to origin
var dstOrigin = Vector3.Distance(origin.position, transform.position);
// Distance to destination
var dstDestination = Vector3.Distance(destination.position, transform.position);
// Parameter
float t = (dstDestination + dstOrigin == 0 ? 0 : (dstOrigin/(dstDestination + dstOrigin)));
// The angle at current t
float angle = Mathf.Lerp(startAngle, endAngle, t);
// Rotate the object by the angle, then make sure it also faces destination
transform.rotation = Quaternion.LookRotation(destination.position - origin.position) * Quaternion.Euler(angle, 0, 0);
}
}
Просто линейная интерполяция угла поворота, в зависимости от расстояния до начальной и конечной точкой. Вы можете контролировать, сколько раз объект вращается с помощью начального и конечного углов. Посмотрите на вращение, чтобы в дополнение к вращению вокруг собственной оси объект также столкнулся с общим направлением цели.
Посмотрите на образец проекта: https://www.dropbox.com/s/g00srsjlqjx1jcz/RotationProj.zip?dl=0
EDIT
Это может быть лучше использовать расстояние от объекта проекции на вектор исходного назначения вместо сырого расстояния, он выглядит лучше на крутых путях ,Функция обновления будет выглядеть следующим образом:
void Update() {
// Projection of object on line between origin and destination
var projection = Vector3.Project(transform.position - origin.position, origin.position - destination.position) + origin.position;
// Distance to origin
var dstOrigin = Vector3.Distance(origin.position, projection);
// Distance to destination
var dstDestination = Vector3.Distance(destination.position, projection);
// Parameter
float t = (dstDestination + dstOrigin == 0 ? 0 : (dstOrigin/(dstDestination + dstOrigin)));
// The angle at current t
float angle = Mathf.Lerp(startAngle, endAngle, t);
// Rotate the object by the angle, then make sure it also faces destination
transform.rotation = Quaternion.LookRotation(destination.position - origin.position) * Quaternion.Euler(angle, 0, 0);
}
Я также обновил пример проекта
EDIT
Другой способ сделать это, который может выглядеть лучше, может быть игнорировать Y координаты начальной и конечной точек, а также проекции. Это выглядит немного лучше в некоторых случаях. Код будет выглядеть следующим образом:
void Update() {
Vector3 op = origin.position; op.y = 0;
Vector3 dp = destination.position; dp.y = 0;
// Projection of object on line between origin and destination
var projection = Vector3.Project(transform.position - origin.position, op - dp) + op;
// Distance to origin
var dstOrigin = Vector3.Distance(op, projection);
// Distance to destination
var dstDestination = Vector3.Distance(dp, projection);
// Parameter
float t = (dstDestination + dstOrigin == 0 ? 0 : (dstOrigin/(dstDestination + dstOrigin)));
// The angle at current t
float angle = Mathf.Lerp(startAngle, endAngle, t);
// Rotate the object by the angle, then make sure it also faces destination
transform.rotation = Quaternion.LookRotation(dp - op) * Quaternion.Euler(angle, 0, 0);
}
Сколько раз вы хотите повернуть его? только 1 (360 градусов) или 2 экскурсии (720 градусов) или это зависит от расстояния? –
Я хочу повернуть сейчас на 360 градусов, но я хочу, чтобы этот вариант был легко адаптирован позже. –