From a13f10139d33264fc9ebc5a15c75faf16fc7757e Mon Sep 17 00:00:00 2001 From: chai Date: Wed, 7 Jul 2021 18:47:37 +0800 Subject: +Action Tool --- Assets/ActionTool/Editor/ActionManager.cs | 154 ++++++++++++++++++++++++++++++ 1 file changed, 154 insertions(+) create mode 100644 Assets/ActionTool/Editor/ActionManager.cs (limited to 'Assets/ActionTool/Editor/ActionManager.cs') diff --git a/Assets/ActionTool/Editor/ActionManager.cs b/Assets/ActionTool/Editor/ActionManager.cs new file mode 100644 index 00000000..e894d32c --- /dev/null +++ b/Assets/ActionTool/Editor/ActionManager.cs @@ -0,0 +1,154 @@ +using System.Collections; +using System.Collections.Generic; +using UnityEditor; +using UnityEngine; + +namespace ActionTool +{ + public static class ActionManager + { + public static string s_AnimFolder = "Assets/Art/Animations/"; + public static string s_Controller = "Assets/ActionTool/controller_temp.controller"; + public static string s_AnimationDataFolder = "Assets/Data/AnimationData/"; + public static string s_UnitDataFolder = "Assets/Data/UnitData/"; + + public static ActionEditor AnimationWindow; + public static ActionPreviewEditor PreviewWindow; + public static ActionEventEditor EventEditWindow; + public static ActionColliderEditor ColliderWindow; + + public const int FPS = 30; + + public static float Speed = 1; + + public static GameObject CurrentUnit + { + get + { + return s_CurrentUnit; + } + } + + public static string CurrentAnimationName + { + get + { + return s_CurrentAnimationName; + } + } + + private static GameObject s_CurrentUnit; + private static string s_CurrentAnimationName; + private static GameObject s_UnitInstance; + private static Animator s_Animator; + private static AnimatorOverrideController s_OverrideContorller; + + private static ActionData s_CurActionData; + + public static Vector3 s_InitPosition = Vector3.zero; + + public static Quaternion s_InitRotation = Quaternion.identity; + + private static bool s_IsPlay; + public static bool IsPlay { get { return s_IsPlay; } } + + public static void OnSelectObj(GameObject obj) + { + Release(); + s_CurrentUnit = obj; + if(s_CurrentUnit != null) + { + s_UnitInstance = GameObject.Instantiate(obj); + InitializeUnitInstance(s_UnitInstance); + } + } + + public static void OnSelectAnimation(string animation) + { + s_CurrentAnimationName = animation; + if(PreviewWindow == null) + PreviewWindow = EditorWindow.GetWindow(); + PreviewWindow.Repaint(); + + string animpath = s_AnimFolder + s_CurrentUnit.name + "/" + animation + ".anim"; + AnimationClip clip = AssetDatabase.LoadAssetAtPath(animpath, typeof(AnimationClip)) as AnimationClip; + if(clip) + { + s_OverrideContorller["EmptyAction"] = clip; + } + + if(s_CurActionData == null) + s_CurActionData = new ActionData(); + s_CurActionData.Initialize(s_Animator, clip); + } + + public static bool HasSelectObj() + { + return s_CurrentUnit != null; + } + + public static string GetUnitName() + { + if (s_CurrentUnit == null) + return null; + return s_CurrentUnit.name; + } + + public static void Release() + { + if(s_UnitInstance != null) + GameObject.DestroyImmediate(s_UnitInstance); + s_UnitInstance = null; + s_CurrentUnit = null; + s_CurrentAnimationName = null; + s_Animator = null; + } + + private static void InitializeUnitInstance(GameObject unit) + { + if (unit == null) + return; + + unit.transform.position = s_InitPosition; + unit.transform.rotation = s_InitRotation; + + s_Animator = unit.GetComponentInChildren(); + if(s_Animator == null) + { + Debug.LogError("[ActionTool] 角色prefab下没有animator"); + return; + } + + RuntimeAnimatorController controller = AssetDatabase.LoadAssetAtPath(s_Controller, typeof(RuntimeAnimatorController)) as RuntimeAnimatorController; + if(controller == null) + { + Debug.LogError("[ActionTool] 文件丢失" + s_Controller); + return; + } + + s_OverrideContorller = new AnimatorOverrideController(controller); + s_OverrideContorller.name = "override controller"; + s_Animator.runtimeAnimatorController = s_OverrideContorller; + + UnitRootMotion rootMotion = s_UnitInstance.GetComponent(); + Object.DestroyImmediate(rootMotion); + } + + public static void UpdateFrame() + { + if (s_CurActionData != null) + s_CurActionData.UpdateFrame(); + } + + public static void Pause() + { + s_IsPlay = !s_IsPlay; + if(s_IsPlay && s_CurActionData != null) + { + s_CurActionData.SetCurrentAnimTime(0); + s_CurActionData.StartFrame(); + } + } + + } +} \ No newline at end of file -- cgit v1.1-26-g67d0