zoukankan      html  css  js  c++  java
  • 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函数的时候,权重的第一个参数表示位置,第二个坐标表示旋转。开始匹配和匹配结束时间,指的是这两个时间在整个动画中的百分比位置,而且结束时间表示的是匹配好的时间。比如,上面例子中的结束时间指的是手掌的墙壁完全贴合的时间。

  • 相关阅读:
    Codeforces 1265A Beautiful String
    1039 Course List for Student (25)
    1038 Recover the Smallest Number (30)
    1037 Magic Coupon (25)
    1024 Palindromic Number (25)
    1051 Pop Sequence (25)
    1019 General Palindromic Number (20)
    1031 Hello World for U (20)
    1012 The Best Rank (25)
    1011 World Cup Betting (20)
  • 原文地址:https://www.cnblogs.com/lmx282110xxx/p/10798689.html
Copyright © 2011-2022 走看看