This document is about: QUANTUM 2
SWITCH TO

유니티 애니메이션 커브 베이킹

Quantum의 FPAnimationCurve은 이미 곡선 편집기를 통해 내부적으로 유니티의 비결정론적 유형 간 변환을 수행하지만, 사용 가능한 자동 편집기 변환이 없을 때 AnimationCurve에서 변환하는 것이 유용할 수 있습니다.

한 가지 예는 유니티의 애니메이션 클립에서 가져온 곡선을 변환하여 시뮬레이션에 사용할 수 있는 결정론적 버전을 만드는 것입니다.

다음은 AnimationCurve에서 FPAnimationCurve 을 만드는 데 필요한 코드입니다.

C#

public static FPAnimationCurve ConvertAnimationCurve(AnimationCurve animationCurve)
{
    // Get UNITY keyframes
    Keyframe[] unityKeys = animationCurve.keys;

    // Prepare QUANTUM curves and keyframes to receive the info
    FPAnimationCurve fpCurve = new FPAnimationCurve();
    fpCurve.Keys = new FPAnimationCurve.Keyframe[unityKeys.Length];

    // Get the Unity Start and End time for this specific curve
    float startTime = animationCurve.keys.Length == 0 ? 0.0f : float.MaxValue;
    float endTime = animationCurve.keys.Length == 0 ? 1.0f : float.MinValue;

    // Set the resolution for the curve, which informs how detailed it is
    fpCurve.Resolution = 32;

    for (int i = 0; i < unityKeys.Length; i++)
    {
        fpCurve.Keys[i].Time = FP.FromFloat_UNSAFE(unityKeys[i].time);
        fpCurve.Keys[i].Value = FP.FromFloat_UNSAFE(unityKeys[i].value);

        if (float.IsInfinity(unityKeys[i].inTangent) == false)
        {
            fpCurve.Keys[i].InTangent = FP.FromFloat_UNSAFE(unityKeys[i].inTangent);
        }
        else
        {
            fpCurve.Keys[i].InTangent = FP.SmallestNonZero;
        }

        if (float.IsInfinity(unityKeys[i].outTangent) == false)
        {
            fpCurve.Keys[i].OutTangent = FP.FromFloat_UNSAFE(unityKeys[i].outTangent);
        }
        else
        {
            fpCurve.Keys[i].OutTangent = FP.SmallestNonZero;
        }

        fpCurve.Keys[i].TangentModeLeft = (byte)AnimationUtility.GetKeyLeftTangentMode(animationCurve, i);
        fpCurve.Keys[i].TangentModeRight = (byte)AnimationUtility.GetKeyRightTangentMode(animationCurve, i);

        startTime = Mathf.Min(startTime, animationCurve[i].time);
        endTime = Mathf.Max(endTime, animationCurve[i].time);
    }

    fpCurve.StartTime = FP.FromFloat_UNSAFE(startTime);
    fpCurve.EndTime = FP.FromFloat_UNSAFE(endTime);

    fpCurve.PreWrapMode = (int)animationCurve.preWrapMode;
    fpCurve.PreWrapMode = (int)animationCurve.postWrapMode;

    // Actually save the many points of the unity curve into the quantum curve
    SaveQuantumCurve(animationCurve, 32, ref fpCurve, startTime, endTime);
    return fpCurve;
}
Back to top