您的位置:首页 > 汽车 > 时评 > 浏览器登录入口_html模板制作_制定营销推广方案_百度搜索推广登录入口

浏览器登录入口_html模板制作_制定营销推广方案_百度搜索推广登录入口

2024/10/7 3:04:38 来源:https://blog.csdn.net/zhuanggenhua/article/details/142717519  浏览:    关键词:浏览器登录入口_html模板制作_制定营销推广方案_百度搜索推广登录入口
浏览器登录入口_html模板制作_制定营销推广方案_百度搜索推广登录入口

前言

前置知识:设置参数后,下一个循环才会切换对应动画,所以在下一个循环获取真实的动画长度
AnimatorStateInfo是结构体!值类型,要不断重复获取才是最新的

主要是自动设置trigger切换的动画自动切回上一个动画,需要在异步中等待动画结束,于是用传统方式:

//上一个动画没有退出时间,直接等一个循环就是真实动画
await UniTask.Yield(PlayerLoopTiming.Update);//上一个动画有退出时间
AnimatorStateInfo currentAm = animator.GetCurrentAnimatorStateInfo(0);
while (currentAm.normalizedTime < 1f || animator.IsInTransition(0)){await UniTask.Yield(PlayerLoopTiming.Update);}

但是我用的连击动画为了好的手感将动画结束时间提前,这就导致进入这里的currentAm 可能是上一次的攻击动画
所以直接判断上一个动画是否执行完毕

AnimatorStateInfo重要属性

  • normalizedTime :动画播放进度,播放完则是1,每次循环+1,需要注意不循环的动画可能只到9.x就切换了
  • shortNameHash:状态名字 转换成的hash值
  • length:动画时长,单位秒
  • IsName: 将字符串转为hash进行判断
    在这里插入图片描述

代码

需要约定状态名,我的枚举名和状态名相等,连击的攻击则是枚举名 + combo数 + 1,连击参数是连击状态名+Combo

private async UniTask WaitForAnimator(Animator animator){// 注意参数的设置也是下一轮才生效,所以先等一轮// 上一个动画没有退出时间,直接等一个循环就是真实动画await UniTask.Yield(PlayerLoopTiming.Update);//获取唯一状态标识var preStateKey = currentState.state.ToString().Contains("DoubleAttack") ?currentState.state.ToString() + animator.GetInteger(currentState.state.ToString() + "Combo") : lastState.state.ToString();Debug.Log(animator.GetInteger(currentState.state.ToString() + "Combo"));AnimatorStateInfo currentAm = animator.GetCurrentAnimatorStateInfo(0);//等到上一个攻击动画执行完毕while (currentAm.IsName(preStateKey)){await UniTask.Yield(PlayerLoopTiming.Update);currentAm = animator.GetCurrentAnimatorStateInfo(0);}var duration = currentAm.length;float preProcessTime = currentState.state.ToString().Contains("Attack") ? duration * 0.2f : 0; // 计算提前处理时间(动画总时长的 25%)// 等待动画完成float waitTime = duration - preProcessTime;if (waitTime > 0)await UniTask.Delay((int)(waitTime * 1000), DelayType.Realtime, PlayerLoopTiming.Update);
// 所有动画完成后切换状态ChangeState(lastBoolState);}
也可以直接保存shortNameHash作为状态名称 不推荐
private Dictionary<String, int> animalNameHashDic = new();
private async UniTask WaitForAnimator(Animator animator){//获取唯一状态标识var key = currentState.state.ToString().Contains("Attack") ?currentState.state.ToString() + GameMgr.Instance.player.ComboCounter : currentState.state.ToString();AnimatorStateInfo currentAm = animator.GetCurrentAnimatorStateInfo(0);//真实的动画长度:shortNameHash相等if (animalNameHashDic.ContainsKey(key)){// Debug.Log(currentAm.shortNameHash);while (animalNameHashDic[key] == currentAm.shortNameHash){await UniTask.Yield(PlayerLoopTiming.Update);currentAm = animator.GetCurrentAnimatorStateInfo(0);}}else{// 第一次就是真实的if (!animalNameHashDic.ContainsKey(key))animalNameHashDic.Add(key, currentAm.shortNameHash);}var duration = currentAm.length;float preProcessTime = currentState.state.ToString().Contains("Attack") ? duration * 0.2f : 0; // 计算提前处理时间(动画总时长的 25%)// 等待动画完成float waitTime = duration - preProcessTime;if (waitTime > 0)await UniTask.Delay((int)(waitTime * 1000), DelayType.Realtime, PlayerLoopTiming.Update);}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com