IEnumerator FrontTargetCheckCoroutine(EnemyAttack monsterAttack) { // 몬스터가 대기상태라면 감시를 진행함 while (_monsterState.state == _checkState) // 인스펙터부분 { // 수평 방향으로 발포 감지 레이저를 발사함 Vector2 endPos = new Vector2(_attackPoint.position.x - ((_monsterState._isRightDir) ? -_checkRange : _checkRange), _attackPoint.position.y); // 충돌 체크 디버그 레이저 발사 // DrawLine은 씬에서는 보이고 게임에서는 보이지않음 Debug.DrawLine(_attackPoint.position, endPos, Color.green); // 어디서, 어디까지, 어떤색으로 이하의 hitInfo 검출 길이만큼 선을그려줌. 선자체에 검출기능이 있는것은아님, 가시적으로 보기편하게하기위해서 //---- // 라인체크 // Physics2D.Linecast(라인시착위치, 라인끝위치, 검출레이어) // 2D에 맞춰서 Raycast를 변화시킨게 Linecast라는듯 피직스는 물리관련인데 그중에서도 cast가붙으면 충돌체크 RaycastHit2D hitInfo = Physics2D.Linecast(_attackPoint.position, endPos, _monsterState._targetMask); // 충돌체가 존재한다면 if (hitInfo.collider != null) { // 공격 시작 monsterAttack.AttackReady(); yield return(new WaitForSeconds(AttackDelay)); } yield return(null); } }
private void Update() { if (!alive) { return; } float playerDistance = Vector3.Distance(player.position, transform.position); switch (state) { case State.Idle: if (playerDistance <= aggroRange) { state = State.Moving; } break; case State.Moving: if (playerDistance <= attackRange) { if (enemyAttack.AttackReady()) { Attack(); } else { break; //Para que el enemigo no empuje al jugador } } else if (playerDistance > aggroRange) { state = State.Idle; } else { MoveTowardsPlayer(); } break; case State.Attacking: if (!enemyAttack.MovementRestrained()) { state = State.Idle; } break; } }
public IEnumerator CircleAreaTargetCheckCoroutine(EnemyAttack monsterAttack) { // Physics2D.CircleCast 라는 기능도 생겼기때문에.. 이부분은 나중에 이하와 같은개념이라 테스트해봐야함 // 몬스터가 대기상태라면 감시를 진행함 while (_monsterState.state == _checkState) { float distance = Vector2.Distance(_attackPoint.position, _playerPos.position); // Debug.Log("player pos =>" + _playerPos.position); if (distance < _checkRange) { // 공격시작 monsterAttack.AttackReady(); } yield return(null); } }