本文详细分析了AnimatorController中动画切换过渡问题,即Translation过渡及hasExitTime的问题。方法为对实际项目中的所有情况进行分类,规划逻辑图,可视化分析解决这些问题。

AnimatorController 动画机控制器

  • 功能:对已有的Animation片进行逻辑连接,连接过渡方式为Translation有向线段,其切换方法包括启用hasExitTime关闭hasExitTime
  • Translation:通过设置Parameters的参数进行切换过渡,可单线上有多条件,也可单方向上有多单条件线。选中任意Translation可在Inspecter窗口看到两个动画片段和区间的窗口,及Setting参数表
    • 两个动画片段含义:表示在公共时间轴(上方刻度表)上,两动画的先后顺序
    • 左右标记的深蓝区间:Translation过渡时长,两动画片的过渡在此区间进行(动画的混合由Unity自动处理)
    • hasExitTime:是否有退出时间。简单理解:有表示等待当前动画进行完才可进行下一个动画;无表示可以立即打断当前动画并播放下一个动画

项目实战

  • 背景:存在idle、idle_2、attack_1、attack_2、attack_3动画片段,我们要实现三连击的攻击效果。我们仅关注几个attack的切换,其中

    • attack_1->attack_2:关闭hasExitTime,Translation未超
    • attack_2->attack_3:开启hasExitTime,Translation未超

AnimatorController:

attack_1->attack_2(左)、attack_2->attack_3(右)的Translation:

1. 关闭 has exit time

关闭has Exit Time:无退出等待时间,立即开启下一动画

  • 情况一:当attack_1正常运转,在左标记前达成转行条件

    • 立即开启Translation(而不是等待运行到左标记)和attack_2,三者并行运转

      • 若Translation还在运行中,attack_1却先运行完,代表当前动画片attack_1运行完(代码:(stateInfo.IsName("attack_1") && stateInfo.normalizedTime > 1)) == true ),会对逻辑上的判断造成影响,这种情况非常容易出错
      • 若attack_1还在运行,Translation却先运行完,则立即停止attack_1片段。逻辑正常
    • 此后整体动画全权由attack_2运转
  • 情况二:当attack_1正常运转,在左边标记后(左右标记中或是右标记后)达成转换条件
    • 立即开启Translation和attack_2,三者并行运转

      • 若Translation还在运行中,attack_1却先运行完,代表当前动画片attack_2运行完,结果同上
      • 若attack_1还在运行中,Translation却先运行完,则立即停止attack_2片段。逻辑正常
    • 此后整体动画全权由attack_2运转

逻辑图:

项目实例图:左标前达成(先),左标后达成且Translation后完成(后)

2. 开启 has exit time

当has exit time:有退出等待时间,需等待目前动画完成到一定阶段才可切换至下一动画。过程:

  • 情况一:attack_2正常运转,若在左标记前达成转换条件

    • 等待attack_2中动画片进行到左标记,开启Translation过渡和attack_3动画,,三者动画并行运转

      • 若Translation还在运行中,attack_2却先运行完,代表当前动画片attack_2运行完(代码:(stateInfo.IsName("attack_1") && stateInfo.normalizedTime > 1)) == true ),会对逻辑上的判断造成影响,这种情况非常容易出错
      • 若attack_2还在运行,Translation却先运行完,则立即停止attack_2片段。逻辑正常
    • 此时整体动画全权由attack_3运转;
  • 情况二:attack_2正常运转,若在左标记后达成条件
    • 无论是在标记期间或是右标记后达成条件,再也无法触发Translation转换,因为可过渡时间片已经错过了

逻辑图:

项目实例图:左标前达成(先),左标后达成(后)


总结

Translation内左右标记问题:

  • 左右标记范围含义

    • Translation时长,两个动画的过渡时间长度
  • 左右标记位置含义
    • 对于当前Animation:左标记表示开启Translation和下一Animation的时间点;右标记表示当前动画片所能进行到的最晚时间点
    • 对于下一Animation:左标记为当前动画开启时间点,右标记为当前动画全权运转时间点
    • 通俗解释:何时转换、转换多久、转换时两动画所占比例
  • 区间意义
    • 例如attack_1和attack_2过渡的时间片段,过渡期的动画由Unity根据attack_1和attack_2动画混合而成,因此所谓三动画并行执行,本质为执行Translation的混合动画。其外需要注意:过渡期间仍处于attack_1,代码就是:stateInfo.IsName("attack_1")==true,仅当Translation结束才算处于attack_2

