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); } } }
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(); }
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(); }