Example #1
0
    void InitPatterns()
    {
        k514RotateOn tmp0 = (k514RotateOn)k514EnemyPatternFactory.CreatePattern <k514RotateOn>(this);

        tmp0.Init(this, Vector3.up);
        patterns.Add(tmp0);

        k514MoveDirect tmp = (k514MoveDirect)k514EnemyPatternFactory.CreatePattern <k514MoveDirect>(this);

        tmp.Init(this, Vector3.forward * 20);
        patterns.Add(tmp);

        tmp = (k514MoveDirect)k514EnemyPatternFactory.CreatePattern <k514MoveDirect>(this);
        tmp.Init(this, new Vector3(40, 0, 20));
        patterns.Add(tmp);

        k514MoveBezier tmp2 = (k514MoveBezier)k514EnemyPatternFactory.CreatePattern <k514MoveBezier>(this);

        tmp2.Init(this, new Vector3(20, 40, 20), new Vector3(40, 60, 40), new Vector3(20, 0, 20), new Vector3(0, 0, 40));
        patterns.Add(tmp2);
    }
Example #2
0
    public void InitPattern(int id)
    {
        this.id          = id;
        transform.parent = null;
        float RandomCubric = 3;
        float Radius1 = Random.Range(7f, 12f), Radius2 = Random.Range(7f, 16f);
        float theta    = Random.Range(-45f, 225f) * Mathf.Deg2Rad;
        float distance = 0f;

        targetPlace  = k514SystemManager.InteractMgr.GetCrossHairTargetTransform();
        targetVector = (targetPlace == null) ? transform.position + Vector3.forward * 30f : targetPlace.position;
        // randomize
        targetVector += new Vector3(Random.Range(-RandomCubric, RandomCubric), Random.Range(-2, 2), Random.Range(-RandomCubric, RandomCubric + 2));

        // get distance
        distance = (transform.position - targetVector).magnitude;

        // add patterns

        List <k514EnemyBehaviour> tmp;
        k514PatternedShot         tmp3 = null;
        k514WaitSec    tmp4            = null;
        k514MoveDirect tmp5            = null;
        Vector3        here            = k514SystemManager.InteractMgr.GetPlayerVector();

        float sin = Mathf.Sin(theta), cos = Mathf.Cos(theta);

        k514MoveBezier tmp2 = (k514MoveBezier)k514EnemyPatternFactory.CreatePattern <k514MoveBezier>(this);

        tmp2.Init(this, here, here + new Vector3(Radius1 * cos, Radius1 * sin, distance * 0.1f), here + new Vector3(Radius2 * cos, Radius2 * sin, distance * 0.66f), targetVector);

        // set Speed
        tmp2.SetSpeed(1000f);
        tmp2.SetLifeSpanCnt(20);
        tmp2.SetMoveTime(0.005f);

        patterns.Add(tmp2);

        ActivateTrig = true;
    }
