// update cache (optimized) public override void updateCache(AMITarget target) { base.updateCache(target); for (int i = 0; i < keys.Count; i++) { AMRotationEulerKey key = keys[i] as AMRotationEulerKey; key.version = version; if (keys.Count > (i + 1)) { key.endFrame = keys[i + 1].frame; } else { if (i > 0 && !keys[i - 1].canTween) { key.interp = (int)AMKey.Interpolation.None; } key.endFrame = -1; } } }
// add a new key public void addKey(AMITarget target, OnAddKey addCall, int _frame, Vector3 _rotation) { foreach (AMRotationEulerKey key in keys) { // if key exists on frame, update key if (key.frame == _frame) { key.rotation = _rotation; // update cache updateCache(target); return; } } AMRotationEulerKey a = addCall(gameObject, typeof(AMRotationEulerKey)) as AMRotationEulerKey; a.frame = _frame; a.rotation = _rotation; // set default ease type to linear a.easeType = (int)Ease.Linear; // add a new key keys.Add(a); // update cache updateCache(target); }
// 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; if (!t) { return; } if (keys == null || keys.Count <= 0) { return; } // if before or equal to first frame, or is the only frame AMRotationEulerKey firstKey = keys[0] as AMRotationEulerKey; if (firstKey.endFrame == -1 || (frame <= (float)firstKey.frame && !firstKey.canTween)) { ApplyRot(t, firstKey.rotation); return; } // if lies on rotation action for (int i = 0; i < keys.Count; i++) { AMRotationEulerKey key = keys[i] as AMRotationEulerKey; AMRotationEulerKey keyNext = i + 1 < keys.Count ? keys[i + 1] as AMRotationEulerKey : null; if (frame >= (float)key.endFrame && keyNext != null && (!keyNext.canTween || keyNext.endFrame != -1)) { continue; } // if no ease if (!key.canTween || keyNext == null) { ApplyRot(t, key.rotation); return; } // else easing function float numFrames = (float)key.getNumberOfFrames(frameRate); float framePositionInAction = Mathf.Clamp(frame - (float)key.frame, 0f, numFrames); Vector3 qStart = key.rotation; Vector3 qEnd = keyNext.rotation; if (key.hasCustomEase()) { ApplyRot(t, Vector3.Lerp(qStart, qEnd, Utility.EaseCustom(0.0f, 1.0f, framePositionInAction / numFrames, key.easeCurve))); } else { var ease = Utility.GetEasingFunction((Ease)key.easeType); ApplyRot(t, Vector3.Lerp(qStart, qEnd, ease(framePositionInAction, numFrames, key.amplitude, key.period))); } return; } }
// copy properties from key public override void CopyTo(AMKey key) { base.CopyTo(key); AMRotationEulerKey a = key as AMRotationEulerKey; a.rotation = rotation; }
// copy properties from key public override void CopyTo(AMKey key) { AMRotationEulerKey a = key as AMRotationEulerKey; a.enabled = false; a.frame = frame; a.rotation = rotation; a.easeType = easeType; a.customEase = new List <float>(customEase); }
Vector3 getRotationAtFrame(int frame, int frameRate) { // if before or equal to first frame, or is the only frame AMRotationEulerKey firstKey = keys[0] as AMRotationEulerKey; 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++) { AMRotationEulerKey key = keys[i] as AMRotationEulerKey; AMRotationEulerKey keyNext = i + 1 < keys.Count ? keys[i + 1] as AMRotationEulerKey : 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 easing function float numFrames = (float)key.getNumberOfFrames(frameRate); float framePositionInAction = Mathf.Clamp(frame - (float)key.frame, 0f, numFrames); Vector3 qStart = key.rotation; Vector3 qEnd = keyNext.rotation; if (key.hasCustomEase()) { return(Vector3.Lerp(qStart, qEnd, Utility.EaseCustom(0.0f, 1.0f, framePositionInAction / numFrames, key.easeCurve))); } else { var ease = Utility.GetEasingFunction((Ease)key.easeType); return(Vector3.Lerp(qStart, qEnd, ease(framePositionInAction, numFrames, key.amplitude, key.period))); } } Debug.LogError("Animator: Could not get rotation at frame '" + frame + "'"); return(Vector3.zero); }