一、创建动画

1.选中要添加动画的游戏对象
2.Window—>Animation->Animation

会生成两个文件一个是
.anim文件即动画文件
.controller动画控制器文件

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重


unity3D怎么给UI图片增加移动动画 unity如何添加动画_ci_02


(选中状态机 ,点击Window->Animation->Animator,即可进入状态机编辑,如下图)

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_03

二、认识Animation编辑面板

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_04

三、使用动画控制物体移动

1.在Animation编辑界面中点击Add Property

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_05


2.选择Position

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_06

3.添加需要修改的数据(图中的白线在哪,就表示你在那个帧修改数据,如果该帧没有Key则会自动添加一个Key)

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ide_07


(图中有误 不是秒的意思是帧的意思)

四、创建2D游戏中的精灵动画

方法一:直接将两张Sprite图片一起拉到Hierarchy

方法二:给对象添加Animator组件,在建立一个AnimationController(简称AC),然后将AC拖入Animator组件中的Controller中,打开Animation面板直接将Sprite拖入面板设置Key即可。

五、模型的三种动画导入设置

  • Legacy:比较古老的动画使用这个模式,该模式不支持Animator,使用的是Animation。
  • Generic:人形与非人形动画都可以使用的设置,支持Animator,不支持Animation。
  • Humanoid:仅人形动画使用,支持Animator,不支持Animation。如果是使用同一套骨骼的多个人形角色,则他们的动画是可以通用的。

六、动画切割

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ide_08


LoopTime:动画是否循环播放

LoopPose:循环播放时是动画更加平滑

CycleOffset:从原定的开始时间向后偏移多少秒,在开始播放动画

BakeIntoPose保持位置不受影响

七、StringToHash方法

将一个参数字符串转换成ID

private int SpeedID=Animator.StringToHash("Speed");
//这样在使用speed这个字符串参数的地方全部可以通过SpeedID代替,防止字符串写错从而不运行程序又不报错

八、1D混合树BlendTree

混合树有1D和2D。站立、跑动、这类只有速度差别的动画时,一般选用1D。

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ide_09


unity3D怎么给UI图片增加移动动画 unity如何添加动画_ide_10


Velocity X按照x轴的速度来控制

以上三个动画只需要设置speed的值就可以控制动画的切换

anim.SetFloat("Speed",Input.GetAxisRaw("Vertical")*4.1f);//乘上4.1f是因为input接受的范围是-1到1。而我们根据图中可以看到speed的取值范围应该在0-4.1左右。因此要乘上4.1

九、2D混合树

2D混合树的几种类型:

  1. 2D Simple Directional:此类型需要保证混合的动画运动方向都不相同
  2. 2D Freeform Directional:允许在某个运动方向上有多个动画,但要保证有一个动画在原点播放(例如:Idle动画)
  3. 2D Freeform Castesian:最好适用于动画的运动都处于同一方向,仅仅只有视野的转换(人物头的移动)。

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ide_11


(在使用2D混合树控制角色的转向和奔跑动作时,当Compute Positions选择为Velocity XZ时,角色的转向动作不明显

解决:这是可能是因为角色转向动画本身是通过Rotation来控制转向,对于xz轴的速度很小因此在Velocityxz模式中转向不明显,需要将ComputePositions调整为X position From->Angular Speed(Deg)即根据角度来控制转向)

十、Match Target

作用:当我们希望人物的动画能够贴紧某个位置的时候使用

public void MatchTarget (Vector3 matchPosition, Quaternion matchRotation, AvatarTarget targetBodyPart, MatchTargetWeightMask weightMask, float startNormalizedTime, float targetNormalizedTime= 1);
//按照顺序参数含义依次为:身体某个部位需要到达的位置,我们希望身体部位进行的旋转,用来作为匹配的身体部位,包含匹配位置和旋转的权重的结构,从动画的某个时刻开始,到动画的某个时刻结束
//例子
anim.MatchTarget(matchTarget,Quaternion.identity,AvatarTarget.LeftHand,new MatchTargetWeightMask(Vector3.one,0),0.32f,0.4f);
//以左手作为匹配点,动画从0.32f开始播放到0.4f结束,左手到达matchTarget的位置,自身不旋转

十一、角色控制器

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_12


适用于类人角色,添加上角色控制器后,会自动添加一个胶囊碰撞体。

参数说明:

  • Slope Limt:坡度限制,代表该角色最多能爬上多陡的坡度
  • Step Offset:台阶高度,代表该角色最多能迈上的台阶高度。
  • Skin Width:皮肤厚度,决定了两个碰撞体可以相互渗入的深度,值过大导致抖动,过小导致卡住,一般为Radius的10%
  • Min Move Distance:最小移动距离,大多数情况下设置为0(如果角色的最小移动距离小于该数值,则角色不会移动,避免抖动)
  • Center:决定了胶囊碰撞体在世界坐标中的位置
  • Radius:半径,胶囊碰撞体的长度半径,同时也决定了碰撞体的宽度。
  • Height:胶囊碰撞体的高度。

十二、Animotar具有多层Layer时

多层动画相互影响的类型有:

  • Override:重写
  • Additive:附加

(一)、Override

当有多层Layer时,如果选择的重写模式,那么动画会根据每层的比重来渲染。

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_13

例子,假设BaseLayer控制角色的移动,HoldLog控制角色的抬手动作。

(当Hold Log比重为0时候角色不抬手,正常的奔跑走路跳跃,如下图)

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_14


当比重上升时,HoldLog层的抬手动作逐渐显现,角色的移动速度变慢

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ci_15


(当HoldLog层重写比例为1时,BaseLayer层所有功能失效,角色不在移动,只显示抬手动作,如下图)

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ci_16


这两层动画一层为脚步,一层为手部,那么如何在Override模式下使得两层动画互不影响都显示出来呢?

——使用AvatarMask

(红色的部位将不会被重写)

unity3D怎么给UI图片增加移动动画 unity如何添加动画_ci_17


unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_18

十三、使用IK动画设置左手到目标位置

需要将类人角色的左右手定位到某个游戏物体的边缘(形成手持的状态)

1.首先需要获取到游戏物体左右边缘的点的位置(通过设置两个空物体通过空物体定位)

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_19


2.在手持游戏物体的这个动画层上勾选上IKpass

unity3D怎么给UI图片增加移动动画 unity如何添加动画_权重_20


3.调用内置函数OnAnimatorIK

private void OnAnimatorIK(int layerIndex) {
        int weight=anim.GetBool("isHoldLog")?1:0;
        //设置权重参数,根据是否举起物体参数设置为0或1;
        anim.SetIKPosition(AvatarIKGoal.LeftHand,leftHand.position);
        //设置左手的位置参数和leftHand的位置相同
        anim.SetIKRotation(AvatarIKGoal.LeftHand,leftHand.rotation);
        //设置左手的旋转参数和leftHand的位置相同;
        anim.SetIKPositionWeight(AvatarIKGoal.LeftHand,weight);
         //设置左手的位置参数的权重,权重越大越靠近设置的位置;
        anim.SetIKRotationWeight(AvatarIKGoal.LeftHand,weight);
         //设置左手的旋转参数的权重,权重越大越靠近设置的位置;
    }