2014-08-27 2 views
4

Есть ли встроенный способ, как получить время по стоимости от кривой анимации в Unity3d? (Противоположный способ Оценивать)AnimationCurve.Evaluate - Получить время по значению

мне нужно для достижения этой цели (вместо того, чтобы значение времени):

float time = AnimationCurve.Evaluate(float value); 

В общем говоря, получая значение X от значения Y.

+0

Это не встроенное устройство, и в любом случае это не обязательно приведет к уникальному решению. – Bart

+0

@Bart Хорошо и есть ли способ, как достичь этого? Может быть, создать новую кривую с противоположными клавишами? –

ответ

3

Просто базовая реализация, возможно, даст вам идею. Метод циклически проходит все время, и если ваше значение близко к этому значению в это время, оно будет работать. Это сопрограмма, но вы можете изменить ее, чтобы использовать внутри Update, может быть?

public AnimationCurve curve; 
public float valToTime = .5f; 
public float treshold = .005f; 
public float yourTime; 
IEnumerator valueToTime(float determineTime) 
{ 
    float timeCounter = 0; 
    Keyframe[] k = curve.keys; 
    float endTime = k[k.Length-1].time; 
    Debug.Log("end "+endTime); 
    while(timeCounter < endTime) 
    { 
     float val = curve.Evaluate(timeCounter); 
     Debug.Log("val "+ val + " time "+timeCounter); 
     // have to find a better solution for treshold sometimes it misses(use Update?)! 
     if(Mathf.Abs(val - determineTime) < treshold) 
     { 
      //Your time would be this 
      yourTime = timeCounter; 
      yield break; 
     } 
     else 
     { 
      //If it's -1 than a problem occured, try changing treshold 
      yourTime = -1f; 
     } 
     timeCounter += Time.deltaTime; 
     yield return null; 
    } 
} 
+0

Насколько это лучшее решение. Производительность не самая лучшая, но я в моем случае, мне она нужна только в определенной ситуации. Thx за идею. –

2

Мне нужно было это сейчас, поэтому я придумал это. Я нашел его довольно точным и быстрым (значение точности 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; 
} 
2

Я знаю, что это 3-х лет, но я нашел через поиск Google, а также в случае, если кто-то еще земли здесь:

Я просто создать обратную кривую, которая позволяет мне смотреть по времени ,

public AnimationCurve speedCurve; 

private AnimationCurve inverseSpeedCurve; 

private void Start() 
{ 
    //create inverse speedcurve 
    inverseSpeedCurve = new AnimationCurve(); 
    for (int i = 0; i < speedCurve.length; i++) 
    { 
     Keyframe inverseKey = new Keyframe(speedCurve.keys[i].value, speedCurve.keys[i].time); 
     inverseSpeedCurve.AddKey(inverseKey); 
    } 
} 
Смежные вопросы