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角色移动和受伤音效平滑过渡》对你有帮助,请点赞、收藏,并留下你的观点哦!