using System; using UnityEngine; namespace ET.Client { [FriendOf(typeof(AnimatorComponent))] public static class AnimatorComponentSystem { [ObjectSystem] public class AnimatorComponentAwakeSystem : AwakeSystem { protected override void Awake(AnimatorComponent self) { self.Awake(); } } [ObjectSystem] public class AnimatorComponentUpdateSystem : UpdateSystem { protected override void Update(AnimatorComponent self) { self.Update(); } } [ObjectSystem] public class AnimatorComponentDestroySystem : DestroySystem { protected override void Destroy(AnimatorComponent self) { self.animationClips = null; self.Parameter = null; self.Animator = null; } } public static void Awake(this AnimatorComponent self) { Animator animator = self.GetParent().GetComponent().GameObject.GetComponent(); if (animator == null) { return; } if (animator.runtimeAnimatorController == null) { return; } if (animator.runtimeAnimatorController.animationClips == null) { return; } self.Animator = animator; foreach (AnimationClip animationClip in animator.runtimeAnimatorController.animationClips) { self.animationClips[animationClip.name] = animationClip; } foreach (AnimatorControllerParameter animatorControllerParameter in animator.parameters) { self.Parameter.Add(animatorControllerParameter.name); } } public static void Update(this AnimatorComponent self) { if (self.isStop) { return; } if (self.MotionType == MotionType.None) { return; } try { self.Animator.SetFloat("MotionSpeed", self.MontionSpeed); self.Animator.SetTrigger(self.MotionType.ToString()); self.MontionSpeed = 1; self.MotionType = MotionType.None; } catch (Exception ex) { throw new Exception($"动作播放失败: {self.MotionType}", ex); } } public static bool HasParameter(this AnimatorComponent self, string parameter) { return self.Parameter.Contains(parameter); } public static void PlayInTime(this AnimatorComponent self, MotionType motionType, float time) { AnimationClip animationClip; if (!self.animationClips.TryGetValue(motionType.ToString(), out animationClip)) { throw new Exception($"找不到该动作: {motionType}"); } float motionSpeed = animationClip.length / time; if (motionSpeed < 0.01f || motionSpeed > 1000f) { Log.Error($"motionSpeed数值异常, {motionSpeed}, 此动作跳过"); return; } self.MotionType = motionType; self.MontionSpeed = motionSpeed; } public static void Play(this AnimatorComponent self, MotionType motionType, float motionSpeed = 1f) { if (!self.HasParameter(motionType.ToString())) { return; } self.MotionType = motionType; self.MontionSpeed = motionSpeed; } public static float AnimationTime(this AnimatorComponent self, MotionType motionType) { AnimationClip animationClip; if (!self.animationClips.TryGetValue(motionType.ToString(), out animationClip)) { throw new Exception($"找不到该动作: {motionType}"); } return animationClip.length; } public static void PauseAnimator(this AnimatorComponent self) { if (self.isStop) { return; } self.isStop = true; if (self.Animator == null) { return; } self.stopSpeed = self.Animator.speed; self.Animator.speed = 0; } public static void RunAnimator(this AnimatorComponent self) { if (!self.isStop) { return; } self.isStop = false; if (self.Animator == null) { return; } self.Animator.speed = self.stopSpeed; } public static void SetBoolValue(this AnimatorComponent self, string name, bool state) { if (!self.HasParameter(name)) { return; } self.Animator.SetBool(name, state); } public static void SetFloatValue(this AnimatorComponent self, string name, float state) { if (!self.HasParameter(name)) { return; } self.Animator.SetFloat(name, state); } public static void SetIntValue(this AnimatorComponent self, string name, int value) { if (!self.HasParameter(name)) { return; } self.Animator.SetInteger(name, value); } public static void SetTrigger(this AnimatorComponent self, string name) { if (!self.HasParameter(name)) { return; } self.Animator.SetTrigger(name); } public static void SetAnimatorSpeed(this AnimatorComponent self, float speed) { self.stopSpeed = self.Animator.speed; self.Animator.speed = speed; } public static void ResetAnimatorSpeed(this AnimatorComponent self) { self.Animator.speed = self.stopSpeed; } } }