Example #3
0
    protected IEnumerator AttackPattern1()
    {
        yield return(null);

        yield return(new WaitForSeconds(firstAttackInterval));

        List <k514EnemyBehaviour> tmp;
        k514MoveBezier            tmp2 = null;
        k514PatternedShot         tmp3 = null;
        k514WaitSec          tmp4      = null;
        k514MoveDirect       tmp5      = null;
        k514PlaySoundPattern tmp6      = null;

        // 반지름 5로 나선형으로 탄막이 6개 펼쳐지는 탄
        int     emit_danmak = 4;
        float   radius = 20f, theta0, theta1, sin0, cos0, sin1, cos1, inversed_emit = 360f / emit_danmak;
        Vector3 here;

        while (true)
        {
            for (int i = 0; i < 5; i++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT1, false);
                for (int j = 0; j < emit_danmak; j++)
                {
                    // bullet generate
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.TEST2, transform.forward, 0.1f, 5f, null, 12);
                    bullet.position        = here = transform.position;
                    bullet.gameObject.name = "Test2";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    tmp3 = bullet.GetComponent <k514PatternedShot>();

                    // not loop the pattern
                    tmp3.SetLoop(false);

                    // set math factor
                    theta0 = j * inversed_emit * Mathf.Deg2Rad;
                    theta1 = (j * inversed_emit + 30f) * Mathf.Deg2Rad;
                    sin0   = Mathf.Sin(theta0);
                    cos0   = Mathf.Cos(theta0);
                    sin1   = Mathf.Sin(theta1);
                    cos1   = Mathf.Cos(theta1);

                    // get patterns list
                    tmp = tmp3.patterns;

                    // bullet pattern 0 : 나선
                    tmp2 = (k514MoveBezier)k514EnemyPatternFactory.CreatePattern <k514MoveBezier>(tmp3);
                    tmp3.SetInfo(tmp2);
                    tmp2.Init(tmp3, here, here + new Vector3(0.33f * radius * cos1, 0.33f * radius * sin1, 0f), here + new Vector3(0.66f * radius * cos1, 0.66f * radius * sin1, 0f), here + new Vector3(radius * cos0, radius * sin0, 0f), 1f - 0.2f * i);
                    tmp.Add(tmp2);

                    // bullet pattern 1 : 대기
                    tmp4 = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(tmp3);
                    tmp3.SetInfo(tmp4);
                    tmp4.Init(tmp3, 3f - i * 0.3f);
                    tmp.Add(tmp4);

                    if (i == 4)
                    {
                        // bullet pattern 2 : KIRA
                        tmp6 = (k514PlaySoundPattern)k514EnemyPatternFactory.CreatePattern <k514PlaySoundPattern>(tmp3);
                        tmp6.Init(tmp3, SFX_TYPE_EFFECT.KIRA);
                        tmp.Add(tmp6);
                    }

                    // bullet pattern 3 : 대기
                    tmp4 = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(tmp3);
                    tmp3.SetInfo(tmp4);
                    tmp4.Init(tmp3, 0.1f);
                    tmp.Add(tmp4);

                    // bullet pattern 4 : 발사
                    tmp5 = (k514MoveDirect)k514EnemyPatternFactory.CreatePattern <k514MoveDirect>(tmp3);
                    tmp3.SetInfo(tmp5);
                    tmp5.Init_LateMoving(tmp3);
                    tmp.Add(tmp5);

                    // bullet pattern 5 : 대기
                    tmp4 = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(tmp3);
                    tmp3.SetInfo(tmp4);
                    tmp4.Init(tmp3, 0.05f);
                    tmp.Add(tmp4);

                    // regist danmak
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                }
                yield return(new WaitForSeconds(0.2f));
            }
            yield return(coolTime);

            yield return(coolTime);
        }
    }
Example #4
0
    // 통상패턴
    IEnumerator NormalPattern()
    {
        yield return(null);

        yield return(new WaitForSeconds(10f));

        WaitForSeconds         cooldown      = new WaitForSeconds(4f);
        WaitForSeconds         shotInterval  = null;
        Transform              bullet        = null;
        k514PatternedShot      patternedShot = null;
        k514BulletBirthPattern moveDirect    = null;
        k514WaitSec            waitPattern   = null;
        k514ChangeScale        scalePattern  = null;
        k514ChangeRotate       rotatePattern = null;
        k514PlaySoundPattern   soundPattern  = null;
        k514MoveDirect         movePattern   = null;
        k514BulletBirthPattern birthPattern  = null;
        k514MoveBezier         bezierPattern = null;

        Vector3 tar;

        List <k514EnemyBehaviour> list;

        while (this.HP > 500)
        {
            for (int i = 0; i < Random.Range(3, 6); i++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT2, false);
                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + new Vector3(Random.Range(-14f, 14f), Random.Range(-6f, 6f), 0f);
                bullet.Rotate(Vector3.forward, Random.Range(0f, 180f));
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;

                // 0.5초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.5f);
                list.Add(waitPattern);


                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);

                // 0.5초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.1f);
                list.Add(waitPattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, 1f), 30f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());

                yield return(new WaitForSeconds(0.1f));
            }
            yield return(cooldown);
        }


