using System; using System.Collections.Generic; using Animancer; using Animancer.TransitionLibraries; using Core.Triiger; using Fort23.UTool; using UnityEngine; using UnityEngine.AI; using Utility; namespace GameLogic.Combat.Hero { public class CombatHeroAnimtion : IDisposable { public AnimancerComponent AnimancerComponent; protected Map _transitionMap = new Map(); private CombatHeroEntity combatHeroEntity; public void Init(AnimancerComponent animancer, CombatHeroEntity combatHeroEntity) { AnimancerComponent = animancer; AnimancerComponent.gameObject.OnAnimatorMove(OnAnimatorMove); this.combatHeroEntity = combatHeroEntity; if (AnimancerComponent != null) { // AnimancerComponent.GetAnimationClips(); // List results = new List(); // AnimancerComponent.Transitions.GetAnimationClips(results); int max = AnimancerComponent.Transitions.Library.Count; for (int i = 0; i < max; i++) { if (AnimancerComponent.Transitions.Library.TryGetTransition(i, out TransitionModifierGroup transition)) { TransitionAsset clipTransition2 = transition.Transition as TransitionAsset; _transitionMap[clipTransition2.name] = clipTransition2; } } } } protected void OnAnimatorMove() { if (AnimancerComponent == null || AnimancerComponent.Animator.velocity.sqrMagnitude < .01f) { return; } bool isOk = false; combatHeroEntity.CombatAIBasic.NavMeshAgent.Raycast(AnimancerComponent.Animator.rootPosition, out NavMeshHit hit); if (!hit.hit) { combatHeroEntity.combatHeroGameObject.SetPosition(AnimancerComponent.Animator.rootPosition); } } public AnimancerState Play(string name, float speed = 1) { if (!_transitionMap.TryGetValue(name, out TransitionAsset clipTransition)) { LogTool.Log("没有找到要播放的动画" + name); return null; } // clipTransition.Speed = speed; // clipTransition. = isLoop; AnimancerState animancerState = AnimancerComponent.Play(clipTransition); // AnimancerComponent.Animator.speed = speed; animancerState.Speed = speed; return animancerState; } public void Dispose() { _transitionMap.Clear(); AnimancerComponent = null; } } }