From 694c67043a8851d4d1b39421e1ff52b6fc6c3664 Mon Sep 17 00:00:00 2001 From: chai Date: Mon, 13 Sep 2021 12:20:30 +0800 Subject: =?UTF-8?q?*=E4=BF=AE=E6=94=B9action=20tool=E8=A7=92=E8=89=B2?= =?UTF-8?q?=E7=9A=84=E6=A0=B9=E8=8A=82=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Assets/ActionTool/Editor/ActionData.cs | 17 ++++--------- Assets/ActionTool/Editor/ActionManager.cs | 29 +++++++++++++++++----- Assets/ActionTool/Editor/ActionRootMotionEditor.cs | 4 +-- 3 files changed, 30 insertions(+), 20 deletions(-) (limited to 'Assets') diff --git a/Assets/ActionTool/Editor/ActionData.cs b/Assets/ActionTool/Editor/ActionData.cs index 13324342..3da31388 100644 --- a/Assets/ActionTool/Editor/ActionData.cs +++ b/Assets/ActionTool/Editor/ActionData.cs @@ -89,7 +89,7 @@ namespace ActionTool m_Animator.Play(kStateName, 0, 0); m_RootMotion = rootmotion; - m_TimelineEventProxy = new TimelineEventProxy(animator.gameObject.transform); + m_TimelineEventProxy = new TimelineEventProxy(ActionManager.unitRoot.transform); m_TimelineEventProxy.isInEditMode = true; m_TimelineEventProxy.registerProjectile = RegisterProjectile; m_TimelineEventProxy.registerParticleSystem = RegisterParticleSystem; @@ -182,8 +182,7 @@ namespace ActionTool if (m_CurAnimFrame > m_TotalFrame) { - m_Animator.transform.position = ActionManager.s_InitPosition; - m_Animator.transform.rotation = ActionManager.s_InitRotation; + ActionManager.ResetUnitRootPosAndRot(); m_PrevNormalTime = 0; } m_CurAnimFrame %= m_TotalFrame; @@ -217,20 +216,14 @@ namespace ActionTool if(!overrideRM && m_RootMotion) { -#if true // Action Tool这里需要转换一下root motion的轴 - m_Animator.transform.position = RootMotionUtility.ExchangeXZ(m_RootMotion.GetRootMotion(normalizeTime)); -#else - Vector3 dis = m_RootMotion.GetRootMotionDistance(m_PrevNormalTime, normalizeTime); - m_Animator.transform.position += RootMotionUtility.ExchangeXZ(dis); - m_PrevNormalTime = normalizeTime; -#endif + ActionManager.unitRoot.transform.position = RootMotionUtility.ExchangeXZ(m_RootMotion.GetRootMotion(normalizeTime)); } else if(overrideRM) { if(!ActionRootMotionEditor.IsRecord) { - m_Animator.transform.position = animData.rootMotionOverrideData.GetPosition(m_CurAnimFrame); + ActionManager.unitRoot.transform.position = animData.rootMotionOverrideData.GetPosition(m_CurAnimFrame); } else // 只在第一次播到这一帧的时候设置位置,否则场景里没法编辑位置 { @@ -238,7 +231,7 @@ namespace ActionTool normalizeTime = curAnimEventFrame / m_TotalFrame; if (curAnimEventFrame != m_PrevAnimEventFrame) { - m_Animator.transform.position = animData.rootMotionOverrideData.GetPosition(curAnimEventFrame); + ActionManager.unitRoot.transform.position = animData.rootMotionOverrideData.GetPosition(curAnimEventFrame); } m_PrevAnimEventFrame = curAnimEventFrame; } diff --git a/Assets/ActionTool/Editor/ActionManager.cs b/Assets/ActionTool/Editor/ActionManager.cs index 54322cd6..cb0d5d71 100644 --- a/Assets/ActionTool/Editor/ActionManager.cs +++ b/Assets/ActionTool/Editor/ActionManager.cs @@ -59,6 +59,7 @@ namespace ActionTool private static GameObject s_CurrentUnit; private static string s_CurrentAnimationName; public static GameObject unitInstance { get { return s_UnitInstance; } } + public static GameObject unitRoot { get; private set; } private static GameObject s_UnitInstance; private static Animator s_Animator; private static AnimatorOverrideController s_OverrideContorller; @@ -67,8 +68,7 @@ namespace ActionTool public static ActionData actionData { get { return s_CurActionData; } } public static Vector3 s_InitPosition = Vector3.zero; - - public static Quaternion s_InitRotation = Quaternion.Euler(0,90,0); + public static Quaternion s_InitRotation = Quaternion.identity; private static RootMotionData s_RootMotion; @@ -119,6 +119,7 @@ namespace ActionTool private static GameObject s_RootActionTool; private const string kRootActionTool = "RootActionTool"; + private const string kUnitRoot = "UnitRoot"; private static AnimationEventBase copiedAnimationEvent; @@ -236,14 +237,23 @@ namespace ActionTool if (unit == null) return; - unit.transform.position = s_InitPosition; - unit.transform.rotation = s_InitRotation; + unit.transform.position = Vector3.zero; + unit.transform.rotation = Quaternion.Euler(0, 90, 0); + + var tempUnitRoot = GameObject.Find(kUnitRoot); + if (tempUnitRoot) + GameObject.DestroyImmediate(tempUnitRoot); + unitRoot = new GameObject(kUnitRoot); + unitRoot.transform.localScale = Vector3.one; + unitRoot.transform.rotation = s_InitRotation; + unitRoot.transform.position = s_InitPosition; + unit.transform.SetParent(unitRoot.transform); s_RootActionTool = GameObject.Find(kRootActionTool); if(s_RootActionTool == null) s_RootActionTool = new GameObject(kRootActionTool); - unit.transform.SetParent(s_RootActionTool.transform); + unitRoot.transform.SetParent(s_RootActionTool.transform); s_Animator = unit.GetComponentInChildren(); if(s_Animator == null) @@ -265,7 +275,7 @@ namespace ActionTool s_Animator.applyRootMotion = false; - s_Gizmos = unit.AddComponent(); + s_Gizmos = s_RootActionTool.AddComponent(); Settings = AssetDatabase.LoadAssetAtPath(s_SettingPath); } @@ -526,5 +536,12 @@ namespace ActionTool { copiedAnimationEvent = UnityEngine.Object.Instantiate(animEvent); } + + public static void ResetUnitRootPosAndRot() + { + unitRoot.transform.position = s_InitPosition; + unitRoot.transform.rotation = s_InitRotation; + } + } } \ No newline at end of file diff --git a/Assets/ActionTool/Editor/ActionRootMotionEditor.cs b/Assets/ActionTool/Editor/ActionRootMotionEditor.cs index 020c86b6..eb076fc3 100644 --- a/Assets/ActionTool/Editor/ActionRootMotionEditor.cs +++ b/Assets/ActionTool/Editor/ActionRootMotionEditor.cs @@ -70,7 +70,7 @@ namespace ActionTool GUI_TakeRecord(ref x, ref y); GUI_Delete(ref x, ref y); GUI.enabled = false; - EditorGUI.Vector3Field(new Rect(0, kToolbarHeight, position.width, 20), "Position: ", ActionManager.unitInstance.transform.position); + EditorGUI.Vector3Field(new Rect(0, kToolbarHeight, position.width, 20), "Position: ", ActionManager.unitRoot.transform.position); GUI.enabled = true; } @@ -90,7 +90,7 @@ namespace ActionTool Rect rect = new Rect(x, y, kToolbarControlSize, kToolbarControlSize); if (GUI.Button(rect, EditorGUIUtility.IconContent("Animation.AddKeyframe", "Key Frame"))) { - Vector3 pos = ActionManager.unitInstance.transform.position; + Vector3 pos = ActionManager.unitRoot.transform.position; int frame = (int)ActionManager.actionData.curAnimFrame; ActionManager.animationData.rootMotionOverrideData.SetPosition(frame, pos); ActionManager.PreviewWindow.Repaint(); -- cgit v1.1-26-g67d0