失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 通过动画状态实现Unity角色移动和受伤音效平滑过渡

通过动画状态实现Unity角色移动和受伤音效平滑过渡

时间:2021-01-08 09:24:17

相关推荐

通过动画状态实现Unity角色移动和受伤音效平滑过渡

1、实现必备条件:

主角inspector面板添加了一组可以操控的移动、站立、受伤、攻击状态动画、 以及AudioSource组件。

2、实现过程:

接着在主角控制类脚本中,添加如下变量:

AudioSource audioSource;public AudioClip footClip; //面板中拖入主角移动音效public AudioClip hitClip; //面板中拖入主角受伤音效float timerClip_Foot;//获取移动音效播放时长float timerClip_Hit;Animator animator;private string currentStateName;

start函数中获取组件:

void Start () { audioSource = GetComponent<AudioSource>();animator = GetComponent<Animator>();timerClip_Foot = 0.0f;timerClip_Hit = 0.0f;}

添加获取动画状态的函数

string GetCurrentAnimationStateName () {if (animator.GetCurrentAnimatorStateInfo( 0 ).IsName( "Idle" )) {currentStateName = "Idle";}if (animator.GetCurrentAnimatorStateInfo( 0 ).IsName( "Moving" )) {currentStateName = "Moving";}if (animator.GetCurrentAnimatorStateInfo( 0 ).IsName( "Hit" )) {currentStateName = "Hit";}// Debug.Log( $"Ruby的当前状态为:{currentStateName}" );return currentStateName;}

添加播放主角音效的函数

void PlayAudio () {string stateName = GetCurrentAnimationStateName();Debug.Log( $"Ruby的当前状态为:{stateName}" );if (stateName== "Moving") {if (timerClip_Foot <= 0.0f) { //移动音效计时变量小于等于0,证明上次音效播放完了,开始再次播放音效 audioSource.PlayOneShot( footClip );timerClip_Foot = footClip.length;//开始播放移动音效,将音效时长赋给移动音效计时变量}else { timerClip_Foot -= Time.deltaTime;//该次音效还未播放完成,跳过播放,并开始倒计时}}else if (stateName == "Hit") {if (timerClip_Hit <= 0.0f) {timerClip_Hit =timeInvincible;audioSource.PlayOneShot( hitClip );}else {timerClip_Hit -= Time.deltaTime; }}else {audioSource.Stop();//退出移动或受伤状态,立刻停止播放音效。如果不停止,角色已经停止移动了,还会继续播放未播放完的单次音效,这样显得很不协调!timerClip_Hit = 0.0f;timerClip_Foot = 0.0f; //将音效计时变量归0,否则下次开始运动或受伤时后,不会立刻播放移动或受伤音效,会把上次剩余的timerClipt归0完后才开始播放音效! }}

最后在UpDat函数中,添加调用PlayAudio函数即可!

void Update () {PlayAudio();}

大功告成!

PS:本文最初发布个人语雀,未经允许,禁止转载!

通过动画状态实现Unity角色移动和受伤音效平滑过渡 · 语雀

如果觉得《通过动画状态实现Unity角色移动和受伤音效平滑过渡》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。