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窗口预览动画片段的工具,如图所示: 

代码如下:


  
  1. using UnityEngine;
  2. using UnityEditor;
  3. namespace SK.Framework
  4. {
  5. /// <summary>
  6. /// 动画片段预览工具
  7. /// </summary>
  8. public class AnimationClipPreviewer : EditorWindow
  9. {
  10. //菜单
  11. [MenuItem("SKFramework/Tools/Animation Clip Previewer")]
  12. private static void Open()
  13. {
  14. //打开窗口
  15. GetWindow<AnimationClipPreviewer>("Animation Clip Previewer").Show();
  16. }
  17. private int currentClipIndex;
  18. private float previewNormalizedTime;
  19. private void OnGUI()
  20. {
  21. //未选中任何物体 return
  22. if (Selection.activeGameObject == null) return;
  23. //选中的物体不包含Animator组件 return
  24. var animator = Selection.activeGameObject.GetComponent<Animator>();
  25. if (animator == null)
  26. {
  27. EditorGUILayout.HelpBox("Not found Animator component.", MessageType.Warning);
  28. return;
  29. }
  30. //动画未初始化 return
  31. if (!animator.isInitialized)
  32. {
  33. EditorGUILayout.HelpBox("Animator is not initialized.", MessageType.Warning);
  34. return;
  35. }
  36. //获取所有动画片段
  37. var clips = animator.runtimeAnimatorController.animationClips;
  38. if (clips.Length == 0)
  39. {
  40. EditorGUILayout.HelpBox("Animation clips count: 0", MessageType.Info);
  41. return;
  42. }
  43. //获取所有动画片段名称
  44. var names = new string[clips.Length];
  45. for (int i = 0; i < names.Length; i++)
  46. {
  47. names[i] = clips[i].name;
  48. }
  49. //通过名称选择动画片段
  50. currentClipIndex = EditorGUILayout.Popup(currentClipIndex, names);
  51. //水平布局
  52. GUILayout.BeginHorizontal();
  53. {
  54. //预览的进度
  55. previewNormalizedTime = EditorGUILayout.Slider(previewNormalizedTime, 0f, 1f);
  56. //当前动画片段总时长
  57. float length = clips[currentClipIndex].length;
  58. //当前预览的时间点
  59. float currentTime = length * previewNormalizedTime;
  60. //文本显示时长信息 00:00/00:00
  61. GUILayout.Label($"{ToMSTimeFormat(currentTime)}/{ToMSTimeFormat(length)}");
  62. //动画采样 进行预览
  63. clips[currentClipIndex].SampleAnimation(animator.gameObject, currentTime);
  64. }
  65. GUILayout.EndHorizontal();
  66. }
  67. //将秒数转换为00:00格式字符串
  68. private string ToMSTimeFormat(float length)
  69. {
  70. int v = (int)length;
  71. int minute = v / 60;
  72. int second = v % 60;
  73. return string.Format("{0:D2}:{1:D2}", minute, second);
  74. }
  75. private void OnSelectionChange()
  76. {
  77. Repaint();
  78. }
  79. }
  80. }

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

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

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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