关闭

Unity Animator 窗口的控制

标签: unity编辑器扩展
3141人阅读 评论(0) 收藏 举报
分类:

问题描述


Animator 窗口默认显示的是 Base Layer 的动画状态机,每次要编辑子状态机里的状态动画时,都得手动双击进到子状态机里,非常不便。研究编辑器代码,来达到自动显示子状态机界面,如下面所示:

实现分析

Animator 窗口的实现类,位于目录 "Unity\Editor\Data\Managed\UnityEditor.Graphs.dll",反编译 DLL,AnimatorControllerTool 类就是具体实现。

这是顶部的状态机视图切换导航,它的列表保存在 AnimatorControllerTool.m_BreadCrumbs (面包屑)数组里面,点击的时候会调用 GoToBreadCrumbTarget 方法,将跳到所点击的状态机里,这个方法会将 m_BreadCrumbs  所点击的数组索引之后的值删除掉,然后调用 UpdateStateMachineSelection 方法。这个方法,会将 m_BreadCrumbs 数组的最后一个值作为显示的状态机。

所要用到的 API 接口:
  1. 当前显示的动画状态机,通过接口 UnityEditor.Graphs.AnimationStateMachine.Graph.activeStateMachine 来获得。
  2. 构建面包屑路径通过 AnimatorControllerTool.BuildBreadCrumbsFromSMHierarchy 方法来实现。

如果当前已经是要设置的动画状态机了,那就不做任何操作。如果不是的话,再来构建面包屑路径。

具体实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
    public static void SetActiveStateMachine(AnimatorController animatorController, AnimatorStateMachine animatorStateMachine)
    {
        InitReflect();

        AnimatorStateMachine activeStateMachine = animatorControllerToolReflect.activeStateMachine;
if (animatorStateMachine != activeStateMachine && animatorStateMachine != null)
        {
            List<AnimatorStateMachine> hierarchy = new List<AnimatorStateMachine>();
            AnimatorControllerUtil.MecanimUtilities_StateMachineRelativePath(
                AnimatorControllerUtil.AnimatorController_BaseLayerStateMachine(animatorController), 
                animatorStateMachine, ref hierarchy);
            animatorControllerToolReflect.BuildBreadCrumbsFromSMHierarchy(hierarchy);
        }
    }
  1. animatorControllerToolReflect 是反射类,方便控制 AnimatorControllerTool 对象;
  2. MecanimUtilities_StateMachineRelativePath 方法,是获取两个状态机直接的路径,详见 UnityEditor.Animations.MecanimUtilities 类;
  3. AnimatorController_BaseLayerStateMachine 方法,是获取控制器的最底层状态机;

视图滚动到指定的状态

每当状态机里面状态过多的时候,寻找指定的状态,总是很麻烦,要一直拖动视图。现在通过获取状态的 position 来滚动到此位置。

通过打印坐标位置来得到上面的关系

信息分别如下:
  • 状态的坐标,即 ChildAnimatorState 的 position 值;
  • 当前视图的 scrollPosition 值;
  • 当前视图的 graphExtents 值;
那么要控制滚动位置的话,通过 graphExtents 减去状态的 position 值来实现,代码如下:
1
2
3
4
5
6
7
8
9
10
    public static void ScrollToState(AnimatorStateMachine animatorStateMachine, AnimatorState state)
    {
        InitReflect();

        Vector3 pos = AnimatorControllerUtil.AnimatorStateMachine_GetStatePosition(animatorStateMachine, state);
        Rect graphExtents = animatorControllerToolReflect.graphExtents;

        Vector2 pos2 = new Vector2(pos.x - graphExtents.x, pos.y - graphExtents.y);
        animatorControllerToolReflect.scrollPosition = pos2;
    }
 效果如下:

但是一般都是将状态至于中间,才能方便看到与状态有关的过渡线。视图的大小保存在 GraphGUI 的 m_GraphClientArea 变量里。那么居中的代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
    public static void ScrollToState(AnimatorStateMachine animatorStateMachine, AnimatorState state)
    {
        InitReflect();

        Vector3 pos = AnimatorControllerUtil.AnimatorStateMachine_GetStatePosition(animatorStateMachine, state);
        Rect graphExtents = animatorControllerToolReflect.graphExtents;
        Rect graphClientArea = animatorControllerToolReflect.graphClientArea;

        Vector2 pos2 = new Vector2(pos.x - graphExtents.x - graphClientArea.width / 2 + 100f, 
            pos.y - graphExtents.y - graphClientArea.height / 2 + 25f);
        animatorControllerToolReflect.scrollPosition = pos2;
    }
