• Unity中的动画系统和Timeline(3) 混合树和动画匹配


    混合树

    前面我们通过在Animation界面添加单独的动作来控制动画,这样做比较麻烦,每个单独的属性,比如站立,奔跑等,都需要单独的代码来控制。现在我们可以通过使用混合树,其基本思想是将相近的动画混合起来,使用一个参数控制。比如,行走和奔跑,我们都使用参数“Vertical”控制,使用混合树后,系统会检测,当这个值在某个区间会播放行走动画,在某个区间又播放奔跑动画。

    混合树的创建方法如下:

    创建好后如下:

     Blend Type:混合类型

    Parameters:控制参数

    Compute Positions:计算位置

    注意:看Motion中的参数,比如Run,Y值表示前进方向,这里的控制值为4点几,所以在代码中也要乘以这个值!!!

    混合类型之2D Blending混合类型:

    2D Simple Directional:融合动画,动画的方向不能相同

    2D Freform Directional:融合动画,动画的方向可以相同。使用这种方式必须保证一个动画位于(0,0)点

    2D Freform Cartesian:融合动画,所有动画在同一方向,参数X和Y代表不同类型,比如X代表速度,Y代表旋转

    动画匹配(Match Target)

    动画匹配可以使游戏中的动画效果更好,比如,一个角色在翻墙的时候使用翻墙动画,需要左手撑在墙上越过墙。不适用动画匹配,效果就是原始动画中看到的那样。而使用动画匹配后,角色在翻墙的时候可以将左手与墙面进行贴合,更加逼真。

    下面是一段角色翻墙的代码:

        private void ProcessVault()
        {
            bool isVault = false;
            if (anim.GetFloat(speedZID) > 3 && anim.GetCurrentAnimatorStateInfo(0).IsName("Locomotion"))
            {
                RaycastHit hit;
                if (Physics.Raycast(transform.position + Vector3.up * 0.3f, transform.forward, out hit, 4))
                {
                    if (hit.collider.tag == "Obstacle")
                    {
                        if (hit.distance > 3)
                        {
                            // 计算匹配位置
                            Vector3 point = hit.point;
                            point.y = hit.collider.transform.position.y + hit.collider.bounds.size.y + 0.07f;
                            matchTarget = point;
                            isVault = true;
                        }
                    }
                }
            }
            anim.SetBool(vaultID, isVault);
    
            // 动画转换期间匹配无效,所以要判断一下
            if (anim.GetCurrentAnimatorStateInfo(0).IsName("Vault") && anim.IsInTransition(0) == false)
            {
                //指定了匹配的位置、角度、身体的具体部分、权重、匹配开始及匹配结束的时间
                anim.MatchTarget(matchTarget, Quaternion.identity, AvatarTarget.LeftHand, new MatchTargetWeightMask(Vector3.one, 0), 0.32f, 0.4f);
            }
        }

    注意:在使用MatchTarget函数的时候,权重的第一个参数表示位置,第二个坐标表示旋转。开始匹配和匹配结束时间,指的是这两个时间在整个动画中的百分比位置,而且结束时间表示的是匹配好的时间。比如,上面例子中的结束时间指的是手掌的墙壁完全贴合的时间。

  • 相关阅读:
    翻硬币
    排队打水问题
    连续邮资问题
    Linux-AWK命令
    SpringInAction第五章总结 使用配置属性
    SpringInAction 第四章笔记 保护Spring
    SpringInAction第三章笔记 --使用数据
    SpringInAction第二章笔记
    SpringInAction第一章笔记
    SpringBoot启动任务
  • 原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798689.html
Copyright © 2020-2023  润新知