IEnumerator RunActions()
    {
        for (actionIndex = 0; actionIndex < actions.Length; actionIndex++)
        {
            switch (actions[actionIndex].type)
            {
            case (BulletActionType.Wait):
                float waitT;
                if (actions[actionIndex].randomWait)
                {
                    waitT = Random.Range(actions[actionIndex].waitTime.x, actions[actionIndex].waitTime.y);
                }
                else
                {
                    waitT = actions[actionIndex].waitTime.x;
                }
                if (actions[actionIndex].rankWait)
                {
                    waitT += BulletManager.instance.rank * actions[actionIndex].waitTime.z;
                }
                waitT *= BulletManager.instance.timePerFrame;
                yield return(new WaitForSeconds(waitT));

                break;

            case (BulletActionType.ChangeDirection):
                if (actions[actionIndex].waitForChange)
                {
                    yield return(StartCoroutine(ChangeDirection(actionIndex)));
                }
                else
                {
                    StartCoroutine(ChangeDirection(actionIndex));
                }
                break;

            case (BulletActionType.ChangeSpeed):
                if (actions[actionIndex].waitForChange)
                {
                    yield return(StartCoroutine(ChangeSpeed(actionIndex, false)));
                }
                else
                {
                    StartCoroutine(ChangeSpeed(actionIndex, false));
                }
                break;

            case (BulletActionType.StartRepeat):
                yield return(StartCoroutine(RunNestedActions()));

                break;

            case (BulletActionType.Fire):
                if (master != null)
                {
                    master.Fire(tform, actions[actionIndex], param, prw);
                }
                break;

            case (BulletActionType.VerticalChangeSpeed):
                if (actions[actionIndex].waitForChange)
                {
                    yield return(StartCoroutine(ChangeSpeed(actionIndex, true)));
                }
                else
                {
                    StartCoroutine(ChangeSpeed(actionIndex, true));
                }
                break;

            case (BulletActionType.Deactivate):
                Deactivate();
                break;
            }
        }
    }