//상태 진입 public override void Enter() { isCycling = false; //사이클 실행중이 아님 skillSetState = M_AttackSkillSetState.SkillSet_1; //스킬 세트 1에서부터 사용 //////Debug.Log("Enter Attack"); }
//사이클 범위 내 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); } }