IEnumerator CrossForward(Vector3 to, Location.EndPassHandler endHandler) { Vector3 toward = to - transform.position; forwardDirection = toward.normalized; // while ( (transform.position - to).magnitude > Speed.magnitude * Time.deltaTime ) { while (Vector3.Dot((transform.position - to), toward) < 0) { m_forwardSpeed = Mathf.Clamp(m_forwardSpeed + Acceleration * Time.deltaTime, 0, MaxSpeed); transform.position += Speed * Time.deltaTime; yield return(new WaitForEndOfFrame()); } endHandler(); }
public void CrossMoveTo(Vector3 toPosition, Location.EndPassHandler endHandler) { Vector3 toward = toPosition - transform.position; if (Vector3.Angle(transform.forward, toward) < 1f) // move forward { StartCoroutine(CrossForward(toPosition, endHandler)); } else if (Mathf.RoundToInt(Vector3.Angle(transform.forward, toward)) == 90) // move back { // TODO : add the turn back animation transform.position = toPosition; endHandler(); } else // turn { StartCoroutine(CrossTurn(toPosition, endHandler)); } }
IEnumerator CrossTurn(Vector3 to, Location.EndPassHandler endHandler) { Vector3 fromPos = transform.position; Vector3 toward = to - fromPos; Vector3 coordinateY = transform.forward.normalized; Vector3 coordinateX = Vector3.Cross(coordinateY, Vector3.up).normalized; if (Vector3.Dot(toward, coordinateX) < 0) // set the coordinate point of to position to be positive { coordinateX = -coordinateX; } float radiusX = Vector3.Dot(coordinateX, toward); float radiusY = Vector3.Dot(coordinateY, toward); float angle = 0; // angle of rotation in radian // make a turn // while( (transform.position - to).magnitude > Speed.magnitude * Time.deltaTime * 2f ) { while (angle < Mathf.PI / 2f) { m_forwardSpeed = Mathf.Clamp(m_forwardSpeed + Acceleration * Time.deltaTime, 0, MaxSpeed); angle += m_forwardSpeed * Time.deltaTime / radiusX; Vector3 offsetFromTo = Vector3.zero; offsetFromTo -= coordinateX * radiusX * Mathf.Cos(angle); offsetFromTo -= coordinateY * radiusY * (1f - Mathf.Sin(angle)); transform.position = to + offsetFromTo; forwardDirection = (Mathf.Cos(angle) * coordinateY + Mathf.Sin(angle) * coordinateX).normalized; transform.forward = forwardDirection; yield return(new WaitForEndOfFrame()); } endHandler(); }