Esempio n. 1
0
    IEnumerator RunAction(Type action)
    {
        switch (action)
        {
            #region WALK
        case Type.WALK:
            switch (dir)
            {
            case Direction.NORTH:
                targetPos = transform.position + Vector3.forward;
                break;

            case Direction.EAST:
                targetPos = transform.position + Vector3.right;
                break;

            case Direction.SOUTH:
                targetPos = transform.position + Vector3.back;
                break;

            case Direction.WEST:
                targetPos = transform.position + Vector3.left;
                break;
            }

            initPos = transform.position;

            float timer = 0;        // Vai de 0 até 1 em cada turno
            while (timer < 1)
            {
                timer += (1 / (turnDuration / 1000)) * Time.deltaTime;
                Vector3 pos = transform.position;

                if (dir == Direction.NORTH || dir == Direction.SOUTH)
                {
                    transform.position = new Vector3(pos.x, pos.y, Mathf.Lerp(initPos.z, targetPos.z, timer));
                }
                else if (dir == Direction.EAST || dir == Direction.WEST)
                {
                    transform.position = new Vector3(Mathf.Lerp(initPos.x, targetPos.x, timer), pos.y, pos.z);
                }

                yield return(null);
            }
            break;
            #endregion

            #region ROTATECW
        case Type.ROTATECW:
            initRot = transform.rotation.eulerAngles.y;

            timer = 0;        // Vai de 0 até 1 em cada turno
            while (timer < 1)
            {
                timer += (1 / (turnDuration / 1000)) * Time.deltaTime;
                Quaternion rot = transform.rotation;
                transform.rotation = Quaternion.Euler(0, Mathf.Lerp(initRot, initRot + 90, timer), 0);

                yield return(null);
            }

            int dirIndex = (int)dir;

            if (dirIndex == 3)
            {
                dirIndex = 0;
            }
            else
            {
                dirIndex++;
            }

            dir = (Direction)dirIndex;
            break;
            #endregion

            #region ROTATECC
        case Type.ROTATECC:
            initRot = transform.rotation.eulerAngles.y;

            timer = 0;        // Vai de 0 até 1 em cada turno
            while (timer < 1)
            {
                timer += (1 / (turnDuration / 1000)) * Time.deltaTime;
                Quaternion rot = transform.rotation;
                transform.rotation = Quaternion.Euler(0, Mathf.Lerp(initRot, initRot - 90, timer), 0);

                yield return(null);
            }

            dirIndex = (int)dir;

            if (dirIndex == 0)
            {
                dirIndex = 3;
            }
            else
            {
                dirIndex--;
            }

            dir = (Direction)dirIndex;
            break;
            #endregion

            #region TELEPORT
        case Type.TELEPORT:
            Teleport();
            break;
            #endregion

            #region IF
        case Type.IF:

            CheckBlock();
            break;
            #endregion
        }

        if (comp.CheckComplete(transform))
        {
            StopAllCoroutines();
        }
    }