动画编辑(四)——Any State

作者:追风剑情 发布于:2017-5-13 21:01 分类:Unity3d

Any State所指向的转换只要满足条件就会立即转换,而不管当前处于什么状态。

例如

11111.png22222.png

只要isState2为true就会立即转到State2状态,而不管当前是处于State1还是其他任何状态。

Has Exit Time: 如果不勾上,就不会自动转到下一个状态。

Transition Duration: 这个时间会使动画提前过渡到下一个状态,这会导致状态最后设置的动画事件不会被触发。所以动画事件要设置在开始过渡之前。

222.png
Interruption Source:
None: 当动画处于过度状态时,无法打断。
Current State: 当发生A->A2时,只有A->A1和A->A3可以打断A->A2,其他转换则不能打断。
Next State: 当发生A->A2时,只有A2->B1和A2->B2可以打断A->A2,其他转换则不能打断。
Current State Then Next State: 当打断发生时,先考虑当前状态,再考虑下一个状态。
Next State Then Current State: 当打断发生时,先考虑下一个状态,再考虑当前状态。
Orered Interruption: 勾上之后,只能是高优先级的转换打断低优先级的转换。
1111.png
例如:当正在发生A->A2时,如果Ordered Interruption=True且Interruption Source=Current State,A->A1可以打断A->A2,A->A3不能打断A->A2。如果Ordered Interruption=False且Interruption Source=Current State,则A->A1和A->A3都可打断A->A2。
注意:当发生打断时,状态机会从当前过度点直接向下一个状态转换,不会发生动画跳帧,过度更平滑。

这里需要去掉Can Transition To Self后面的勾,避免不停的自己转到自己造成动画不停抖动。

1111.png

Trigger: 发生一次转换后会被自动重置为false。
//频繁切换状态时,需要先重置上一个状态,否则有可能无法切换到下一个状态,导致动画没能按预期播放 m_Animator.ResetTrigger("pre_state");
m_Animator.SetTrigger("next_state");

1111.png
Mute: 勾上之后,会禁止转换到此状态。
Solo:勾上之后,允许转换到此状态。
Mute与Solo同时勾上等效于只勾选上Mute

222222.png

利用多个层同时播放不同的动画剪辑(即,叠加播放),例如:一边跑一边射箭
11111.png
同时播放Base Layer与Layer2的动画,利用Weight设置播放权重。

11111.png

Blending(混合)
Additive: 叠加,不同层的动画同时播放,Weight只影响当前层的播放权重。当Weight=1时,两个层的当前状态动画完全播放。
Override: 融合,不同层的动画同时播放,Weight会影响Source层的播放比例。当Weight=1时,Source Layer的动画将不会播放。
Sync: 将Base Layer的状态逻辑同步到Layer2层,Timing=true表示当Base Layer与Layer2层播放同一个状态时采用Layer2状态的动画时长。需要为Layer2层的状态重新指定Motion。如图

2222.png

IK Pass: 启用反向动力学。可在 Mecanim 中用于已正确配置的任何人形Avatar骨骼。要为角色设置 IK,通常要在场景周围放置与角色互动的对象,然后通过脚本(尤其是,诸如 SetIKPositionWeight、 SetIKRotationWeight、 SetIKPosition、 SetIKRotation、 SetLookAtPosition、 bodyPosition、 bodyRotation之类的 Animator 函数)来设置 IK。
官方文档: https://docs.unity3d.com/cn/2019.4/Manual/InverseKinematics.html

Mirror: 镜像。勾上之后,左右反向。例如:原来是用左手打招呼,现在会变成用右手打招呼。

11111.png

Multiplier为Motion播放速度的乘法因子,需绑定一个浮点参数。

Write Defaults: 每个动画都由许多动画曲线组成,两个动画之间的过渡,就是曲线插值。例如,动画A过渡到动画B,A中有一条动画曲线Z,但B中没有Z。勾选上此属性,动画B就使用动画A播放前的Z值作为默认值,过渡过程中正常插值。未勾选此属性,动画B会继承动画A播放后修改过的Z值,过渡过程中不对Z进行插值。

//参见  https://blog.csdn.net/rickshaozhiheng/article/details/77838379 https://www.cnblogs.com/Esfog/p/Unity_WriteDefaults.html //让动画在隐藏之前停留在默认动作的第1帧
//注意:需要在状态Inspector中勾上Write Defaults
animator.Crossfade("DefaultPose", 0f); //过渡到默认状态
animator.Update(0f); //让默认状态播放一下
go.SetActive(false); //隐藏动画对象

判断当前正在播放的状态

//获取第0层的动画状态信息
AnimatorStateInfo info = animator.GetCurrentAnimatorStateInfo(0);
//判断当前播放的动画是否为Run
if (Animator.StringToHash("Base Layer.Run") == info.fullPathHash)
//if (info.IsName("Run"))
{
}

创建一个新的Avatar Mask
Assets/Create/Avatar Mask
11111.png

为状态添加行为脚本
11111.png
可以为状态添加继承StateMachineBehaviour的脚本代码

设置哪些部位不受动画影响(红色部位不播放动画)

11111.png

查看模型轴点、质量重心

11111.png

Curves(动画曲线)

2222.png11111.png


using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class Player : MonoBehaviour
{
    public Animator animator;

    void Update()
    {
        if (animator == null)
            return;
        float WalkCurve = animator.GetFloat("WalkCurve");
        Debug.Log("WalkCurve="+ WalkCurve);
    }
}


33333.png

导入的模型成在的问题都会显示在Import Message

11111.png

根运动(Root Montion)

111111.png

Root Transform参数决定动画对根节点的影响。选中Bake Into Pose后,此项将不会对根节点产生影响。loop match为绿色,表示动画的最后一帧与第一帧是相同的,即首尾衔接,如行走动画。官方文档 RootMotion

注意:Animator.gravityWeight 通过 Bake Into Pose 位置 Y 驱动。启用时,如果 disabled = 0,则 gravityWeight = 1。在状态之间过渡时会为剪辑混合 gravityWeight。


标签: Unity3d

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号