unity骨骼动画学习

本文所有学习内容来自
夏村散人韩老师-unity入门教程


问题1: 为角色选择骨骼动画模式而非传统网格动画模式

解决方案:
在模型的inspector里面可以找到rig选项,把animation type从legacy改为humanoid,实现类人骨架动画系统。这个使得角色动画的重定向变得容易。
apply-config可看见。

接下来在standard assets中导入character

问题2: 曲线

描述:希望人物边吹泡泡边走,泡泡大小与跑步速度相关

解决方案:
曲线用于打通动画时间线和参数的隔阂。可以用脚本读取到当前动画播放状态。
取消根节点运动(Apply Root Motion)可以让角色原地跑步

创建新的Animator Controller物体,为它添加parameter。叫做curve value。再为它创建一个空状态,叫curve。

在humoid run的运动动作来源中观察inspector,其中可以为这个动作添加curve,命名要和Animator Controller中的参数(parameter)一致。比如curvevalue。为其选择合适的曲线。

创建sphere物体。在角色子结构中寻找到头部,把bubble拖拽为头部的一个子物体。

问题3: layer

描述:希望人物达到按下鼠标就射击,并且是边走边射击,或者边跑边射击

解决方案:
为Animator Controller创建新的layer并命名为ArmUp, 创建空状态并将动作Jump拖拽到该状态中。修改walk层和ArmUp层所占的权重,可以调整人物动作。
要分身体部位进行控制时(举手,腿正常走路):使用mask进行遮罩
除了override之外可以选叠加addictive。Sync功能可以直接使用其它层的动作逻辑,但是其中的动作都可以改变。比如走路跑步和受伤跑步的姿势的不同。

也可以用脚本控制layer的权重,实现鼠标按下增加抬手权重。、

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

public class Layer : MonoBehaviour
{
    public float speed = 1f;
    private Animator anim = null;

    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();


    }

    // Update is called once per frame
    void Update()
    {
        if (Input.GetMouseButton(0))
        {
            float w = anim.GetLayerWeight(1) > 1 ? 1 : anim.GetLayerWeight(1) + speed * Time.deltaTime;
            anim.SetLayerWeight(1,w);
          
        }
        else
        {
            float w = anim.GetLayerWeight(1) < 0 ? 0 : anim.GetLayerWeight(1) - speed * Time.deltaTime;
            anim.SetLayerWeight(1, w);
        }


    }
}

问题4:逆向运动学

描述:我们前面介绍的动画是利用现有的动画片段或者是外部的文件,或者说我们内部利用场景化的方式,再unity编辑器下新生成的这个动画。我们叫做前向运动性。什么意思呢?就是每个骨骼的配置状态都是按照他的父亲骨骼,一层一层啊,来演算出来的。那么,但是有有些情况下我们需要。用到一个叫做逆向运动学。比如这个角色够一个东西,他的手,这个末端节点需要触碰到某个位置。那就至于说其他。骨骼这边应该怎么配置呢?需要有一种数学方法给他演算出来还得比较自然,还有些时候比如说我的脑袋是吧,眼睛看什么地方形成一个动画,它会移动。但是呢。我们并没有动画师来做出来的,我是按照你最终的它的朝向也好,它的位置也好,这个终端节点来逆向演算出来,其他节点应该如何配置。

解决方案:
注意在属性中点上IKpass
OnAnimatorIK()是进行IK解算时会自动调用的函数

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


[RequireComponent(typeof(Animator))]
public class IK : MonoBehaviour
{

    protected Animator anim;


    // Start is called before the first frame update
    void Start()
    {
        anim = GetComponent<Animator>();
    }

    void OnAnimatorIK()
    {
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        Plane plane = new Plane(Vector3.up, transform.position);
        float enter = 0f;
        if (plane.Raycast(ray,out enter))
        {
            Vector3 target = ray.GetPoint(enter);
            anim.SetLookAtPosition(target);
            anim.SetLookAtWeight(1f);
        }

    }


    // Update is called once per frame
    void Update()
    {
        
    }
}

问题5 逆向动画学:末端节点动画

在这里插入图片描述

问题6 混合树blender tree

描述:希望角色在猫腰走、走、跑和左转、右转动作之间自然过渡
解决方案:
transition是两个动画之间平滑过渡
blender tree则是多个动画作用于同一角色
在动画层中创建新blender tree,为之添加motion。为这个tree取名字叫speed。blend type为1.融合了走路、跑步、猫腰走。通过调整speed可以调整三个状态之间的过渡。

blend type为direct时,用3个参数控制3个状态时,可以融合三个状态,共同控制这个角色。点击Normalized Blend Value之后姿态会变得更自然。

blend type为2D Freeform Cartesian时,会将运动布点到二维平面作为关键点,任意点的姿态由周围相关的关键点插值得到。使用速度和转向两个参数作为坐标轴。speed和turn。然后为这个blender tree添加上向左转的走路,向右转的走路和向左跑步向右跑步的动画。分别设置这些动画的speed和turn值。之后就可用脚本操作speed和turn值来控制角色的左右转并跑步了。

使用多平台用户输入支持。CrossPlatformInput.
在这里插入图片描述

问题7 子状态

一系列状态来组成一个状态。
可以用trigger类型的参数来控制有条件的动作转换。比如在idle和jump动作之间make的transition里的condition栏加上类型为trigger的参数。
然后用脚本控制这个trigger参数。

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值