using System; using UnityEngine; [Serializable] public class EnemyChasePlayer : State { StatData moveSpeedPerSecStat; float moveSpeedPerSec => moveSpeedPerSecStat != null ? moveSpeedPerSecStat.Value : 0; Entity target; float sqrtTargetDist; protected override void OnInitialize() { Owner.Excutor.Data.TryGetStat(StatID.MoveSpeedPerSec, out moveSpeedPerSecStat); } public override void Enter() { if(target is null) { Owner.ChangeState(); return; } Debug.Assert(Owner.Excutor.SkeletonAnimation.TryGetAnimation("move", out Spine.Animation _), "move animation not exist"); Owner.Excutor.SkeletonAnimation.AnimationState.SetAnimation(0, "move", true); } public override void Excute() { if(target is null) { Owner.ChangeState(); } else { Owner.Excutor.ChangeLookDirection(target.transform); Vector2 to = target.Position - Owner.Excutor.Position; if (to.sqrMagnitude <= sqrtTargetDist) { Owner.ChangeState(); } else { Vector3 newPosition = Owner.transform.position + (Vector3)(to.normalized * moveSpeedPerSec * Time.fixedDeltaTime); Owner.transform.position = newPosition; } } } public override void Exit() { target = null; sqrtTargetDist = 0; } public void SetTarget(Entity target, float targetDist) { this.target = target; sqrtTargetDist = targetDist * targetDist; } }