public static MecanimEvent[] GetEvents(Dictionary<int, Dictionary<int, Dictionary<int, List<MecanimEvent>>>> contextLoadedData, Dictionary<int, Dictionary<int, AnimatorStateInfo>> contextLastStates, int animatorControllerId, Animator animator) { List<MecanimEvent> allEvents = new List<MecanimEvent>(); int animatorHash = animator.GetHashCode(); if (!contextLastStates.ContainsKey(animatorHash)) contextLastStates[animatorHash] = new Dictionary<int, AnimatorStateInfo>(); int layerCount = animator.layerCount; Dictionary<int, AnimatorStateInfo> lastLayerState = contextLastStates[animatorHash]; for (int layer = 0; layer < layerCount; layer++) { if (!lastLayerState.ContainsKey(layer)) { lastLayerState[layer] = new AnimatorStateInfo(); } AnimatorStateInfo stateInfo = animator.GetCurrentAnimatorStateInfo(layer); int lastLoop = (int)lastLayerState[layer].normalizedTime; int currLoop = (int)stateInfo.normalizedTime; float lastNormalizedTime = lastLayerState[layer].normalizedTime - lastLoop; float currNormalizedTime = stateInfo.normalizedTime - currLoop; if (lastLayerState[layer].fullPathHash == stateInfo.fullPathHash) { if (stateInfo.loop == true) { if (lastLoop == currLoop) { allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, stateInfo.fullPathHash, stateInfo.tagHash, lastNormalizedTime, currNormalizedTime)); } else { allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, stateInfo.fullPathHash, stateInfo.tagHash, lastNormalizedTime, 1.00001f)); allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, stateInfo.fullPathHash, stateInfo.tagHash, 0.0f, currNormalizedTime)); } } else { float start = Mathf.Clamp01(lastLayerState[layer].normalizedTime); float end = Mathf.Clamp01(stateInfo.normalizedTime); if (lastLoop == 0 && currLoop == 0) { if (start != end) allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, stateInfo.fullPathHash, stateInfo.tagHash, start, end)); } else if (lastLoop == 0 && currLoop > 0) { allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, lastLayerState[layer].fullPathHash, lastLayerState[layer].tagHash, start, 1.00001f)); } else { } } } else { allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, stateInfo.fullPathHash, stateInfo.tagHash, 0.0f, currNormalizedTime)); if (!lastLayerState[layer].loop) { allEvents.AddRange(CollectEvents(contextLoadedData, animator, animatorControllerId, layer, lastLayerState[layer].fullPathHash, lastLayerState[layer].tagHash, lastNormalizedTime, 1.00001f, true)); } } lastLayerState[layer] = stateInfo; } return allEvents.ToArray(); }