using System.Collections.Generic; using GameLogic.Combat.Hero.HeroGPU; using GameTimeLine.CustomizeTimeLogic; using GPUECSAnimationBaker.Engine.AnimatorSystem; using UnityEngine; namespace GameLogic.Combat.Hero { public class CombatHeroGPUAnimtion : HeroAnimtionBasic { public GpuEcsAnimatorBehaviour GpuEcsAnimatorBehaviour; public GPUAnimtion GPUAnimtion; private GpuEcsAnimationData[] animations; private HeroGPUAnimtionStateInfo _heroPlayStateInfoBasic; protected HeroGPUMono _heroGPUMono; private List _anchorNames = new List(); protected override void ProInit() { GpuEcsAnimatorBehaviour = combatHeroEntity.GameObject.transform.GetComponentInChildren(); animations = GpuEcsAnimatorBehaviour.animations; _anchorNames = GpuEcsAnimatorBehaviour.anchorNames; GPUAnimtion = new GPUAnimtion(); GPUAnimtion.Init(GpuEcsAnimatorBehaviour); _heroPlayStateInfoBasic = new HeroGPUAnimtionStateInfo(); _heroGPUMono = combatHeroEntity.combatHeroGameObject.HeroGPUMono; } protected override void ProUpdate(float t) { GPUAnimtion.Update(); _heroGPUMono.animtionState = GPUAnimtion.gpuEcsAnimatorShaderData.shaderData; } public override void SetSpecialDotMonoFollow(SpecialDotInfo specialDotInfo) { if (!specialDotInfo.followSkeleton) { return; } int index = _anchorNames.IndexOf(specialDotInfo.dotName); if (index >= 0) { GPUAnimtion.GetGPUAnchors(index, out Vector3 pos, out Quaternion unityQuaternion); specialDotInfo.targetTran.localPosition = pos; specialDotInfo.targetTran.localRotation = unityQuaternion; } } private int GetAnimtionIndex(string name) { for (int i = 0; i < animations.Length; i++) { if (animations[i].stateName.Equals(name)) { return i; } } return -1; } private void SetSpeed(float speed) { GPUAnimtion.SetSpeed(speed); } public override HeroPlayStateInfoBasic Play(string name, float speed = 1) { int index = GetAnimtionIndex(name); if (index < 0) { return null; } _heroPlayStateInfoBasic.OnSetSpeed = SetSpeed; AnimatorInfo animatorInfo = new AnimatorInfo() { animationID = index, blendFactor = 0, speedFactor = speed }; GPUAnimtion.SetAnimtionIndex(animatorInfo); return _heroPlayStateInfoBasic; } } }