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);
|
}
|
|
}
|
|
|
}
|