Пример #1
0
    public override void InSightRange() //시야 범위 안 레이쏘기
    {
        rayPosition.x = transform.position.x;
        rayPosition.y = transform.position.y + 1.35f;
        rayPosition.z = transform.position.z;

        Vector3 survivorPosition = SightRange.getSurvivors().transform.position - transform.position;

        if (Physics.Raycast(rayPosition, survivorPosition, out rayHit, MAX_RAY_DISTANCE))
        {
            if (rayHit.collider.tag == "Player")
            {
                LookTarget = SightRange.getSurvivors().transform.gameObject;
                state      = State.Look;
                LookTarget.GetComponent <SurvivorStatus>().SetBW(gameObject);
            }
        }
    }
Пример #2
0
    IEnumerator Look()
    {
        //들어갈때
        if (Audio != null)
        {
            Audio.Play("Look", LookTarget);
            Audio.Play("Walk");
        }
        if (backMoveFlag)
        {
            state      = State.Idle;
            LookTarget = null;
        }
        aiPath.speed         = walkSpeed - 1f;
        aiPath.rotationSpeed = rotationDamping;
        animator.SetFloat("Speed_f", aiPath.speed / runSpeed);
        while (state == State.Look)
        {
            //업데이트할때
            if (LookTarget != null)
            {
                aiPath.target = LookTarget.transform;
                float dist = GetDistance(LookTarget);
                currentPosition = LookTarget.transform.position;                                      //타겟의 현재 위치
                currentSpeed    = LookTarget.GetComponent <CharacterController>().velocity.magnitude; //타겟의 현재 속도
                //일정거리에 가까워질때 몇초후에도 가만히있다면 공격
                if (dist < 2f)
                {
                    aiPath.speed         = 0f;                             //이동속도 0
                    aiPath.rotationSpeed = 0f;                             //회전속도 0
                    animator.SetFloat("Speed_f", aiPath.speed / runSpeed); //애니메이션 속도조절
                    StartCoroutine(StopLook(stopLookTimer, currentPosition));
                }
                else if (dist > 35.0f)
                {
                    GameController.GetInstance().ActionMessage("Right", "곰의 시야에서 벗어났습니다.", LookTarget);
                    state = State.Idle;
                    LookTarget.GetComponent <SurvivorStatus>().SetBW(null);
                    LookTarget = null;
                }
                else
                {
                    aiPath.speed = walkSpeed - 1f;
                }

                //공격범위 안에 들어온 타겟이 LookTarget하고 다르다면 LookTarget을 들어온 타겟으로 바꿈
                if (AttackRange.InTarget != null)
                {
                    if (LookTarget != AttackRange.InTarget)
                    {
                        LookTarget = AttackRange.InTarget;
                    }
                }

                //타겟이 뛰거나 뒤로 돌면 쫒아감
                if (LookTarget != null)
                {
                    if (!backMoveFlag)   //회피때는 인식X
                    {
                        StartCoroutine(LookToChase(lookToChaseTimer, currentSpeed, LookTarget));
                    }
                    else
                    {
                        StopCoroutine(LookToChase(lookToChaseTimer, currentSpeed, LookTarget));
                    }
                }
            }
            else if (LookTarget == null)
            {
                state = State.Idle;
            }
            yield return(0);
        }
        //벗어날때
        if (Audio != null)
        {
            Audio.Stop("Walk");
        }
        GoToNextState();
    }
Пример #3
0
    IEnumerator Look()
    {
        if (Audio != null)
        {
            Audio.Play("Look");
            Audio.Play("Walk");
        }
        aiPath.speed         = walkSpeed - 1.5f;
        aiPath.rotationSpeed = rotationDamping;
        while (state == State.Look)
        {
            //업데이트할때
            animator.SetFloat("Speed_f", aiPath.speed / runSpeed); //추가
            if (LookTarget != null)
            {
                float dist = GetDistance(LookTarget);
                aiPath.target = LookTarget.transform;
                if (LookTarget.GetComponent <SurvivorStatus>().UmbrellaState)
                {
                    if (dist < 5.0f)
                    {
                        aiPath.speed = 0f;
                        animator.SetFloat("Speed_f", 0); //추가
                        StartCoroutine(ObstacleDistinction(obstacleDistinctionTimer, LookTarget));
                    }
                }
                else if (dist < 2f)
                {
                    state       = State.Chase;
                    ChaseTarget = LookTarget;
                    GameController.GetInstance().ActionMessage("Wrong", "멧돼지와 가깝습니다.", ChaseTarget);
                }
                else if (dist > sightDistance)
                {
                    GameController.GetInstance().ActionMessage("Right", "멧돼지의 시야에서 벗어났습니다.", LookTarget);
                    state = State.Idle;
                    LookTarget.GetComponent <SurvivorStatus>().SetBW(null);
                    LookTarget = null;
                }
                else
                {
                    aiPath.speed = walkSpeed - 1.5f;
                }


                //시야범위 안에 또 다른 타겟이 왔을때 더 가까우면 교환
                if (SightRange.getSurvivors() != null)
                {
                    if (LookTarget != SightRange.getSurvivors())
                    {
                        if (GetDistance(SightRange.getSurvivors()) < GetDistance(LookTarget))
                        {
                            GameController.GetInstance().ActionMessage("Right", "다른 상대보다 멧돼지와 더 멀어져 시야에서 벗어났습니다.", LookTarget);
                            LookTarget = SightRange.getSurvivors();
                            GameController.GetInstance().ActionMessage("Wrong", "다른 상대보다 멧돼지와 더 가까워 대상이 되었습니다.", LookTarget);
                        }
                    }
                }
                //타겟이 뛰거나 뒤로 돌면 쫒아감
                if (!umbrellaMoveFlag)
                {
                    StartCoroutine(LookToChase(lookToChaseTimer, currentSpeed, LookTarget));
                }
            }
            yield return(0);
        }
        //벗어날때
        if (Audio != null)
        {
            Audio.Stop("Walk");
            Audio.Stop("Look");
        }
        GoToNextState();
    }