兰州城乡建设局网站,wordpress显示轮播图,萧山人才网手机版,查企业哪个软件好推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好#xff0c;我是佛系工程师☆恬静的小魔龙☆#xff0c;不定时更新Unity开发技巧#xff0c;觉得有用记得一键三连哦。
一、前言
在日常开发中#xff0c;可能会遇到要判断Animation或者Anima… 推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好我是佛系工程师☆恬静的小魔龙☆不定时更新Unity开发技巧觉得有用记得一键三连哦。
一、前言
在日常开发中可能会遇到要判断Animation或者Animator动画播放是否结束的情况。
判断Animation是否结束可以这么写
using System;
using System.Collections;
using UnityEngine;public class AnimationPlayControl : MonoBehaviour
{Animation ani;void Update(){AnimationState state ani[Open];if (state.normalizedTime 1) {// 判断动画播放结束normalizedTime的值为0~10为开始1为结束。Debug.Log(动画播放完毕);}}
}或者简单一点
using System;
using System.Collections;
using UnityEngine;public class AnimationPlayControl : MonoBehaviour
{Animation ani;void Start(){if(!ani.isPlaying){Debug.Log(没有播放动画或播放结束动画);}}
}判断Animator是否结束可以这么写
using System;
using System.Collections;
using UnityEngine;public class AnimationPlayControl : MonoBehaviour
{Animator anir;void Start(){//获取动画层 0 指Base Layer.AnimatorStateInfo stateinfo anir.GetCurrentAnimatorStateInfo(0);//判断是否正在播放walk动画.if (!stateinfo.IsName(Base Layer.walk)){Debug.Log(没有播放walk动画或播放结束动画);}}
}但是如果说要判断动画结束之后再执行某些事件就有些麻烦首先需要在Update里面一直判断是否播放完播放完再去执行事件。
消耗性能也不好管理所以就写了一个迭代器也就是协程来判断动画是否结束结束后执行回调函数。
二、Animation动画播放结束判断
2-1、第一种协程写法
代码参考
using System;
using System.Collections;
using UnityEngine;public class AnimationPlayControl : MonoBehaviour
{Animation ani;void Start(){PlayAnimation(ani, Open,() {Debug.Log(动画播放前执行代码);},() {Debug.Log(动画播放完执行代码);});}// 封装函数public void PlayAnimation(Animation animation, string clipName, Action startAct null, Action endAct null){StartCoroutine(PlayAnimationItor(animation, clipName, startAct, endAct));}/// summary/// Animation动画播放迭代器/// /summary/// param nameanimationAnimation组件/param/// param nameclipNameclip片段名/param/// param namestartAct委托函数/param/// param nameendAct委托函数/param/// returns/returnsIEnumerator PlayAnimationItor(Animation animation, string clipName, Action startAct, Action endAct){startAct?.Invoke();animation.Play(clipName);yield return new WaitForSeconds(animation[clipName].length);endAct?.Invoke();}
}PS主要是使用了协程中的new WaitForSeconds也就是等待X秒这里就是等待动画播放的X秒后执行委托函数更加详细的协程可以参考我其他文章这里就不详细说明了。 2-2、第二种协程写法
using System;
using System.Collections;
using UnityEngine;public class AnimationPlayControl : MonoBehaviour
{Animation ani;void Start(){PlayAnimation(ani, Open,() {Debug.Log(动画播放前执行代码);},() {Debug.Log(动画播放完执行代码);});}// 封装函数public void PlayAnimation(Animation animation, string clipName, Action startAct null, Action endAct null){StartCoroutine(PlayAnimationItor(animation, clipName, startAct, endAct));}/// summary/// Animation动画播放迭代器/// /summary/// param nameanimationAnimation组件/param/// param nameclipNameclip片段名/param/// param namestartAct委托函数/param/// param nameendAct委托函数/param/// returns/returnsprivate IEnumerator PlayAnimationItor(Animation animation, string clipName, Action startAct, Action endAct){startAct?.Invoke();AnimationState animationState animation[clipName];animation.Play(clipName);yield return StartCoroutine(new WaitForEndOfAnim(animationState));endAct?.Invoke();}
}// 实现WaitForEndOfAnim迭代器
public class WaitForEndOfAnim : IEnumerator
{AnimationState m_animState;public WaitForEndOfAnim(AnimationState animState){m_animState animState;}public object Current{get{return null;}}public bool MoveNext(){return m_animState.enabled;}public void Reset(){}
}这种方式实现WaitForEndOfAnim迭代器在动画播放完后执行后面的代码。 三、Animator动画播放结束判断
首先要明白Animator是动画状态机是用来控制动画片段然后去切换动画片段的如下图所示 所以说Animator默认就会开始播放一种动画不论是Idle动画还是Walk动画总会播放一种动画所以就不用像Animation去Play某一个动画了只需要判断当前动画是否播放完即可。
代码参考如下两种方法写一起了
using System;
using System.Collections;
using UnityEngine;public class AnimationPlayControl : MonoBehaviour
{Animator ani;void Start(){PlayAnimation(ani, Open,() {Debug.Log(动画播放前执行代码);},() {Debug.Log(动画播放完执行代码);});}// 封装函数public void PlayAnimator(Animator animator, string clipName, Action startAct null, Action endAct null){StartCoroutine(PlayAnimationItor(animator, clipName, startAct, endAct));}/// summary/// Animation动画播放迭代器/// /summary/// param nameanimationAnimation组件/param/// param nameclipNameclip片段名/param/// param namestartAct委托函数/param/// param nameendAct委托函数/param/// returns/returnsprivate IEnumerator PlayAnimationItor(Animator animator, string clipName, Action startAct, Action endAct){startAct?.Invoke();AnimatorStateInfo animatorStateInfo animator.GetCurrentAnimatorStateInfo(0);yield return StartCoroutine(new WaitForEndOfAnimr(animatorStateInfo,clipName));endAct?.Invoke();}/// summary/// Animation动画播放迭代器/// /summary/// param nameanimationAnimation组件/param/// param nameclipNameclip片段名/param/// param namestartAct委托函数/param/// param nameendAct委托函数/param/// returns/returnsIEnumerator PlayAnimationItor2(Animator animator, string clipName, Action startAct, Action endAct){startAct?.Invoke();yield return new WaitForSeconds(animator.GetCurrentAnimatorClipInfo(0)[0].clip.length);endAct?.Invoke();}
}// 实现WaitForEndOfAnim迭代器
public class WaitForEndOfAnimr : IEnumerator
{AnimatorStateInfo m_animState;public WaitForEndOfAnimr(AnimatorStateInfo animState,string clipName){m_animState animState;}public object Current{get{return null;}}public bool MoveNext(){return m_animState.IsName(clipName);}public void Reset(){}
}四、后记
结束本篇文章讲解了Animation和Animator动画播放结束的判断代码。
以及如何实现在Animation和Animator动画播放结束判断并且执行回调函数的实现。 你的点赞就是对博主的支持有问题记得留言
博主主页有联系方式。
博主还有跟多宝藏文章等待你的发掘哦
专栏方向简介Unity3D开发小游戏小游戏开发教程分享一些使用Unity3D引擎开发的小游戏分享一些制作小游戏的教程。Unity3D从入门到进阶入门从自学Unity中获取灵感总结从零开始学习Unity的路线有C#和Unity的知识。Unity3D之UGUIUGUIUnity的UI系统UGUI全解析从UGUI的基础控件开始讲起然后将UGUI的原理UGUI的使用全面教学。Unity3D之读取数据文件读取使用Unity3D读取txt文档、json文档、xml文档、csv文档、Excel文档。Unity3D之数据集合数据集合数组集合数组、List、字典、堆栈、链表等数据集合知识分享。Unity3D之VR/AR虚拟仿真开发虚拟仿真总结博主工作常见的虚拟仿真需求进行案例讲解。Unity3D之插件插件主要分享在Unity开发中用到的一些插件使用方法插件介绍等Unity3D之日常开发日常记录主要是博主日常开发中用到的用到的方法技巧开发思路代码分享等Unity3D之日常BUG日常记录记录在使用Unity3D编辑器开发项目过程中遇到的BUG和坑让后来人可以有些参考。