/// <summary> /// Ground Tag가 있는 오브젝트의 레이캐스팅 좌표를 저장합니다. /// </summary> private void SetRayHitPos_Ground() { //지면 확인 Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; if (Physics.Raycast(ray, out hit, 100, LayerMask.GetMask("Default"))) { if (hit.transform.tag.Equals("Ground")) { //애니메이션 if (!isMove) { //_animator.SetTrigger("MOVE"); photonView.RPC("CallbackRPC_AnimatorTrigger", RpcTarget.All, photonView.ViewID, "MOVE"); } _targetPos = hit.point; isMove = true; distance = Vector3.Distance(transform.position, _targetPos); //방향벡터 갱신 dir = _targetPos - transform.position; dir.Normalize(); //회전 _animator.transform.LookAt(new Vector3(_targetPos.x, transform.position.y, _targetPos.z)); //공격 대상 초기화 targetUnit = null; } } }
private IEnumerator IE_AttackController() { photonView.RPC("CallbackRPC_AnimatorTrigger", RpcTarget.All, photonView.ViewID, "ATTACK"); //애니메이션 이벤트 리시버 에러로 인한 코루틴 처리 StartCoroutine(IE_AnimEvent_Attack()); float delay = atkAnimTime; while (_currHP > 0 && _myState.Equals(PLAYER_STATE.ATTACK)) { if (targetUnit == null) { break; } _animator.transform.LookAt(targetUnit.Get_Position()); //공격모션 중간에 우클릭을 통해 공격캔슬, 이동한다. if (Input.GetMouseButtonDown(1)) { SetRayHitPos_Ground(); Set_StateMachine(PLAYER_STATE.IDLE); break; } delay -= Time.deltaTime; if (delay <= 0) { //공격 후 공격 범위에 있다면 공격을 지속하고, 아니라면 기본 컨트롤러로 상태를 변환한다. //또는 상대가 죽었다면 공격을 중지한다. distance = Vector3.Distance(targetUnit.Get_Position(), transform.position); if (distance > _attackDistance || targetUnit.Check_IsDead()) { targetUnit = null; Set_StateMachine(PLAYER_STATE.IDLE); } else { Set_StateMachine(PLAYER_STATE.ATTACK); } yield break; } yield return(null); } }
/// <summary> /// 평타 프로젝타일 프로세스 /// </summary> /// <param name="spd"></param> /// <param name="index"></param> /// <returns></returns> private IEnumerator IE_MissileAttack(float spd, int index) { float subDistance; Vector3 dir; yield return(new WaitForEndOfFrame()); Transform misslie = _meleeProjectile[index]; misslie.transform.position = transform.position + Vector3.up; ITargetUnit tempTarget = targetUnit; //타겟 지정 MainManager.instance.Set_ActiveProjectile(_meleeProjectile[index].gameObject, true); //_meleeProjectile[index].gameObject.SetActive(true); do { if (tempTarget == null) { break; } subDistance = Vector3.Distance(tempTarget.Get_Position(), new Vector3(misslie.transform.position.x, tempTarget.Get_Position().y, misslie.transform.position.z)); dir = tempTarget.Get_Position() - new Vector3(misslie.transform.position.x, tempTarget.Get_Position().y, misslie.transform.position.z); dir.Normalize(); misslie.transform.Translate(dir * _speed * Time.deltaTime, Space.World); yield return(null); } while (subDistance >= 0.1f); if (tempTarget != null) { tempTarget.Set_Target(this); tempTarget.TakeDamage(_attackDamage); if (tempTarget.Check_IsDead()) { Add_Money(tempTarget.Get_TargetCredit()); } } MainManager.instance.Set_ActiveProjectile(misslie.gameObject, false); // _meleeProjectile[index].gameObject.SetActive(false); //_meleeProjectile.parent = _animator.transform; }
/// <summary> 타겟팅용 레이캐스트를 활성화합니다. </summary> IEnumerator IE_FollowTargetCursor() { SetIcon_TargetMouseCursor(); while (atkToggle) { //스킬 시전 중일 때에는 타겟팅 기능 일시정지 yield return(new WaitUntil(() => !_myState.Equals(PLAYER_STATE.CAST))); Ray ray = _mainCamera.ScreenPointToRay(Input.mousePosition); RaycastHit hit; #region 타겟팅관련 : 다른 플레이어를 타겟팅 if (Input.GetMouseButtonDown(0)) { ray = _mainCamera.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit, 100, LayerMask.GetMask("Player") | LayerMask.GetMask("Monster"))) { _targetPos = hit.point; //방향벡터 갱신 dir = _targetPos - transform.position; dir.Normalize(); //회전 _animator.transform.LookAt(new Vector3(_targetPos.x, transform.position.y, _targetPos.z)); targetUnit = hit.transform.GetComponent <ITargetUnit>(); } break; } #endregion yield return(null); } SetIcon_IdleMouseCursor(); }