контроллере сейчас играеться, а что если нам надо знать не о проигрывании анимации, а о проигрывании стейт машины с 5 анимациями. Как узнать проигрывается ли сейчас определённая стейт машина?
private bool IsAnimationPlaying(string animationName) { var animatorStateInfo = _animator.GetCurrentAnimatorStateInfo(0); Debug.Log(animatorStateInfo.IsName(animationName)); return animatorStateInfo.IsName(animationName); } private async UniTask AnimationPlay(string animationKey) { if (animationKey == DEATH_KEY) { _animator.SetTrigger(animationKey); return; } await DoTrigger(animationKey); await UniTask.WaitWhile(() => IsAnimationPlaying(animationKey)); Debug.Log($"{animationKey} animation is played"); } private async UniTask DoTrigger(string animationKey) { _animator.SetTrigger(animationKey); while (!IsAnimationPlaying(animationKey)) { await UniTask.DelayFrame(1); } while (IsAnimationPlaying(animationKey)) { await UniTask.DelayFrame(1); } } вот так вы можем работать с единичной анимацией имя которой нам известно. А если добавить стейт машину на рандомную анимацию из 5 допустим, то он уже не завершает юнитаску, ибо имя анимации там может быть не соответсвовать константе ATTACK = "Attack" Можно конечно циклом перебирать все возможные называния анимаций но это во первых костыль, во вторых нагрузка лишняя Update, вроде как можно проверять по тегам анимацю, вопрос закрыт
какой-то жуткий костыль о_О Бехейвер можно же для такого использовать, зачем городить какой-то велосипед
мне не нужно чтоб бехейвиор отвечал за боевку и дергал оттуда код, это не архитектурно, бехейвиор должен отвечать только за анимации и параметры аниматора
я тебе сказал: ты можешь из бехейвера код дёрнуть. Хочешь - используй его как ивентовую систему, не возбраняется. И не надо городить огород
Обсуждают сегодня