Translation后于Animation错误问题:

该错误直观上看就是两动画和Translation时间先后问题,数字上看就是Translation首尾点、区间大小、条件达成时机。因此解决办法就围绕这几点,此处给出几点建议:

  • Translation右标记最好 <= 前Animation末端,也就是说Translation不要超出动画长度
  • 最好在左标记点前达成转换条件,以便我们对转换过程进行掌控
  • AnimatorController的设置不是唯一途径,代码操控、动画内插入事件等,都可以较好辅助我们实现安全的动画切换

参考

Unity - HasExitTime用法的更多相关文章

  1. [开发ing] Unity项目 - Hero英雄

    目录 游戏原型 项目演示 绘图资源 代码实现 技术探讨 参考来源 游戏原型 游戏介绍:这是一款横版类魂游戏,玩家将操控Hero,在诸神黄昏的墓地中,挑战源源不断的敌人,以及近乎无敌的强大boss 灵感 ...

  2. 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity

    回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...

  3. mixamo fuse三维角色制作

    软件下载: http://www.cgtsj.com/cg/yj/1302/index.html 资源名称: Mixamo Fuse三维角色制作软件V1.3版 本站编号:  YJ1302 百度网盘:下 ...

  4. Unity LOD-Level of Detail(多层次细节)用法教程

    Unity LOD 多层次细节 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

  5. Unity射线检测的用法总结

    RayCast 射线检测 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  6. Unity 灯光探针用法教程

    Unity 灯光探针用详解 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  7. Unity反射探针用法教程

    Unity 3D反射探针 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享.心 ...

  8. Unity 项目中委托Delegate用法案例

    Unity中Delegate的用法场景 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar - ...

  9. Unity 3D UGUI Toggle用法教程

    UGUI Toggle用法教程 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分 ...

随机推荐

  1. Mac 安装python 3.*新版本的详细步骤

    Mac 系统自带python,不过自带的python版本都是2.*版本.虽然不影响老版本项目的运行, 但是python最新的3.*版本的一些语法与2.*版本并不相同,我们不论是学习还是使用,当然用最新 ...

  2. VMbox 安装 LInux系统流程

    STEP 1 文件--新建---(自定义高级)---(默认设置)---(稍后安装系统)---(Linux+选择版本)---(虚拟机名字+存放位置)---(处理器2+核数2)---(虚拟机内存)2G一般 ...

  3. Spring Boot (六): 为 JPA 插上翅膀的 QueryDSL

    在前面的文章中,我们介绍了 JPA 的基础使用方式,<Spring Boot (三): ORM 框架 JPA 与连接池 Hikari>,本篇文章,我们由入门至进阶的介绍一下为 JPA 插上 ...

  4. intellij idea 2018 激活

    http://idea.toocruel.net http://active.chinapyg.com/ 2018-8-6可用 http://xdouble.cn:8888/ 2018年7月11号 测 ...

  5. 【django】分页

    分页 1.简单分页 from django.conf.urls import url from django.contrib import admin from app01 import views ...

  6. Maven 梳理 -聚合与继承

    一.聚合 如果我们想一次构建多个项目模块,那我们就需要对多个项目模块进行聚合 1.1.聚合配置代码 1 <modules> 2 <module>模块一</module&g ...

  7. zookeeper 都有哪些使用场景?

    面试题 zookeeper 都有哪些使用场景? 面试官心理分析 现在聊的 topic 是分布式系统,面试官跟你聊完了 dubbo 相关的一些问题之后,已经确认你对分布式服务框架/RPC框架基本都有一些 ...

  8. Spring BeanDefinition的加载

     前面提到AbstractRefreshableApplicationContext在刷新BeanFactory时,会调用loadBeanDefinitions方法以加载系统中Bean的定义,下面将讲 ...

  9. k阶斐波那契数列fibonacci第n项求值

    已知K阶斐波那契数列定义为:f0 = 0,  f1 = 0, … , fk-2 = 0, fk-1 = 1;fn = fn-1 + fn-2 + … + fn-k , n = k , k + 1, … ...

  10. kali切换到西电源

    准备研究kali的openvas,打开发现居然没有.apt-get更新一下结果各种报错,换成中科大源.阿里源还是始终报错,气到吐血.最后上西电开源社区换成了西电的kali源,更新速度2m多,一气呵成~ ...