Esempio n. 1
0
    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();
    }
Esempio n. 2
0
    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));
        }
    }
Esempio n. 3
0
    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();
    }