Quaternion getRotationAtFrame(int frame, int frameRate) { // if before or equal to first frame, or is the only frame AMRotationKey firstKey = keys[0] as AMRotationKey; if (firstKey.endFrame == -1 || (frame <= (float)firstKey.frame && !firstKey.canTween)) { return(firstKey.rotation); } // if lies on rotation action for (int i = 0; i < keys.Count; i++) { AMRotationKey key = keys[i] as AMRotationKey; AMRotationKey keyNext = i + 1 < keys.Count ? keys[i + 1] as AMRotationKey : null; if (frame >= (float)key.endFrame && keyNext != null && (!keyNext.canTween || keyNext.endFrame != -1)) { continue; } // if no ease if (!key.canTween || keyNext == null) { return(key.rotation); } // else find Quaternion using easing function float numFrames = (float)key.getNumberOfFrames(frameRate); float framePositionInAction = Mathf.Clamp(frame - (float)key.frame, 0f, numFrames); Quaternion qStart = key.rotation; Quaternion qEnd = keyNext.rotation; if (key.hasCustomEase()) { return(Quaternion.LerpUnclamped(qStart, qEnd, AMUtil.EaseCustom(0.0f, 1.0f, framePositionInAction / numFrames, key.easeCurve))); } else { var ease = AMUtil.GetEasingFunction((Ease)key.easeType); return(Quaternion.LerpUnclamped(qStart, qEnd, ease(framePositionInAction, numFrames, key.amplitude, key.period))); } } Debug.LogError("Animator: Could not get rotation at frame '" + frame + "'"); return(Quaternion.identity); }
// preview a frame in the scene view public override void previewFrame(AMITarget target, float frame, int frameRate, bool play, float playSpeed) { Transform t = GetTarget(target) as Transform; int keyCount = keys.Count; if (!t) { return; } if (keys == null || keyCount <= 0) { return; } // if before or equal to first frame, or is the only frame AMRotationKey firstKey = keys[0] as AMRotationKey; if (firstKey.endFrame == -1 || (frame <= (float)firstKey.frame && !firstKey.canTween)) { t.localRotation = firstKey.rotation; return; } // if lies on rotation action for (int i = 0; i < keys.Count; i++) { AMRotationKey key = keys[i] as AMRotationKey; AMRotationKey keyNext = i + 1 < keys.Count ? keys[i + 1] as AMRotationKey : null; if (frame >= (float)key.endFrame && keyNext != null && (!keyNext.canTween || keyNext.endFrame != -1)) { continue; } // if no ease if (!key.canTween || keyNext == null) { t.localRotation = key.rotation; return; } // else find Quaternion using easing function float numFrames = (float)key.getNumberOfFrames(frameRate); float framePositionInAction = Mathf.Clamp(frame - (float)key.frame, 0f, numFrames); Quaternion qStart = key.rotation; Quaternion qEnd = keyNext.rotation; if (key.hasCustomEase()) { t.localRotation = Quaternion.LerpUnclamped(qStart, qEnd, AMUtil.EaseCustom(0.0f, 1.0f, framePositionInAction / numFrames, key.easeCurve)); } else { var ease = AMUtil.GetEasingFunction((Ease)key.easeType); t.localRotation = Quaternion.LerpUnclamped(qStart, qEnd, ease(framePositionInAction, numFrames, key.amplitude, key.period)); } return; } }