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

Unity获取Animator动画播放完成事件

方法:
1.采用Dotween配合异步实现
2.采用状态机计时方法实现
3.采用内置状态机配合实现

方法一:Dotween异步方法

using UnityEngine;
using System.Threading.Tasks;
using DG.Tweening;public class PlayerAnimAsync : MonoBehaviour
{private Animator animator;private bool isAnimPlaying = false;void Start(){animator = GetComponent<Animator>();}void Update(){animator = GetComponent<Animator>();// 开始动画if (!isAnimPlaying){StartAttack();}}private async void StartAttack(){isAnimPlaying = true;await AnimationFinish("Attack", 0f);   //等待Attack播放完Debug.Log("Attack播放完了,可以执行Idle");animator.Play("Idle");isAnimPlaying = false;}//AnimationFinish 异步播放动画public async Task AnimationFinish(string animName, float extreTime = 0f){await DOTween.Sequence().AppendCallback(() => animator.Play(animName)).AppendInterval(GetAnimationClipLength(animName) + extreTime).AsyncWaitForCompletion();}//GetAnimationClipLength 获取动画片段时长private float GetAnimationClipLength(string animName){RuntimeAnimatorController ac = animator.runtimeAnimatorController;foreach (AnimationClip clip in ac.animationClips){if (clip.name == animName){return clip.length;}}return 0f;}
}

方法二:状态机计时方法

using UnityEngine;
public class PlayerAnimFSM : MonoBehaviour
{private enum AnimationState {Idle, Attack}private AnimationState currentState;private Animator animator;private float waitAnimTime = 0f;    //动画计时器void Start(){animator = GetComponent<Animator>();}void Update(){CheckState();currentState = currentState switch{AnimationState.Idle => IdleState(),AnimationState.Attack => AttackState(),_ => currentState};}private AnimationState IdleState(){animator.Play("Idle");return AnimationState.Idle;}private AnimationState AttackState(){//播放动画animator.Play("Attack");waitAnimTime += Time.deltaTime;if (waitAnimTime >= animator.GetCurrentAnimatorStateInfo(0).length){//当动画记录时间大于当前正在播放动画的时间时//todo:这里有一个BUG,在animator.Play()的动画需要在下一帧animator.GetCurrentAnimatorStateInfo(0).length才能获取到正确的时间//在这里默认动画长度都会大于1帧所以没太大的问题//正确的做法是参考方法一种的GetAnimationClipLength来获取动画时间waitAnimTime = 0;   //重置动画时间Debug.Log("Attack播放完了,可以执行Idle");return AnimationState.Idle; //转换Idle状态}return AnimationState.Attack; //维持攻击状态}private void CheckState()    //检测状态转换{if (currentState == AnimationState.Attack)  //维持攻击动画不被打断return;if (Input.GetKeyDown(KeyCode.Space)){currentState = AnimationState.Attack;return;}currentState = AnimationState.Idle;}
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 第三十一天 chrome调试工具
  • 2023-2024年 Java开发岗面试题经验分享
  • ESP32是什么?
  • C++函数详解:全面指南
  • 什么是API 网关?为什么要 API网关?
  • AI应用开发前景与目标
  • vitis (eclipse) 的Indexer不能搜索、不能跳转到函数和变量定义和声明不能打开调用层次的解决方法
  • iOS ------RunLoop
  • [Spring] SpringBoot统一功能处理与图书管理系统
  • Rust的运行时多态
  • 打卡第31天------贪心算法
  • 基于深度学习的面部表情分类识别系统
  • 计算机基础(Windows 10+Office 2016)教程 —— 第4章 计算机网络与Internet(下)
  • 水论文如何找创新,优秀者模仿,末尾有例子示范_来自B站水论文的程序猿
  • Python SciPy介绍
  • [笔记] php常见简单功能及函数
  • 8年软件测试工程师感悟——写给还在迷茫中的朋友
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTTP中GET与POST的区别 99%的错误认识
  • java8-模拟hadoop
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • nfs客户端进程变D,延伸linux的lock
  • Python学习之路16-使用API
  • Rancher-k8s加速安装文档
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • redis学习笔记(三):列表、集合、有序集合
  • VirtualBox 安装过程中出现 Running VMs found 错误的解决过程
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 高度不固定时垂直居中
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 基于阿里云移动推送的移动应用推送模式最佳实践
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 深度解析利用ES6进行Promise封装总结
  • 我建了一个叫Hello World的项目
  • ​zookeeper集群配置与启动
  • ​如何在iOS手机上查看应用日志
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • (规划)24届春招和25届暑假实习路线准备规划
  • (六)vue-router+UI组件库
  • (淘宝无限适配)手机端rem布局详解(转载非原创)
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • (转)eclipse内存溢出设置 -Xms212m -Xmx804m -XX:PermSize=250M -XX:MaxPermSize=356m
  • (转)使用VMware vSphere标准交换机设置网络连接
  • *setTimeout实现text输入在用户停顿时才调用事件!*
  • .NET Core 中插件式开发实现
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net IOC框架入门之一 Unity
  • .net 怎么循环得到数组里的值_关于js数组
  • .NetCore 如何动态路由
  • .net和jar包windows服务部署
  • .NET开源、简单、实用的数据库文档生成工具
  • .Net面试题4
  • .net实现客户区延伸至至非客户区
  • @PostConstruct 注解的方法用于资源的初始化
  • @Query中countQuery的介绍