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(); } } } }