//        1스펠 선언 및 체력회복
        k514SystemManager.UI_SpecaMgr.EnemySpellAnimate(0, 2f);
        k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.SPELL_ACTIVE);
        this.HP += 700;


        yield return(new WaitForSeconds(2f));

        cooldown = new WaitForSeconds(8f);

        float theta  = 0f;
        int   step   = 0;
        float radius = 8f;
        float r_step = 0f;

        while (this.HP > 700)
        {
            step = Random.Range(3, 9);

            // 전방사격
            StartCoroutine(ForwardShot());
            yield return(new WaitForSeconds(0.3f));

            k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.KIRA, false);

            for (int i = 0; i < step; i++)
            {
                r_step = 360f / step;
                theta  = i * r_step;
                theta *= Mathf.Deg2Rad;

                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + radius * new Vector3(Mathf.Cos(theta), Mathf.Sin(theta), 2f);
                bullet.Rotate(Vector3.back, 90f - i * r_step);
                bullet.Rotate(Vector3.right, 90f);
                //bullet.up = k514SystemManager.InteractMgr.GetPlayerHitVectorFrom(bullet.position);
                Debug.Log(bullet.up);
                //bullet.LookAt(transform.position);
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();


                // not loop the pattern
                patternedShot.SetLoop(false);


                // get patterns list
                list = patternedShot.patterns;


                // 0.2초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.5f);
                list.Add(waitPattern);


                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);

                // 0.2초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.2f);
                list.Add(waitPattern);

                if (i == 0)
                {
                    // bullet pattern 2 : KIRA
                    soundPattern = (k514PlaySoundPattern)k514EnemyPatternFactory.CreatePattern <k514PlaySoundPattern>(patternedShot);
                    soundPattern.Init(patternedShot, SFX_TYPE_BULLET.BEAM);
                    list.Add(soundPattern);
                }


                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
            }

            yield return(cooldown);
        }



//        통상 2
        while (this.HP > 500)
        {
            StartCoroutine(ForwardShot());

            for (int i = 0; i < Random.Range(5, 8); i++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT2, false);
                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + new Vector3(Random.Range(-14f, 14f), Random.Range(-6f, 6f), 0f);
                bullet.Rotate(Vector3.forward, Random.Range(0f, 180f));
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;

                // 0.5초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.5f);
                list.Add(waitPattern);


                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);

                // 0.5초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.1f);
                list.Add(waitPattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, 1f), 30f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());

                yield return(new WaitForSeconds(0.1f));
            }
            yield return(cooldown);
        }


