Ejemplo n.º 1
0
    // transform and repeat control
    IEnumerator Transform(action[] a)
    {
        if (thisType == type.intro)
        {
            manager.PlayClip(0);
        }

        // initialize
        float newX = a[pos].startLoc[0];
        float newY = a[pos].startLoc[1];
        float newZ = a[pos].startLoc[2];

        transform.position = new Vector3(newX, newY, newZ);

        // delay
        yield return(new WaitForSeconds(a[pos].movDelay));

        // do action
        float start = Time.time;

        if (thisType == type.intro)
        {
            manager.PlayClip(1);
        }

        while (!triggerNext && a[pos].movDuration != 0)
        {
            float percent = (Time.time - start) / a[pos].movDuration;

            // if 100%, end transform
            if (percent >= 1)
            {
                newX = a[pos].endLoc[0];
                newY = a[pos].endLoc[1];
                newZ = a[pos].endLoc[2];

                transform.position = new Vector3(newX, newY, newZ);

                break;
            }

            // else, move
            else
            {
                newX = Mathf.Lerp(a[pos].startLoc[0], a[pos].endLoc[0], percent);
                newY = Mathf.Lerp(a[pos].startLoc[1], a[pos].endLoc[1], percent);
                newZ = Mathf.Lerp(a[pos].startLoc[2], a[pos].endLoc[2], percent);

                transform.position = new Vector3(newX, newY, newZ);
            }
            yield return(new WaitForEndOfFrame());
        }

        // wait for rotation to finish
        yield return(new WaitForSeconds((a[pos].rotDelay + a[pos].rotDuration) - (a[pos].movDelay + a[pos].movDuration)));

        // execute again if list isn't empty and intro type
        if (a.Length - 1 > 0 && thisType == type.intro)
        {
            // remove action
            var a_list = new List <action>(a);
            a_list.RemoveAt(0);

            // restart
            StartCoroutine(Transform(a_list.ToArray()));
            StartCoroutine(Rotate(a_list.ToArray()));
        }

        // execute on next position
        if (thisType == type.outro)
        {
            while (!triggerNext)
            {
                yield return(new WaitForEndOfFrame());
            }
            triggerNext = false;
            StartCoroutine(Transform(actions));
            StartCoroutine(Rotate(actions));
        }
    }