目录

1D动画混合树

2D动画混合树

动画IK控制

关于OnAnimatorIK和OnAnimatorMove两个函数的理解

动画目标匹配

使用步骤及必须注意事项

导航寻路系统:

关于最近玩2D物理系统的一些教训:


1D动画混合树

动画混合是允许合并多个动画来使动画平滑混合

在Animator Controller窗口 右键->Create State->From New Blend Tree
1D混合就是通过一个参数来混合子运动

2D动画混合树

也就是多了一个控制动画混合的参数

进入混合树后可以选择Blend Type 为2D混合

动画IK控制

使用IK控制人物前提:在动画设置中打开Ik Pass 选项

IK在游戏开发中的应用

      1.拾取某一件物品  

      2.持枪或持弓箭瞄准某一个对象等等

关于OnAnimatorIK和OnAnimatorMove两个函数的理解

我们可以简单理解这两个函数是两个和动画相关的特殊生命周期函数  

 他们在Update之后LateUpdate之前调用    

 他们会在每帧的状态机和动画处理完后调用  

 OnAnimatorIK在OnAnimatorMove之前调用

 OnAnimatorIK中主要处理 IK运动相关逻辑  

  OnAnimatorMove主要处理 动画移动以修改根运动的回调逻辑  

  他们存在的目的只是多了一个调用时机,当每帧的动画和状态机逻辑处理完后再调用

基本套路就是:先设置权重,再设置位置/角度

private void OnAnimatorIK(int layerIndex)     {  

      //头部IK相关  

      //weight:    LookAt时全局权重0~1    

    //bodyWeight:    LookAt时身体的权重0~1    

    //headWeight:   LookAt时头部的权重0~1  

      //eyesWeight:   LookAt时眼镜的权重0~1  

      //clampWeight:0表示角色运动时不受限制,
1表示角色完全固定无法执行LookAt,
0.5表示只能够移动范围的一半 

   animator.SetLookAtWeight(1, 1f, 1f);          

  animator.SetLookAtPosition(pos.position);      //直接设置看向的位置   

animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);     
    
animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);   
      
animator.SetIKPosition(AvatarIKGoal.RightFoot, pos2.position);  
       
animator.SetIKRotation(AvatarIKGoal.RightFoot, pos2.rotation);    

}

结合3D数学利用IK使人物头部随鼠标移动而移动:

unity3d角色动画的关键技术 unity3d人物动画_权重

动画目标匹配

动画目标匹配主要指的是

 当游戏中角色要以某种动作移动,该动作播放完毕后,人物的手或者脚必须落在某一个地方         比如:角色需要跳过踏脚石或者跳跃并抓住房梁

那么这时我们就需要动作目标匹配来达到想要的效果

使用步骤及必须注意事项

 1.找到动作关键点位置信息(比如起跳点,落地点,简单理解就是真正可能产生位移的动画表现部分)

2.将关键信息传入MatchTargetAPI中

  调用匹配动画的时机有一些限制  

  1.必须保证动画已经切换到了目标动画上        

2.必须保证调用时动画并不是处于过度阶段而真正在播放目标动画        

如果发现匹配不正确,往往都是这两个原因造成的  

3.需要开启Apply Root Motion

void Update()
    {
        if( Input.GetKeyDown(KeyCode.Space) )
        {
            animator.SetTrigger("Jump");
        }
    }

    private void MatchTarget()
    {
        //参数一:目标位置
        //参数二:目标角度
        //参数三:匹配的骨骼位置
        //参数四:位置角度权重
        //参数五:开始位移动作的百分比
        //参数六:结束位移动作的百分比
        animator.MatchTarget(targetPos.position, targetPos.rotation, AvatarTarget.RightFoot, new MatchTargetWeightMask(Vector3.one, 1), 0.4f, 0.64f);
    }

导航寻路系统:

unity3d角色动画的关键技术 unity3d人物动画_游戏引擎_02

新版Unity创建Navigation:Windows->Package Manager->切换Unity Registry ,搜索ai,导入AI Navigation

烘焙好地形后,可以添加导航网格寻路组件(Nav Mesh Agent)

引用命名空间UnityEngine.AI

最重要的俩参数:

 agent.SetDestination()    //设置导航的目的地

  停止寻路    agent.isStopped = true;

实现鼠标点哪人物导航到哪:

void Update()
    {
        if( Input.GetMouseButtonDown(0) )
        {
            RaycastHit hit;
            if( Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit ) )
            {
                print(hit.collider.name);
                agent.isStopped = false;
                //让对象朝目标点移动 先生成行进路径 然后再移动
                agent.SetDestination(hit.point);
            }
        }

        if( Input.GetKeyDown(KeyCode.Space) )
        {
            agent.isStopped = true;
        }
    }

外链接组件:Nav Mesh Link

用途是在于两个有间断的平台之间,可以选择添加这个组件实现人物导航时在两个平台之间的跳跃

可以设置起点和终点

导航网格障碍组件:Nav Mesh Obstacle

unity3d角色动画的关键技术 unity3d人物动画_权重_03

如果是禁止不动的物体就给Carve勾选上,比方说一块石头拦在了必经之路上,勾选后即使你选择导航到对吗,人物也会停止在石头面前,否则人物会出现一种类似于怼墙一直跑的效果

关于最近玩2D物理系统的一些教训:

1.Edge Collider2D 真不能乱用,这个碰撞器即使你给它围成一个圈,他圈内部仍然不会产生碰撞或触发,他只会在边缘那一薄薄的线上产生检测,虽说如此,但如果我们拿什么Box 和它去碰撞肯定还是检测得到得,最忌讳得就是用Edge Collider 得物体去碰撞Edge Collider 的物体,这样大概率(完全)不会产生碰撞检测,即使将rigidbody中的检测方式从离散检测改为持续检测也依旧不行