Пример #1
0
    //상태 진입
    public override void Enter()
    {
        isCycling     = false;                                              //사이클 실행중이 아님
        skillSetState = M_AttackSkillSetState.SkillSet_1;                   //스킬 세트 1에서부터 사용

        //////Debug.Log("Enter Attack");
    }
Пример #2
0
    //사이클 범위 내
    void InCycle()
    {
        //플레이어가 직선거리상에 위치하고 있다면 공격 실행
        if (m_Core.CheckSight().isPlayerInStraightLine)
        {
            //사이클 실행중이 아니었으면 사이클 실행
            if (!isCycling)
            {
                isCycling     = true;
                skillSetState = M_AttackSkillSetState.SkillSet_1;                   //시작은 스킬 세트 1부터

                m_Core.delayTime = 0.8f;                                            //진입 시점에서 살짝 딜레이
            }

            //스킬을 선택할 때 사용할 랜덤 값 설정
            Random.seed = (int)System.DateTime.Now.Ticks;                           //랜덤값의 시드를 무작위로 만든다
            int randomChance = Random.Range(0, 1000);

            //<<추가>>  스킬을 추가 삭제가 자유롭고, 확률을 설정하면 자동으로 계산할 수 있도록 해야 할 듯. 확률 자동화 필요 <- 룰렛 알고리즘?
            //          그러기 위해선 스킬 세트에 소속된 스킬과 그 확률 정보를 설정하여 저장할 수 있게 해야한다

            switch (skillSetState)
            {
            //스킬세트 1 (약 공격)
            case M_AttackSkillSetState.SkillSet_1:
            {
                //스킬 세트 1은 이동하면서 사용한다
                m_Core.NvAgent.Resume();
                m_Core.SetDestinationRealtime(true, m_Core.PlayerTr);               //이 경우, 스킬 사용으로 판단이 멈추더라도 목적지 정보가 계속 갱신되어야 한다
                m_Core.Animator.SetBool("IsRunning", true);

                if (randomChance < 500)
                {
                    attackSkillState = M_AttackSkillState.Magic_1;
                    StartCoroutine(M_Magic_1.instance.UseSkill(m_Core.PlayerTr.position));          //마법 1 사용
                }
                else
                {
                    attackSkillState = M_AttackSkillState.Magic_2;
                    StartCoroutine(M_Magic_2.instance.UseSkill(m_Core.PlayerTr.position));          //마법 2 사용
                }

                skillSetState = M_AttackSkillSetState.SkillSet_2;                   //그 다음엔 스킬 세트 2를 진행해야 함
            }
            break;

            //스킬세트 2 (강 공격)
            case M_AttackSkillSetState.SkillSet_2:
            {
                m_Core.NvAgent.Stop();
                m_Core.SetDestinationRealtime(false, null);
                m_Core.Animator.SetBool("IsRunning", false);

                //아직은 스킬 세트 2에 소속된 스킬은 에너지 방출밖에 없다
                attackSkillState = M_AttackSkillState.EnergyEmission;
                StartCoroutine(M_EnergyEmission.instance.UseSkill(m_Core.PlayerTr.position)); //에너지 방출 사용

                skillSetState = M_AttackSkillSetState.SkillSet_1;                             //스킬 세트 2를 사용한 후엔 다시 스킬 세트 1을 진행해야 함
            }
            break;
            }
        }


        //플레이어가 직선거리상에 위치하고 있지 않다면 (장애물에 가려진다던가 해서) 플레이어 따라서 이동
        else
        {
            m_Core.delayTime = 0.1f;                                                //업데이트 주기 설정

            m_Core.NvAgent.Resume();
            m_Core.NvAgent.destination = m_Core.PlayerTr.position;
            m_Core.SetDestinationRealtime(false, null);                             //이 경우 업데이트가 0.1초 간격으로 이미 진행되고 있기 때문에 특별하게 따로 갱신할 필요는 없음
            m_Core.Animator.SetBool("IsRunning", true);
        }
    }