Exemple #1
0
    // 배회중
    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;
    }