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

举报
CoderZ1010 发表于 2022/09/25 06:54:28 2022/09/25
【摘要】 通常我们把一个人物模型拖到Scene场景中后是这样的: 本文制作一个在Scene窗口预览动画片段的工具,如图所示:  代码如下: using UnityEngine;using UnityEditor; namespace SK.Framework{ /// <summary> ///...

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

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

代码如下:


      using UnityEngine;
      using UnityEditor;
      namespace SK.Framework
      {
         /// <summary>
         /// 动画片段预览工具
         /// </summary>
         public class AnimationClipPreviewer : EditorWindow
          {
             //菜单
              [MenuItem("SKFramework/Tools/Animation Clip Previewer")]
             private static void Open()
              {
                 //打开窗口
                  GetWindow<AnimationClipPreviewer>("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<Animator>();
                 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();
              }
          }
      }
  
 

文章来源: coderz.blog.csdn.net,作者:CoderZ1010,版权归原作者所有,如需转载,请联系作者。

原文链接:coderz.blog.csdn.net/article/details/123210592

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。