zoukankan      html  css  js  c++  java
  • 关于Unity中新版动画系统的使用

    Mecanim动画

    1:旧版动画系统只能通过代码来控制动画播放,随着动画种类变多,代码复杂度也会增加,同时动画过渡也需要非常繁琐的代码控制,为了让有经验的动画师开发动画,unity推出了针对人物角色的Mecanim动画系统;
    2:Mecanim支持运动重定向(Retargeting)功能,即把动画从一个角色模型应用到另一个角色模型;
    3: Mecanim允许使用“肌肉”来控制不同骨骼的运动范围;觉得某个动画太夸张的时候,可以用"肌肉"来限制一下。
    4: Mecanim动画系统三要素:
      (1)Avatar: 从Mecanim系统的简化人形骨架结构(Unity抽象出来的骨架结构)到用户实际提供的骨架结构的映射(自己模型所对应的骨架结构);只要我们命名比较规范,这个映射是可以自动识别的。
      (2)Animator Controller: 动画控制器用来控制动画的播放和过渡条件
      (3)Animation Clip: 动画剪辑;

    Mecanim动画实例

    1.创建Unity工程和文件目录

    2.导入资源文件包body_anim.unitypackage(第56)

    3.打开Models文件夹,点击模型Boy,设置Rig---->Animation Tyoe---->Humanoid(人形动画)

    4.配置Avatar

      a: 导入模型后,将模型的动画模式配置成Humanoid模式。
        None: 无模式, Legacy: 旧版动画模式, Generic 其他动画模式, Humanoid 人形角色动画模式;
      b: 系统将会自动生成模型对应的Avatar文件, 并作为其子对象;展开模型Boy可以看到一个BoyAvatar。
      c: 大部分情况下Mecanim都能正确的生成Avatar文件,
        Configure这个前面会有一个勾,点击Configue,能查看到

        映射情况,如果有错误,点击Configue,手动做好人形骨骼的映射。

       

       点击Configure,Scene视图里面会呈现模型,绿色的一条一条的就是Unity抽象出来的骨架结构。右边Mapping就是映射的结果,没有绿色填充的就是美术没有设计这个骨骼。有红色的点就是没有映射成功的,可以手动拖进去。

      d:Mapping: Clear清除映射, AutoMap自动映射;
      e 如果骨骼绑定正确,但是角色姿势不对(不是标准的T形),
        在Scene中可看到消息“Character not in T-Pose”,解决此问题
        可通过Pose->Enforce T-Pose或旋转其它的骨骼。

        

      f:Muscle配置:对于过于夸张的一些动作,比如动画重定向过来的时候,小孩的动画用在大人身上,可以通过对骨骼限定范围来进行调整,让这个骨骼运动在这个范围内,这样,就不用重新制作动画;
        (1)点击Muscles & Settings栏

        

        (2)点击要限制的骨骼;

        (3)调整骨骼的运动范围的参数,旋转运动的幅度;

        

      g.配置完成后点击Done---->Apply

    5.把模型Boy拖进场景中,会自己挂载一个Animator的组件

     Controller属性放动画控制器

     Avator属性放映射的BoyAvator文件

    6.在res文件夹下创建一个动画控制器Create---->Animator Controller,叫做anim_ctrl,双击打开,可以用鼠标中键按下拖动背景

    7.动画控制器配置

      a:动画控制器anim_ctrl打开:Parameters是动画控制器所带的参数列表,Layers是当前的动画层

        

      b: 动画状态机
        (1) 动画状态机必然包含有3个动画状态单元 Any State, Exit, Entry;
        (2) 动画状态机可以包含多个动画状态单元;
        (3) 还可以包含子动画状态机;

        
      c: 动画状态单元的创建:

        在创建之前可以查看这个动画的效果,在AssetsAnimationsAnisForFight目录下,点击某一个,再点击Animation栏,下面的播放按钮可以播放。


        方法(1): Animator窗口中鼠标右键 在菜单中选择 Create State-->Empty;第一次创建的时候会被设置为默认动画状态并显示为黄色,Entry会直接指向它,

            再创建一个就不会是默认状态了显示为灰色,也可以在任意非默认单元上右键 Set As Default来设置默认的动画状态,同时只能有一个默认的动画状态。
        方法(2): 将动画文件拖入到Animator窗口,就是直接把AssetsAnimationsAnisForFightBoy@Idle拖进状态机视图中,会自动帮我们关联好Motion

        我们创建一个默认的动画状态单元叫idle,关联它的Motion属性,就是在AssetsAnimationsAnisForFightBoy@Idle下的idle文件,这个在面板中展开Boy@Idle才能看到。

        再创建一个动画状态单元叫jump,关联它的Motion属性,就是在AssetsAnimationsAnisForFightBoy@JumpLoop下的take 001文件,这个在面板中展开Boy@JumpLoop才能看到。

        测试:把jump设置为默认动画状态单元,关联控制器到Animator组件,运行一下,发现模型Boy可以播放动画。

        

      d: 过渡条件连接(从一个动画过渡到另一个动画):
        (1)将鼠标放在状态单元上,鼠标右键-->Make Transition,创建动画过渡条件,并再次点击在另一个状态单元上,完成过渡条件连接;

        

        (2)点击两个状态之间的连线,右边是一个过渡的效果,可以点击播放,也可以调整动画的融合效果,可以让第一个动画放完再放第二个,也可以放一半放第二个,可以拖动来调整。

          下面是一个过渡条件,默认是没有过渡条件的,也就是会自动跳转,我们可以添加条件。

          

        (3)在状态机左边的Parameters面板,里面的参数可以用来控制条件变量,Mecanim支持过渡参数类型Float, Int, Bool, Trigger,首先要创建一个参数,点击+号,选择int类型,名字叫anim_state,默认值是0

        (4)创建好参数后,再点击两个状态之间的连线,点击Conditions下面的+号,添加一个条件,就是以anim_state为条件变量,可以Greater、Less、Equals、Not Equal------>0的时候跳转

            (5)通过代码来控制动画跳转,创建一个脚本叫anim_test

    打开anim_test

    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class anim_test : MonoBehaviour {
    
        public Animator anim;//关联可以直接拖Boy模型节点到上面,会自动提取自己的Animator组件,是自己节点获得自己组件的另外一种方法
        // Use this for initialization
        void Start () {
            this.anim.SetInteger("anim_state", 0);//设置参数anim_state的值为0,我们之前也设置了当它等于0的时候会跳转
          //this.anim.SetFloat("anim_state", 1.0f);//其他类型的变量设置
    
        }
        
        // Update is called once per frame
        void Update () {
            
        }
    }

    8.配置完后运行,由于anim_state=0,又Equals---->0,就会一直播放跳跃的动作,我们可以实时地更改Parameters面板下的参数的值,从而实时运行查看动画的跳转路径。

    开发过程中:

    动画师调出一个角色动画以后,一个模型通过Avator把它映射成Unity简化版的人形骨骼,创建一个Anim Control,帮我们做好动画跳转的状态机。

    Anim Control里面还有Anim State,每个Anim State可以通过过渡条件来进行过渡和控制,通过修改过渡条件的变量Anim State可以达到控制动画的目的。动画条件过渡的时候也可以来控制动画缝合,全部都是由可视化来完成的。

    这样子,动画师只要调动画,不用写代码,程序员只要通过开关,设置Anim State的值,就能决定去播放哪些动画和切换动画。

  • 相关阅读:
    查看mysql版本的四种方法及常用命令
    newInstance和new的区别(good)
    Citrix 服务器虚拟化之六 Xenserver虚拟机创建与快照
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 排序
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 2的次幂表示
    Java实现 蓝桥杯 算法训练 前缀表达式
    Java实现 蓝桥杯 算法训练 前缀表达式
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7260335.html
Copyright © 2011-2022 走看看