当前位置: 首页 > news >正文

关于Unity中如何立即中断动画然后重新开始播放

今天做一个FPS游戏的时候,用的是新版的动画系统,遇到一个问题。

就是用枪打敌人的时候,敌人会播放一个被击中的动画,但是如果在动画播放的过程中再射击敌人,敌人会先把第一个被击中的动画播放完,才再播放第二个被击中的动画。而且被击中后还原为正常形态也有点慢。

这样被枪打中的打击感就没有了,降低了FPS游戏的体验。

我理想中的效果是,当我用枪击中敌人,敌人播放被击中的动画,当我再开第二枪的时候,敌人能够停止第一枪的正在播放的被击中动画,重新开始播放被击中动画。如果我连续射中敌人,敌人就会有一个不断被击中的鬼畜的效果。

 

 

解决方案

思路:

  我在动画状态机里面再创建一个一模一样的受伤的状态hurt2,然后设置一个伴随被击中次数不断累加的整型变量,当变量为单数时切换受伤状态1,变量为双数时切换受伤状态2,这就实现了立刻停止当前动画并重新开始播放动画的效果。而动画切换有点慢的话,可以不勾选状态和状态之间切换时的Transition的Has Exit Time,这样就不会有动画和动画之间过渡的那个的时间。如果一个动画有Conditions建议取消Has Exit Time,不然会出现无法及时触发的问题。Has Exit Time就是必须过度的时间,处于这个时间时,是不允许任何对动画的操作的。

 

动画状态机配置:

 

两个受伤动画之间过渡的Transition和walk与两个受伤动画之间的Transition配置:

 

当我们击中敌人时,调用敌人节点下的Enemy脚本里面的hurt函数:

 public void hurt()
    {
        a++;
        Debug.Log("打到怪物:"+a);

        if (a % 2 != 0)
        {
            this.anim.SetInteger("anim_state", 1);//播放hurt动画
        }
        else if (a % 2 == 0)
        {
            this.anim.SetInteger("anim_state", 2);//播放hurt2动画
        }


        if (a >= 10)//怪物死亡,切换到3,播放死亡动画
        {
            this.anim.SetInteger("anim_state", 3);
        }
    }

 

敌人节点下的Enemy脚本里面的Update函数:

    void Update () {

        AnimatorStateInfo info = anim.GetCurrentAnimatorStateInfo(0);
         // 判断动画是否播放完成
        if ((info.normalizedTime >= 1.0f && info.IsName("Base Layer.hurt")) || (info.normalizedTime >= 1.0f && info.IsName("Base Layer.hurt2")))
         {
             this.anim.SetInteger("anim_state", 0);//设置参数anim_state的值为0,我们之前也设置了当它等于0的时候会跳转
         }
     // 判断死亡动画是否播放完成
        if (info.normalizedTime >= 1.0f && info.IsName("Base Layer.die"))
        {
            this.box.enabled = false;
            this.anim.Stop();
            MonoBehaviour.Destroy(this.gameObject);
            a = 0;
            Debug.Log("删除怪物");
        }
    }

 

相关文章:

  • windows下安装bpython方法 (新)
  • 为tomcat配置项目必须的引擎文件
  • ORACLE in与exists语句的区别
  • HDU 6170 - Two strings | 2017 ZJUT Multi-University Training 9
  • WebLogic 10.3.6与JDK 1.7的兼容问题
  • vnx通过iscsi连接esxi主机,并挂载nfs和block
  • 栈和队列
  • 查看索引的状态
  • 二级MSOffice高级应用考试大纲(2013年版)
  • POJ 1830 开关问题 高斯消元
  • CAN协议,系统结构和帧结构
  • New Concept English Two 11 28
  • centos 配置sudo记录日志
  • Android图文混排实现方式详解
  • crossdomain.xml解决跨域问题
  • 【剑指offer】让抽象问题具体化
  • express.js的介绍及使用
  • Iterator 和 for...of 循环
  • JAVA并发编程--1.基础概念
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • React系列之 Redux 架构模式
  • Redash本地开发环境搭建
  • Spring Boot快速入门(一):Hello Spring Boot
  • Vue 2.3、2.4 知识点小结
  • 笨办法学C 练习34:动态数组
  • 第2章 网络文档
  • 服务器从安装到部署全过程(二)
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 记一次和乔布斯合作最难忘的经历
  • 解决iview多表头动态更改列元素发生的错误
  • 开放才能进步!Angular和Wijmo一起走过的日子
  • 驱动程序原理
  • 如何将自己的网站分享到QQ空间,微信,微博等等
  • 如何优雅地使用 Sublime Text
  • 深入浅出Node.js
  • 网络应用优化——时延与带宽
  • const的用法,特别是用在函数前面与后面的区别
  • kubernetes资源对象--ingress
  • ​人工智能之父图灵诞辰纪念日,一起来看最受读者欢迎的AI技术好书
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (26)4.7 字符函数和字符串函数
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (C#)获取字符编码的类
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (安卓)跳转应用市场APP详情页的方式
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (二)fiber的基本认识
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (解决办法)ASP.NET导出Excel,打开时提示“您尝试打开文件'XXX.xls'的格式与文件扩展名指定文件不一致
  • (免费领源码)python#django#mysql校园校园宿舍管理系统84831-计算机毕业设计项目选题推荐
  • (转)关于pipe()的详细解析
  • .gitignore文件---让git自动忽略指定文件