You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
220 lines
4.7 KiB
220 lines
4.7 KiB
using System; |
|
using UnityEngine; |
|
|
|
namespace ET |
|
{ |
|
[ObjectSystem] |
|
public class AnimatorComponentAwakeSystem : AwakeSystem<AnimatorComponent> |
|
{ |
|
public override void Awake(AnimatorComponent self) |
|
{ |
|
self.Awake(); |
|
} |
|
} |
|
|
|
[ObjectSystem] |
|
public class AnimatorComponentUpdateSystem : UpdateSystem<AnimatorComponent> |
|
{ |
|
public override void Update(AnimatorComponent self) |
|
{ |
|
self.Update(); |
|
} |
|
} |
|
|
|
[ObjectSystem] |
|
public class AnimatorComponentDestroySystem : DestroySystem<AnimatorComponent> |
|
{ |
|
public override void Destroy(AnimatorComponent self) |
|
{ |
|
self.animationClips = null; |
|
self.Parameter = null; |
|
self.Animator = null; |
|
} |
|
} |
|
|
|
[FriendClass(typeof(AnimatorComponent))] |
|
public static class AnimatorComponentSystem |
|
{ |
|
public static void Awake(this AnimatorComponent self) |
|
{ |
|
Animator animator = self.Parent.GetComponent<GameObjectComponent>().GameObject.GetComponent<Animator>(); |
|
|
|
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; |
|
} |
|
} |
|
} |