(Animator详解二)Unity Animator的基本属性

在Inspector下

Animator的第一项为状态机的名称(注意:这里的名称不是动画名称)


Tag 当前动画的Tag标签,可以通过Tag值来处理一些逻辑


Motion:动画片段的名称


Speed:动画的播放速度:1表示正常播放,   

                                        speed >1 表示加速   0< speed<1,表示减速

                                        speed < 0 表示倒放  

动画的speed一般是不可更改的,如果需要更改需要勾选下方Parameter 


Multiplier  会被激活,此时动画的速度会是与multiplier变量的乘积 是float变量


Motion Time :表示播放动画片段的特定时间点 0~1  0代表动画片段的开始,1表示结束,也是需要关联一个float变量   比如0.5 表示从动画的中间播放  (和Cycle Offset有一定区别)


Mirror:表示将动画镜像(只对人形动画管用),需要关联一个bool类型的变量


Cycle Offset :动画偏移,范围是0~1 需要关联一个float变量 值为0.5f 表示从动画的中间播放,(只是更改了一下播放的位置,并不是分割,播放的动画还是完整的)


Foot IK: :IK的动画矫正机制  

这个属性需要特殊说明一下,在我们使用了Avatar替身系统之后,我们角色的骨骼会出现一些手和脚偏移的情况,unity 为了保证骨骼的正确性,提前骨骼系统下正确的手脚位置记录下来,放在了4个IK Goal上,如下图所示,手部和脚部红色的球,unity认为使用原来的骨骼系统时,角色的手应该放在这个位置,   手肘处是IK Hint 可以通过它来防止肘部关节在运动时出现的一些奇怪的扭曲,

Foot IK的作用就是把我们脚部的实际位置向这里的IK Goal的位置拉近一点,只是略微调整手脚动画的位置,它可以一定程度上改善手脚部动画的不自然,但不一定能满足高质量的动画需求

为了使用IK ,在动画层级这里需要勾选IK Pass,这样我们就可以在脚本里调用相关的IK方法了。

   
    //IK goal的权重范围是0~1  数值越大 脚部的位置越靠近IK goal
    [Range(0,1)] public float weight = 0;

    private void OnAnimatorIK(int layerIndex)
    {
        //设置右脚的值为零点位置
        animator.SetIKPosition(AvatarIKGoal.RightFoot, Vector3.zero);
        //设置右脚的权重
        animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, weight);
    }

如果加上一些射线检测 我们可以根据它开发出脚步适应地形的效果


Write Defaults:写入默认值,unity官方API解释为  AnimatorStates 是否为其运动执行未动画化的属性写入默认值    (???看不懂,跟没说一样???)

在查了一些资料后,这里解释一下unity 的生命周期OnEnable 在运行开始时,unity会执行一次OnEnable 此时unity会遍历角色对象下所有的脚本,以及animator里所有的动画片段 ,我们知道AnimationClip(动画片段)是描述了物体的位移、旋转以及缩放属性(当然 动画也可以描述物体的材质变化 以及脚本属性) 这里举个例子,比如我们做一个简单的开门关门动画,在开始运行时,unity 会遍历OpenDoor和CloseDoor的动画属性,如果更改了某些参数,就把这个参数记录下来,未更改的参数写入默认值,有兴趣的小伙伴参考一下这篇文章,写的很详细

[Unity] AnimatorStates中的write defaults详解_Rickshao1993的博客-CSDN博客


这里在额外说一下一些脚本API

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

public class NewBehaviourScript : MonoBehaviour
{
    public Animator animator;
   
    public AnimatorStateInfo currentStateInfo;
    // Start is called before the first frame update
    void Start()
    {
        animator = character.GetComponent<Animator>();
//通过层索引值获取当前状态机的动画状态
        currentStateInfo = animator.GetCurrentAnimatorStateInfo(0);
//通过层名称获取当前状态机的动画状态

        currentStateInfo = animator.GetCurrentAnimatorStateInfo(animator.GetLayerIndex("Base Layer"));
     
    }

    void Update()
    {
     
        
    }
    
}

AnimatorStateInfo动画状态信息,可以根据索引值和名字来获取当前层播放的动画,当然这里只是演示,正确的用法应放在Update() 里实时检测当前的动画

猜你喜欢

转载自blog.csdn.net/qq1084327456/article/details/127625336