Мне нужно сгенерировать клип Animation с помощью AnimationCurves, чтобы переместить объект в целевую позицию.Для этого я написал сценарий редактора, который генерирует анимационные клипы и настраивает все.
Теперь моя проблема: у меня есть кривая скорости, которая определяет КОГДА, КАК БЫСТРО, объект будет двигаться.(1 - TopSpeed, 0 - не движется) это выглядит так.https://i.imgur.com/44YDHrY.png
Что он генерирует https://i.imgur.com/kzsT8RL.png
Теперь я попробовал несколько способов создания кривой.где linearCurve
- это кривая, предназначенная для интерполяции между начальной и конечной позициями, а speedCurve
определяет кривую скорости, как упомянуто выше.
worldCurve
- ожидаемый результат.
AnimationCurve linearCurve = AnimationCurve.Linear(0f, startZ, clipLength, destinationZ);
AnimationCurve speedCurve = distanceData.speedCurve;
AnimationCurve worldCurve = new AnimationCurve();
int sampleRate = 3;
float _scTime = 0f;
float _scValue = 0f;
for (int i = 0; i < speedCurve.length; i++) {
//float scTime = (clipLength / sampleRate) * i;
float scTime = speedCurve.keys[i].time;
float scValue = speedCurve.keys[i].value;
Debug.Log(String.Format("{0} hat {1}", scTime, scValue));
}
float lastZ = 0f;
for (int i = 0; i < speedCurve.length; i++) {
//float scTime = (clipLength / sampleRate) * i;
float scTime = speedCurve.keys[i].time;
float scValue = speedCurve.keys[i].value;
//Debug.Log(String.Format("{0} von {1}", scNow, scMax));
//float sampleTime = /*linearCurve.length * */(_scTime + (Math.Abs(scTime - _scTime)));
float calcZ = lastZ;
float sampleTime = 0f;
if (i > 0) {
for (int j = 0; j < sampleRate; j++) {
float tI = (float)((float)j / (float)sampleRate);
float tTime = (scTime - _scTime) * tI;
// speedCurve.keys.Last().time
float sampleValue = linearCurve.Evaluate(scTime);
sampleTime = clipLength * (i / speedCurve.length) + tTime;
//float diffZ = linearCurve.Evaluate(scTime) - linearCurve.Evaluate(_scTime);
//calcZ = lastZ + diffZ;
Keyframe kf = new Keyframe(sampleTime, sampleValue);
worldCurve.AddKey(kf);
}
}
_scTime = sampleTime;// scTime;
_scValue = scValue;
lastZ = calcZ;
}
ac.SetCurve("World/Fake", typeof(Transform), "localPosition.z", worldCurve);
Он должен сгенерировать кривую так: https://i.imgur.com/pY8dm5g.png