您当前的位置: 首页 >  unity

CoderZ1010

暂无认证

  • 5浏览

    0关注

    168博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Unity 编辑器开发实战【Editor Window】- Animation Clip Previewer 动画片段预览工具

CoderZ1010 发布时间:2022-03-01 17:17:48 ,浏览量:5

通常我们把一个人物模型拖到Scene场景中后是这样的:

本文制作一个在Scene窗口预览动画片段的工具,如图所示: 

代码如下:

using UnityEngine;
using UnityEditor;

namespace SK.Framework
{
    /// 
    /// 动画片段预览工具
    /// 
    public class AnimationClipPreviewer : EditorWindow
    {
        //菜单
        [MenuItem("SKFramework/Tools/Animation Clip Previewer")]
        private static void Open()
        {
            //打开窗口
            GetWindow("Animation Clip Previewer").Show();
        }

        private int currentClipIndex;
        private float previewNormalizedTime;

        private void OnGUI()
        {
            //未选中任何物体 return
            if (Selection.activeGameObject == null) return;
            //选中的物体不包含Animator组件 return
            var animator = Selection.activeGameObject.GetComponent();
            if (animator == null)
            {
                EditorGUILayout.HelpBox("Not found Animator component.", MessageType.Warning);
                return;
            }
            //动画未初始化 return
            if (!animator.isInitialized)
            {
                EditorGUILayout.HelpBox("Animator is not initialized.", MessageType.Warning);
                return;
            }
            //获取所有动画片段
            var clips = animator.runtimeAnimatorController.animationClips;
            if (clips.Length == 0)
            {
                EditorGUILayout.HelpBox("Animation clips count: 0", MessageType.Info);
                return;
            }
            //获取所有动画片段名称
            var names = new string[clips.Length];
            for (int i = 0; i < names.Length; i++)
            {
                names[i] = clips[i].name;
            }
            //通过名称选择动画片段
            currentClipIndex = EditorGUILayout.Popup(currentClipIndex, names);
            //水平布局
            GUILayout.BeginHorizontal();
            {
                //预览的进度
                previewNormalizedTime = EditorGUILayout.Slider(previewNormalizedTime, 0f, 1f);
                //当前动画片段总时长
                float length = clips[currentClipIndex].length;
                //当前预览的时间点
                float currentTime = length * previewNormalizedTime;
                //文本显示时长信息 00:00/00:00
                GUILayout.Label($"{ToMSTimeFormat(currentTime)}/{ToMSTimeFormat(length)}");
                //动画采样 进行预览
                clips[currentClipIndex].SampleAnimation(animator.gameObject, currentTime);
            }
            GUILayout.EndHorizontal();
        }

        //将秒数转换为00:00格式字符串
        private string ToMSTimeFormat(float length)
        {
            int v = (int)length;
            int minute = v / 60;
            int second = v % 60;
            return string.Format("{0:D2}:{1:D2}", minute, second);
        }

        private void OnSelectionChange()
        {
            Repaint();
        }
    }
}
关注
打赏
1653184800
查看更多评论
立即登录/注册

微信扫码登录

0.0496s