zoukankan      html  css  js  c++  java
  • 关于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("删除怪物");
            }
        }
  • 相关阅读:
    关于MySQL 最后一部安装阶段无法响应的问题
    为PHP 启用Mysql 的dll
    webcast终于改版了
    有意思的oracle转义字符
    Telnet协议详解及使用C# 用Socket 编程来实现Telnet协议
    我被百度悲剧了
    阻止 http://3b3.org/c.js恶意SQL注入
    驱动研究日记-链表+后备链表
    C# 执行汇编类
    Tuning and Slimming JBossAS
  • 原文地址:https://www.cnblogs.com/HangZhe/p/7413778.html
Copyright © 2011-2022 走看看