using UnityEngine; public class IVMateChasePlayer : IState { IVMate owner; IVCharacter player; StateHandler stateHandler; float pow2MinDistToPlayer; public IVMateChasePlayer(IVMate owner, IVCharacter player) { this.owner = owner; this.player = player; pow2MinDistToPlayer = GameProperty.Instance.DistRangeMateToPlayer.x * GameProperty.Instance.DistRangeMateToPlayer.x; } public void Enter(StateHandler excutor) { stateHandler = excutor; #if UNITY_EDITOR if (owner.SkeletonAnimation != null && owner.SkeletonAnimation.TryGetAnimation("move", out Spine.Animation _)) #endif owner.SkeletonAnimation.AnimationState.SetAnimation(0, "move", true); } public void Excute() { if(IsPlayerTooNear()) { stateHandler.ChangeState(new IVMateIdle(owner, player)); } else { Vector2 dir = player.transform.position - owner.transform.position; dir.Normalize(); Vector3 newPosition = (Vector2)owner.transform.position + (dir * owner.Data.DefaultMoveSpeed * Time.unscaledDeltaTime); newPosition.z = owner.transform.position.z; owner.transform.position = newPosition; owner.ChangeLookDirection(player.transform); } } public void Exit() { stateHandler = null; } bool IsPlayerTooNear() { float sqrtDist = Vector2.SqrMagnitude(owner.transform.position - player.transform.position); return sqrtDist <= pow2MinDistToPlayer; } }