//        2스펠 선언 및 체력회복
        k514SystemManager.UI_SpecaMgr.EnemySpellAnimate(1, 2f);
        k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.SPELL_ACTIVE);
        this.HP += 700;

        yield return(new WaitForSeconds(2f));

        cooldown     = new WaitForSeconds(3f);
        shotInterval = new WaitForSeconds(0.2f);

        while (this.HP > 700)
        {
            for (int i = 0; i < 5; i++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT2, true);
                theta  = Random.Range(2f, 12f);
                step   = Random.Range(12, 23);
                radius = Random.Range(-0.23f, 0.23f);
                r_step = theta / step;
                for (int j = 0; j < step; j++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.SHADOW, ((k514SystemManager.InteractMgr.GetPlayerHitVector() + new Vector3(theta - 2f * j * r_step, radius, 0f) - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position;
                    bullet.gameObject.name = "Shadow";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());

                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.TEST, ((k514SystemManager.InteractMgr.GetPlayerHitVector() + new Vector3(-theta + 2f * j * r_step, -radius, 0f) - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position;
                    bullet.gameObject.name = "Test";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                    yield return(new WaitForSeconds(0.02f));
                }

                yield return(shotInterval);
            }
            yield return(cooldown);
        }



        cooldown = new WaitForSeconds(5f);
        while (this.HP > 500)
        {
            step = Random.Range(5, 8);
            for (int i = 0; i < step; i++)
            {
                theta = Random.Range(0f, 180f);
                tar   = new Vector3(Random.Range(-14f, 14f), Random.Range(-14f, 14f), 0f);
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.KIRA, false);
                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + tar;
                bullet.Rotate(Vector3.forward, theta);
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;



                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, 1f), 45f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());


                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + tar;
                bullet.Rotate(Vector3.forward, theta + 90f);
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;



                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, 1f), 45f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());


                for (int j = 0; j < 10; j++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.TEST, ((k514SystemManager.InteractMgr.GetPlayerHitVector() - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position + tar + new Vector3(5 - j, 0, 0);
                    bullet.gameObject.name = "Test";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                }
                for (int k = 0; k < 10; k++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.TEST, ((k514SystemManager.InteractMgr.GetPlayerHitVector() - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position + tar + new Vector3(0, 5 - k, 0);
                    bullet.gameObject.name = "Test";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                }


                yield return(new WaitForSeconds(0.15f));
            }
            yield return(cooldown);
        }



//        3스펠 선언 및 체력회복
        k514SystemManager.UI_SpecaMgr.EnemySpellAnimate(2, 2f);
        k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.SPELL_ACTIVE);
        this.HP += 900;

        yield return(new WaitForSeconds(2f));

        cooldown     = new WaitForSeconds(3f);
        shotInterval = new WaitForSeconds(0.2f);

        while (this.HP > 700)
        {
            k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.KIRA, true);
            for (int i = 0; i < 20; i++)
            {
                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + Vector3.up * (20f - 2 * i);
                bullet.Rotate(Vector3.back, 90f);
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();


                // not loop the pattern
                patternedShot.SetLoop(false);


                // get patterns list
                list = patternedShot.patterns;


                // 0.2초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.1f);
                list.Add(waitPattern);


                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(0.3f, 80f, 0.3f));
                list.Add(scalePattern);

                // 0.2초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.2f);
                list.Add(waitPattern);

                if (i == 0)
                {
                    // bullet pattern 2 : KIRA
                    soundPattern = (k514PlaySoundPattern)k514EnemyPatternFactory.CreatePattern <k514PlaySoundPattern>(patternedShot);
                    soundPattern.Init(patternedShot, SFX_TYPE_BULLET.BEAM);
                    list.Add(soundPattern);
                }


                //  이동
                movePattern = (k514MoveDirect)k514EnemyPatternFactory.CreatePattern <k514MoveDirect>(patternedShot);
                movePattern.SetSpeed(5f);
                if (i % 2 == 0)
                {
                    movePattern.Init(patternedShot, Vector3.up * 100f);
                }
                else
                {
                    movePattern.Init(patternedShot, Vector3.down * 100f);
                }
                list.Add(movePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
            }


            for (int i = 0; i < 5; i++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT2, true);
                theta  = Random.Range(2f, 12f);
                step   = Random.Range(12, 23);
                radius = Random.Range(-0.23f, 0.23f);
                r_step = theta / step;
                for (int j = 0; j < step; j++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.SHADOW, ((k514SystemManager.InteractMgr.GetPlayerHitVector() + new Vector3(theta - 2f * j * r_step, radius + Random.Range(-0.2f, 0.2f), 0f) - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position;
                    bullet.gameObject.name = "Shadow";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());

                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.SHADOW, ((k514SystemManager.InteractMgr.GetPlayerHitVector() + new Vector3(-theta + 2f * j * r_step, -radius + Random.Range(-0.2f, 0.2f), 0f) - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position;
                    bullet.gameObject.name = "Shadow";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                    yield return(new WaitForSeconds(0.005f));
                }
                yield return(shotInterval);
            }

            yield return(cooldown);
        }


//    4통상
        cooldown = new WaitForSeconds(5f);
        while (this.HP > 600)
        {
            step = Random.Range(5, 8);
            for (int i = 0; i < step; i++)
            {
                theta = Random.Range(0f, 180f);
                tar   = new Vector3(Random.Range(-14f, 14f), Random.Range(-14f, 14f), 0f);
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.KIRA, false);
                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + tar;
                bullet.Rotate(Vector3.forward, theta);
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;



                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, 1f), 45f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());


                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + tar;
                bullet.Rotate(Vector3.forward, theta + 90f);
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;



                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(1f, 80f, 1f));
                list.Add(scalePattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, 1f), 45f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());


                for (int j = 0; j < 10; j++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.TEST, ((k514SystemManager.InteractMgr.GetPlayerHitVector() - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position + tar + new Vector3(5 - j, 0, 0);
                    bullet.gameObject.name = "Test";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                }
                for (int k = 0; k < 10; k++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.TEST, ((k514SystemManager.InteractMgr.GetPlayerHitVector() - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position + tar + new Vector3(0, 5 - k, 0);
                    bullet.gameObject.name = "Test";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                }


                yield return(new WaitForSeconds(0.15f));
            }
            yield return(cooldown);
        }



        // 4스펠 선언 및 체력회복
        k514SystemManager.UI_SpecaMgr.EnemySpellAnimate(3, 2f);
        k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.SPELL_ACTIVE);
        this.HP += 900;

        yield return(new WaitForSeconds(2f));

        cooldown     = new WaitForSeconds(3f);
        shotInterval = new WaitForSeconds(0.2f);
        float theta0, theta1, sin0, cos0, sin1, cos1, inversed_emit = 0f;

        // Vail scale down
        SetVail(true);
        Vector3 here;

        k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.MUSOU_START, true);
        float time = 2f, inversedTime = 1f / time;
        float startTime = 0f, normalize = 0f;

        while (startTime < time)
        {
            startTime      += Time.deltaTime;
            normalize       = startTime * inversedTime;
            Vail.localScale = Vector3.Lerp(Vector3.one * 0.1f, Vector3.one * 4f, normalize);
            yield return(null);
        }


        while (this.HP > 700)
        {
            // 나선
            k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.MUSOU_START, false);
            step   = Random.Range(2, 8);
            radius = Random.Range(15, 25);

            for (int i = 0; i < step; i++)
            {
                inversed_emit = 360f / step;
                theta0        = i * inversed_emit * Mathf.Deg2Rad;
                theta1        = (i * inversed_emit + 30f) * Mathf.Deg2Rad;
                sin0          = Mathf.Sin(theta0);
                cos0          = Mathf.Cos(theta0);
                sin1          = Mathf.Sin(theta1);
                cos1          = Mathf.Cos(theta1);


                // gene bullet
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT1, false);
                bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.RUMIA, transform.forward, 0.1f, 1f, null, 10);
                bullet.position        = here = transform.position + Vector3.forward * 5f;
                bullet.gameObject.name = "Rumia";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;

                // bullet pattern 0 : 나선
                bezierPattern = (k514MoveBezier)k514EnemyPatternFactory.CreatePattern <k514MoveBezier>(patternedShot);
                patternedShot.SetInfo(bezierPattern);
                bezierPattern.Init(patternedShot, here, here + new Vector3(0.33f * radius * cos1, 0.33f * radius * sin1, 1f), here + new Vector3(0.66f * radius * cos1, 0.66f * radius * sin1, 2f), here + new Vector3(radius * cos0, radius * sin0, 3f), 1f);
                list.Add(bezierPattern);

                // p1 : birth p
                birthPattern = (k514BulletBirthPattern)k514EnemyPatternFactory.CreatePattern <k514BulletBirthPattern>(patternedShot);
                patternedShot.SetInfo(birthPattern);
                birthPattern.Init(patternedShot);
                list.Add(birthPattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
            }


            yield return(cooldown);
        }

        // Vail scale down
        time         = 2f;
        inversedTime = 1f / time;
        startTime    = 0f;
        normalize    = 0f;
        while (startTime < time)
        {
            startTime      += Time.deltaTime;
            normalize       = startTime * inversedTime;
            Vail.localScale = Vector3.Lerp(Vector3.one * 4f, Vector3.one * 0.1f, normalize);
            yield return(null);
        }

        SetVail(false);
        this.HP += 400;
        yield return(new WaitForSeconds(2f));

        // 5 스펠
        k514SystemManager.UI_SpecaMgr.EnemySpellAnimate(4, 2f);
        k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_EFFECT.SPELL_ACTIVE);
        yield return(new WaitForSeconds(2f));

        cooldown     = new WaitForSeconds(3f);
        shotInterval = new WaitForSeconds(0.2f);
        int clip = -1;

        while (this.HP > 0)
        {
            for (int i = 0; i < 3; i++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.BEAM, true);
                theta  = Random.Range(2f, 12f);
                step   = Random.Range(1, 4);
                radius = Random.Range(-0.23f, 0.23f);
                r_step = theta / step;
                for (int j = 0; j < step; j++)
                {
                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.RUMIA2, ((k514SystemManager.InteractMgr.GetPlayerHitVector() + new Vector3((theta - 2f * j * r_step) * clip, 0f, 0f) - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position;
                    bullet.localScale      = Vector3.one * 0.2f;
                    bullet.gameObject.name = "Rumia2";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());

                    bullet                 = k514SystemManager.BulletMgr.CreateBullet <k514OneDirectionShot>(BULLET_TYPE.RUMIA2, ((k514SystemManager.InteractMgr.GetPlayerHitVector() + new Vector3(0f, (-theta + 2f * j * r_step) * clip, 0f) - transform.position)).normalized, 0.05f, 14f);
                    bullet.position        = transform.position;
                    bullet.localScale      = Vector3.one * 0.2f;
                    bullet.gameObject.name = "Rumia2";
                    bullet.parent          = k514SystemManager.BulletMgr.transform;
                    k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
                    clip *= -1;
                    yield return(new WaitForSeconds(0.02f));
                }

                yield return(shotInterval);
            }

            int x = 1 + ((int)MAX_HP - (int)HP) / 120;
            Debug.Log(MAX_HP + " : " + HP + " : " + x);
            for (int xi = 0; xi < x; xi++)
            {
                k514SystemManager.SoundMgr.PlayAudioClip(SFX_TYPE_BULLET.SHOT2, false);
                bullet          = k514SystemManager.BulletMgr.CreateBullet <k514PatternedShot>(BULLET_TYPE.THUNDER, transform.forward, 0.1f, 1f, null, 100);
                bullet.position = transform.position + new Vector3(Random.Range(-20f, 20f), Random.Range(-9f, 9f), Random.Range(10f, 20f));
                bullet.Rotate(Vector3.forward, Random.Range(0f, 180f));
                bullet.gameObject.name = "Thunder";
                bullet.parent          = k514SystemManager.BulletMgr.transform;
                patternedShot          = bullet.GetComponent <k514PatternedShot>();

                // not loop the pattern
                patternedShot.SetLoop(false);

                // get patterns list
                list = patternedShot.patterns;

                // 0.5초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.5f);
                list.Add(waitPattern);


                // 스케일 키우기
                scalePattern = (k514ChangeScale)k514EnemyPatternFactory.CreatePattern <k514ChangeScale>(patternedShot);
                patternedShot.SetInfo(scalePattern);
                scalePattern.Init(patternedShot, new Vector3(0.5f, 80f, 0.5f));
                list.Add(scalePattern);

                // 0.5초 대기
                waitPattern = (k514WaitSec)k514EnemyPatternFactory.CreatePattern <k514WaitSec>(patternedShot);
                patternedShot.SetInfo(waitPattern);
                waitPattern.Init(patternedShot, 0.1f);
                list.Add(waitPattern);


                // 회전
                rotatePattern = (k514ChangeRotate)k514EnemyPatternFactory.CreatePattern <k514ChangeRotate>(patternedShot);
                patternedShot.SetInfo(rotatePattern);
                rotatePattern.Init(patternedShot, new Vector3(0f, 0f, Random.Range(-1f, 1f)), 30f);
                list.Add(rotatePattern);

                k514SystemManager.BulletMgr.bulletPool.Add(bullet.GetComponent <k514BulletBridge>());
            }
            yield return(cooldown);
        }
    }