public void Execute(int index) { if (Keys.Length == 0) { Value[index] = 0; return; } int prevIndex = CachedKeysIndices[index + firstIndex - 1]; if (prevIndex == -1) { Value[index] = Keys[0].value; return; } if (prevIndex == Keys.Length - 1) { Value[index] = Keys[Keys.Length - 1].value; return; } keyStruct prevKey = Keys[prevIndex]; switch (prevKey.interpolation) { case Interpolation.Constant: Value[index] = prevKey.value; break; case Interpolation.Linear: keyStruct nextKey = Keys[prevIndex + 1]; float dt = (index - prevKey.frame) / (float)(nextKey.frame - prevKey.frame); float oneMinusDt = 1f - dt; Value[index] = prevKey.value * oneMinusDt + nextKey.value * dt; break; case Interpolation.Bezier: keyStruct nextKey1 = Keys[prevIndex + 1]; Vector2 A = new Vector2(prevKey.frame, prevKey.value); Vector2 D = new Vector2(nextKey1.frame, nextKey1.value); Vector2 B = A + prevKey.outTangent; Vector2 C = D - nextKey1.inTangent; Value[index] = Bezier.EvaluateBezier(A, B, C, D, index + firstIndex); break; } }