效果如下:

完整代码

0
0
查看评论

Unity中Animation与Animator组件的使用

在unity的老版本中我们只有Animation组件,在4.6版本以后则增添了Animator组件,如果只是控制一个动画的播放我们则用Animaton组件,如果是很多动画之间相互转换则使用Animator组件,它们两者的区别就是Animator有一个动画控制器,使用它来进行动画切换是非常方便的,但缺...
  • caojianhua1993
  • caojianhua1993
  • 2016-03-01 22:13
  • 3942

[Unity&Animator]拖动Animator面板的问题

有的时候打开 Animator 界面,会出现如下所示的问题,无法看到该页面的全貌 使用鼠标中键,滚轮、中键按下拖动都可以的。
  • BuladeMian
  • BuladeMian
  • 2017-06-12 10:45
  • 879

Mecanim Animator使用详解

1. 简介     Mecanim把游戏中的角色设计提高到了一个新的层次,使用Mecanim可以通过Retargeting(重定向)来提高角色动画的重用性。在处理人类角色动画时,用户可以使用动画状态机来处理动画之间的过渡及动画之间的逻辑。  2. Animat...
  • MyArrow
  • MyArrow
  • 2015-04-24 10:15
  • 37182

unity-动画状态机Animator

unity可以用两种方式控制动画 1. Animations,这种方式简单,直接 Play(“Idle”) 或者 CorssFade(“Idle”) 就可以播放动画 2. Animator,5.x之后推荐使用这种方式,因为里面可以加上混合动画,让动画切换更加平滑 1、导入模型及动作,做成...
  • yangxuan0261
  • yangxuan0261
  • 2016-08-27 11:17
  • 22334

Unity5.x Mecanim Animator使用详解

1. 简介     Mecanim把游戏中的角色设计提高到了一个新的层次,使用Mecanim可以通过Retargeting(重定向)来提高角色动画的重用性。在处理人类角色动画时,用户可以使用动画状态机来处理动画之间的过渡及动画之间的逻辑。    Me...
  • qq563129582
  • qq563129582
  • 2016-12-05 18:17
  • 7716

unity 新的动画系统 Animator的使用(原)

Animator是unity新的动画系统,除了基本的播放动画功能之外,还提供了更强大的其它功能 基本篇 1新建AnimatorController,将动作拖到AnimatorController,将动作做连线,新建状态值,设置连线通过条件的状态值 2代码使用SetInteger("变量名...
  • u014635337
  • u014635337
  • 2015-07-17 00:34
  • 12022

Unity-Animator深入系列---API详解

回到 Animator深入系列总目录 测试Unity版本为5.2.1 人形动画的接口都有标注本列表不包含所有标注为过时的方法 1.Vector3 angularVelocity { get; } [人形动画]获得Avatar相对于最后一帧的角速率 2.bool...
  • sgnyyy
  • sgnyyy
  • 2017-12-03 17:17
  • 312

【Unity3D游戏开发学习笔记】(四)一切都动起来—Animator组件的应用

一、Animation简介动画原本是指由许多连续的图片在人眼前面快速播放,肉眼因视觉残像产生错觉,而误以为画面活动的作品。 但在 Unity3D 中的“ Animation”【动画】 系统应该这样理解——用于为游戏者自动播放人物动作或自动演示物体运动路径、色泽、尺寸变化,以及事件触发的集成组件。 ...
  • nizihabi
  • nizihabi
  • 2015-10-10 15:03
  • 8712

Unity Animator混合树

1: 状态转换 :是在规定时间,或者某一条件下:从一个动作过渡到另一个动作,在两个不同的动作过渡用这个会比较有好的过渡效果。 2.   BlendTree 混合树: 一般混合两个相似的动作,它们可以通过控制权重来决定混合程度。 混合树创建步骤:1.右击出现creat state -&g...
  • u014761712
  • u014761712
  • 2017-02-06 10:43
  • 1557

Unity Animator与Animation对比

1. 动画支持上 老版动画Animation 自Unity4.3版本之后,不再支持材质属性的控制 新版动画Animator完美支持。 2. 内存占用,bundle大小方面 下图是将一个动画打包后,Unity EditorLog中显示的包体信息 Take001.anim是新版动画的animatio...
  • zww_liittle_boy
  • zww_liittle_boy
  • 2017-07-05 09:55
  • 242
    个人资料
    • 访问:3556289次
    • 积分:36084
    • 等级:
    • 排名:第136名
    • 原创:402篇
    • 转载:88篇
    • 译文:5篇
    • 评论:3425条
    个人说明
    联系方式:
    文章存档
    最新评论