Мне нужно было это сейчас, поэтому я придумал это. Я нашел его довольно точным и быстрым (значение точности 10 было достаточно, и даже ниже могло быть сделано). Но он будет работать только на кривых, которые имеют ОДНО определенное время для каждого значения (т. Е. Ничего подобного волнам с многократным значением, имеющим одно и то же значение).
Как и в случае с другим ответом, он выполняет итерацию через возможные моменты времени, но не линейным способом, а значение шага начинается с того, что весь временной интервал и половинки каждый раз.
Надеюсь, это пригодится для вас.
// NB. Will only work for curves with one definite time for each value
public float GetCurveTimeForValue(AnimationCurve curveToCheck, float value, int accuracy) {
float startTime = curveToCheck.keys [0].time;
float endTime = curveToCheck.keys [curveToCheck.length - 1].time;
float nearestTime = startTime;
float step = endTime - startTime;
for (int i = 0; i < accuracy; i++) {
float valueAtNearestTime = curveToCheck.Evaluate (nearestTime);
float distanceToValueAtNearestTime = Mathf.Abs (value - valueAtNearestTime);
float timeToCompare = nearestTime + step;
float valueAtTimeToCompare = curveToCheck.Evaluate (timeToCompare);
float distanceToValueAtTimeToCompare = Mathf.Abs (value - valueAtTimeToCompare);
if (distanceToValueAtTimeToCompare < distanceToValueAtNearestTime) {
nearestTime = timeToCompare;
valueAtNearestTime = valueAtTimeToCompare;
}
step = Mathf.Abs(step * 0.5f) * Mathf.Sign(value-valueAtNearestTime);
}
return nearestTime;
}
Это не встроенное устройство, и в любом случае это не обязательно приведет к уникальному решению. – Bart
@Bart Хорошо и есть ли способ, как достичь этого? Может быть, создать новую кривую с противоположными клавишами? –