using System.Collections; using System.Collections.Generic; using System.Collections.Immutable; using System.Linq; using Animancer; using AYellowpaper.SerializedCollections; using BITKit; using Cysharp.Threading.Tasks; using Unity.Mathematics; using UnityEngine; namespace Project.B.Animation { public class ScriptableHumanoidAnimationFactory : ScriptableObject,IHumanoidAnimationFactory { [SerializeReference, SubclassSelector] private IReference[] tags; [SerializeField] public SerializedDictionary idleAnimations; [SerializeField] public SerializedDictionary walkAnimations; [SerializeField] public SerializedDictionary crouchAnimations; [SerializeField] public SerializedDictionary inAirAnimations; [SerializeField] public SerializedDictionary runAnimations; [SerializeField] public SerializedDictionary sprintAnimations; [SerializeField] public SerializedDictionary knockedAnimations; [SerializeField] public SerializedDictionary ladderAnimations; [SerializeField] public SerializedDictionary hitAnimations; [SerializeField] public AnimationClip[] knockingAnimations; [SerializeField] public AnimationClip[] revivedAnimations; [SerializeField] public AnimationClip[] deathAnimations; [SerializeField] public AnimationClip[] seatAnimations; [SerializeField] public AnimationClip[] ladderEnterAnimations; [SerializeField] public AnimationClip[] ladderExitAnimations; public UniTask InitializeAsync() { return UniTask.CompletedTask; } public int Hash => tags.GetHashCode(); public IReadOnlyCollection Tags => tags.Select(x => x.Value).ToImmutableArray(); public IWrapper CreateIdleAnimation() { var idle = new DirectionalMixerState(); foreach (var (parameter,clip) in idleAnimations) { idle.Add(clip, parameter); } return new MixerStateWrapperFloat2(idle); } public IWrapper CreateWalkAnimation() { var walk = new DirectionalMixerState(); foreach (var (parameter, clip) in walkAnimations) { walk.Add(clip, parameter); } return new MixerStateWrapperFloat2(walk); } public IWrapper CreateCrouchedAnimation() { var crouch = new DirectionalMixerState(); foreach (var (parameter, clip) in crouchAnimations) { crouch.Add(clip, parameter); } return new MixerStateWrapperFloat2(crouch); } public IWrapper CreateInAirAnimation() { var inAir = new DirectionalMixerState(); foreach (var (parameter, clip) in inAirAnimations) { inAir.Add(clip, parameter); } return new MixerStateWrapperFloat2(inAir); } public IWrapper CreateHitAnimation() { var hit = new DirectionalMixerState(); foreach (var (parameter, clip) in hitAnimations) { hit.Add(clip, parameter); } return new MixerStateWrapperFloat2(hit); } public IWrapper CreateRunAnimation() { var state = new LinearMixerState() { { idleAnimations[new float2(0, 0)], 0 }, }; foreach (var (parameter,clip) in runAnimations) { state.Add(clip, parameter); } return new MixerStateWrapperFloat(state); } public IWrapper CreateSprintAnimation() { var state = new LinearMixerState() { { idleAnimations[new float2(0, 0)], 0 }, }; foreach (var (parameter, clip) in sprintAnimations) { state.Add(clip, parameter); } return new MixerStateWrapperFloat(state); } public IWrapper CreateKnockedAnimation() { var knocked = new DirectionalMixerState(); foreach (var (parameter, clip) in knockedAnimations) { knocked.Add(clip, parameter); } return new MixerStateWrapperFloat2(knocked); } public object CreateKnockingAnimation() { return knockingAnimations.Random(); } public object CreateRevivedAnimation() => revivedAnimations.Random(); public object CreateDeathAnimation() { return deathAnimations.Random(); } public object CreateSeatAnimation() => seatAnimations.Random(); public object CreateLadderEnterAnimation() => ladderEnterAnimations.Random(); public IWrapper CreateLadderAnimation() { var climb = new LinearMixerState(); foreach (var (parameter, clip) in ladderAnimations) { climb.Add(clip, parameter); } return new MixerStateWrapperFloat(climb); } public object CreateLadderExitAnimation() => ladderExitAnimations.Random(); } }