// 배회중 protected IEnumerator HangAround() { Coroutine_HangAround = true; // 배회에 필요한 데이터 Vector3 OriginPoint = transform.position; float v = UnityEngine.Random.Range(-1f, 1f); float h = UnityEngine.Random.Range(-1f, 1f); // 목표 지점 설정 //TargetPostion = v * Vector3.forward + h * Vector3.right; //TargetPostion *= 3f; //TargetPostion += OriginPoint; while (true) { // 타겟 잡히면 종료 if (Target != null) { Astar.FindPathStop(); grid.pathfind_active = false; m_Animator.SetInteger("IdleSTATE", (int)AnimIdle.Crawl_to_State); m_Animator.SetBool("TraceSTATE", true); LockRotation = false; m_IdleType = IdleType.Max; //m_nowState = STATE.TRACE; break; } // 거리가 1미만일때, 먹는시간 n초 이상일때 if (distance <= 1.5f /* || EatingTime >= 3f*/) { LockRotation = true; EatingTime = 0; // 아이들상태 m_Animator.SetInteger("IdleSTATE", (int)AnimIdle.Crawl_Idle); //다음 행동 결정 //IdleAction = 5; IdleAction = UnityEngine.Random.Range(0, 10); IdleTime = UnityEngine.Random.Range(2f, 3f); IdleCheckTime = 0; // 랜덤 시간 후에~ 행동 yield return(new WaitUntil(() => CheckDetectEnemy() == true)); // 기어가기 if (IdleAction >= 5) { distance = 3f; // 기어가는 애니메이션 출력 //m_Animator.SetInteger("IdleSTATE", (int)AnimIdle.Crawl); // 임시로 사용할 목적지 설정 코드 //OriginPoint = transform.position; //v = UnityEngine.Random.Range(-1f, 1f); //h = UnityEngine.Random.Range(-1f, 1f); // 목표 지점 설정 //TargetPostion = v * Vector3.forward + h * Vector3.right; //TargetPostion *= 3f; //TargetPostion += OriginPoint; //// 기존 에이스타 코드 //// 목적지 설정 var Neighbours = grid.GetNeighbours(grid.NodeFromWorldPoint(m_SectorPos.position, GRIDTYPE.Detailed), m_Sector.m_SectorSize.x, m_Sector.m_SectorSize.y, GRIDTYPE.Detailed); AroundList.Clear(); Node node; for (int i = 0; i < Neighbours.Count; i++) { node = Neighbours[i]; if (node.walkable && Astar.MonsterCheak(node, OriginPosition).Equals(-1)) { var node2 = grid.GetNeighboursToCross(node); var flag = false; for (int j = 0; j < node2.Count; j++) { if (!node2[j].walkable || Astar.MonsterCheak(node2[j], OriginPoint).Equals(1)) { flag = true; break; } } if (!flag) { AroundList.Add(node); } } } //for (var i = 0; i < AroundList.Count; i++) //{ // if (i > AroundList.Count * 0.25) // AroundList.RemoveAt(i); // if (i > (AroundList.Count * 0.25 + AroundList.Count * 0.5)) // break; //} TargetPostion = AroundList[UnityEngine.Random.Range(0, AroundList.Count - 1)].worldPosition; LockRotation = false; yield return(new WaitForSeconds(0.1f)); } // 먹기 else { // 먹는 애니메이션 출력 m_Animator.SetInteger("IdleSTATE", (int)AnimIdle.Eating); distance = 1.5f; yield return(new WaitForSeconds(3f)); } } // 걷기상태 if (IdleAction >= 5) { // 기존 에이스타 코드 // 목적지로 이동 int index = MoveToTarget(WalkSpeed, TargetPostion); if (index.Equals(1)) { m_Animator.SetInteger("IdleSTATE", (int)AnimIdle.Crawl); distance = Vector3.Distance(transform.position, TargetPostion); } else if (index.Equals(0)) { distance = 1.5f; } // 임시 사용 코드 //distance = Vector3.Distance(transform.position, TargetPostion); //CC.Move(transform.forward * OriginWalkSpeed * Time.deltaTime); } yield return(null); } Coroutine_HangAround = false; }