900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > unity骨骼动画学习

unity骨骼动画学习

时间:2019-07-06 14:54:02

相关推荐

unity骨骼动画学习

unity骨骼动画学习

问题1: 为角色选择骨骼动画模式而非传统网格动画模式问题2: 曲线问题3: layer问题4:逆向运动学问题5 逆向动画学:末端节点动画问题6 混合树blender tree问题7 子状态

本文所有学习内容来自

夏村散人韩老师-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 updatevoid Start(){anim = GetComponent<Animator>();}// Update is called once per framevoid 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 updatevoid 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 framevoid 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参数。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。