/// <summary> /// [HACK TRICK] /// update every loop, /// current in-edit clip, clip's rootTr /// </summary> private void _UpdateInternalInfo() { AnimationClip curClip = null; Transform rootTr = null; m_AnimationWindowState = EUtil.GetUnityAnimationWindowState(m_UAW); if (m_AnimationWindowState != null) { curClip = RCall.GetField("UnityEditorInternal.AnimationWindowState", "m_ActiveAnimationClip", m_AnimationWindowState) as AnimationClip; #if U5 GameObject rootGO = RCall.GetProp("UnityEditorInternal.AnimationWindowState", "activeRootGameObject", m_AnimationWindowState) as GameObject; #else GameObject rootGO = RCall.GetField("UnityEditorInternal.AnimationWindowState", "m_RootGameObject", m_AnimationWindowState) as GameObject; #endif if (rootGO != null) { rootTr = rootGO.transform; } } else { curClip = null; rootTr = null; } if (curClip != m_CurClip) { _OnCurrentClipChange(m_CurClip, curClip); } if (rootTr != m_ClipRoot) { _OnRootTransformChange(m_ClipRoot, rootTr); } }
void OnGUI() { EditorGUILayout.LabelField("Set the Roots:"); for (int i = 0; i < m_Roots.Count; ++i) { EditorGUILayout.BeginHorizontal(); { EditorGUI.BeginChangeCheck(); var root = (Transform)EditorGUILayout.ObjectField(m_Roots[i], typeof(Transform), true); if (EditorGUI.EndChangeCheck()) { m_Roots[i] = root; } if (EUtil.Button("-", "delete entry", Color.red, GUILayout.Width(20f))) { m_Roots.RemoveAt(i); GUIUtility.ExitGUI(); } } EditorGUILayout.EndHorizontal(); } EditorGUILayout.BeginHorizontal(); { GUILayout.Space(40f); if (GUILayout.Button("Add Root Entry")) { m_Roots.Add(null); } GUILayout.Space(40f); } EditorGUILayout.EndHorizontal(); GUILayout.Space(5f); if (GUILayout.Button(m_baking ? "Baking" : "Not Baking", EditorStyles.toolbarButton)) { m_baking = !m_baking; if (m_baking) { m_Trs.Clear(); foreach (var oneRoot in m_Roots) { for (var ie = oneRoot.GetRecurEnumerator(); ie.MoveNext();) { m_Trs.Add(ie.Current); } } m_TrsArr = m_Trs.ToArray(); m_uaw = EUtil.GetUnityAnimationWindow(); if (null == m_uaw) { m_baking = false; } } } if (!m_baking) { EditorWindow uaw = (EditorWindow)EUtil.GetUnityAnimationWindow(); if (uaw == null) { EditorGUIUtility.ExitGUI(); } object uawstate = EUtil.GetUnityAnimationWindowState(uaw); if (uawstate == null) { EditorGUIUtility.ExitGUI(); } var clip = RCall.GetField("UnityEditorInternal.AnimationWindowState", "m_ActiveAnimationClip", uawstate) as AnimationClip; if (clip == null) { EditorGUIUtility.ExitGUI(); } GUILayout.Space(5f); if (GUILayout.Button(new GUIContent("Compress Angles", "Only use this method on a clips full of keyframes"), EditorStyles.toolbarButton)) { _NormalizeRotationsInClip(uawstate, clip); } } }