using System.Collections; 
 | 
using System.Collections.Generic; 
 | 
using UnityEngine; 
 | 
using System; 
 | 
  
 | 
public class CircleMoveTo : MonoBehaviour 
 | 
{ 
 | 
    public float circleTime = 1f; 
 | 
    public float duration = 2f; 
 | 
    public float ratio = 3; 
 | 
    public float accelerate = 0.2f; 
 | 
  
 | 
    [SerializeField] 
 | 
    Vector3 m_Desitination = Vector3.zero; 
 | 
    public Vector3 destination { 
 | 
        get { return m_Desitination; } 
 | 
        private set { 
 | 
            m_Desitination = value; 
 | 
        } 
 | 
    } 
 | 
  
 | 
    Vector3 forward = Vector3.zero; 
 | 
    float timer = 0f; 
 | 
    float endTime = 0f; 
 | 
    float velocity = 0f; 
 | 
  
 | 
    bool windUp = false; 
 | 
    Vector3 refPosition = Vector3.zero; 
 | 
    Action onReach; 
 | 
    bool beginMove = false; 
 | 
  
 | 
    public void MoveTo(Vector3 _destination, Action _callBack = null) 
 | 
    { 
 | 
        this.SetActive(true); 
 | 
        windUp = false; 
 | 
        velocity = 0f; 
 | 
        destination = _destination; 
 | 
        beginMove = true; 
 | 
        endTime = Time.time + duration; 
 | 
        refPosition = Vector3.zero; 
 | 
        onReach = _callBack; 
 | 
    } 
 | 
  
 | 
    void FixedUpdate() 
 | 
    { 
 | 
        if (!beginMove) 
 | 
        { 
 | 
            return; 
 | 
        } 
 | 
  
 | 
        if (Time.time > endTime && !windUp) 
 | 
        { 
 | 
            var normalize1 = Vector3.Normalize(destination.SetZ(0)); 
 | 
            var normalize2 = Vector3.Normalize(this.transform.position.SetZ(0)); 
 | 
            var dot = Vector3.Dot(normalize1, normalize1 - normalize2); 
 | 
            if (dot > -0.15f && dot < 0.15f) 
 | 
            { 
 | 
                windUp = true; 
 | 
            } 
 | 
        } 
 | 
  
 | 
        if (windUp) 
 | 
        { 
 | 
            var newPosition = Vector3.SmoothDamp(this.transform.position, destination, ref refPosition, 0.25f); 
 | 
            this.transform.position = newPosition; 
 | 
            this.transform.localPosition = this.transform.localPosition.SetZ(0); 
 | 
            if (Vector3.Distance(this.transform.position.SetZ(0), destination.SetZ(0)) < 0.01f) 
 | 
            { 
 | 
                if (onReach != null) 
 | 
                { 
 | 
                    onReach(); 
 | 
                    onReach = null; 
 | 
                } 
 | 
  
 | 
                beginMove = false; 
 | 
                this.SetActive(false); 
 | 
            } 
 | 
        } 
 | 
        else 
 | 
        { 
 | 
            velocity += Time.deltaTime * accelerate; 
 | 
            timer += Time.deltaTime; 
 | 
            if (timer > circleTime) 
 | 
            { 
 | 
                timer = timer - circleTime; 
 | 
            } 
 | 
  
 | 
            var t = Mathf.Clamp01(timer / circleTime); 
 | 
            forward = new Vector3(Mathf.Sin(2 * t * Mathf.PI), Mathf.Cos(2 * t * Mathf.PI), 0f); 
 | 
            this.transform.position += Vector3.Normalize(forward) * Mathf.Pow(velocity, ratio); 
 | 
        } 
 | 
  
 | 
    } 
 | 
  
 | 
  
 | 
} 
 |