IEnumerator coJumpAttack() { State = Define.State.BossJumpSkill; _jumpPosition = _target.transform.position; distance = (_jumpPosition - transform.position).magnitude; dir = (_jumpPosition - transform.position).normalized; movePerSecond = distance / 2.0f; _isInAir = true; yield return(new WaitForSeconds(1.7f)); _isLooking = false; //점프 직후 _navMeshAgent.enabled = false; _rigid.isKinematic = false; _rigid.AddForce(Vector3.up * _jumpPower, ForceMode.Impulse); _jumpAttackArea.SetActive(true); yield return(new WaitForSeconds(2.0f)); //착지 직후 _isLooking = true; _navMeshAgent.enabled = true; _rigid.isKinematic = true; State = Define.State.Idle; _jumpAttackArea.SetActive(false); yield return(new WaitForSeconds(1.0f)); StartCoroutine(ThinkSkill()); }
IEnumerator ThinkSkill() { if (State == Define.State.DIe) { yield break; } State = Define.State.Idle; GameObject player = Managers.Game.GetPlayer(); yield return(new WaitForSeconds(1.0f)); float distance = (player.transform.position - transform.position).magnitude; if (distance <= MeleeAttackScanRange) { _lockTarget = player; StartCoroutine(coMeleeAttack()); } else { int ranAction = Random.Range(0, 2); switch (ranAction) { case 0: StartCoroutine(coJumpAttack()); break; case 1: StartCoroutine(coStoneAttack()); break; } } }
IEnumerator coRAction(Define.State state) { _player.GetComponent <PlayerController>().State = state; Managers.Sound.Play("Sounds/GameSound/SkillF"); GameObject weapon = WeaponChange._equipedWeapon as GameObject; yield return(new WaitForSeconds(2.0f)); }
IEnumerator coEAction(Define.State state) { _player.GetComponent <PlayerController>().State = state; GameObject weapon = WeaponChange._equipedWeapon as GameObject; yield return(null); }
protected override void UpdateMoving() { //True -> 공중에 있을 때 //만약 캐릭터가 공중에 있다면 움직이지 못하도록 막아 줌. if (_isInAir) { return; } //_lockTarget은 몬스터를 클릭하면 해당 몬스터에 대한 게임오브젝트 정보가 저장 됨 //True -> 몬스터를 클릭하고 있다는 것. 거리를 계산하여 //False -> 땅을 클릭했다는 것.(이동) if (_lockTarget != null) { //메인 캐릭터와 클릭한 몬스터의 거리를 측정합니다. //거리가 2이하면 공격을 실행 해 줌. _desPos = _lockTarget.transform.position; float distance = (_desPos - transform.position).magnitude; if (distance <= 2) { State = Define.State.Skill; return; } } //여기가 실행됬다는건 땅을 클릭했다는 것. Vector3 dir = _desPos - transform.position; dir.y = 0; //True -> 목적지(쿨릭한 땅)에 도착했을때 실행 //상태를 Idle로 바꿔 줌. //False -> 목적지(클릭한 땅)에 도착하지 못했을 때 //이동 if (dir.magnitude < 0.1f) { State = Define.State.Idle; } else { //메인 캐릭터로 부터 바라보는 방향으로 Raycast를 쏜다 //만약 레이어가 Block이라는게 감지가 되면 메인 캐릭터를 Idle상태로 바꿔준다. Debug.DrawRay(transform.position + Vector3.up * 0.5f, dir.normalized, Color.blue); if (Physics.Raycast(transform.position + Vector3.up * 0.5f, dir, 1.0f, LayerMask.GetMask("Block"))) { if (Input.GetMouseButton(1) == false) { State = Define.State.Idle; } return; } //캐릭터의 이동과 바라보는 방향을 설정해준다. float moveDist = Mathf.Clamp(_stat.MoveSpeed * Time.deltaTime, 0, dir.magnitude); transform.position += dir.normalized * moveDist; transform.rotation = Quaternion.Slerp(transform.rotation, Quaternion.LookRotation(dir.normalized), 0.2f); } }
IEnumerator coQAction(Define.State state) { _player.GetComponent <PlayerController>().State = state; GameObject weapon = WeaponChange._equipedWeapon as GameObject; Managers.Sound.Play("Sounds/GameSound/SkillA"); weapon.transform.Find("Effect").gameObject.GetComponent <TrailRenderer>().enabled = true; yield return(new WaitForSeconds(2.0f)); weapon.transform.Find("Effect").gameObject.GetComponent <TrailRenderer>().enabled = false; }
IEnumerator coStoneAttack() { State = Define.State.BossStoneSkill; GameObject go = Instantiate(Managers.Resource.Load <GameObject>($"Prefabs/Stone"), _stoneSpawnArea.transform.position, _stoneSpawnArea.transform.rotation); yield return(new WaitForSeconds(3.0f)); StartCoroutine(ThinkSkill()); }
IEnumerator CheckIfSkillisFinish() { float exitTime = 0.9f; Animator anim = GetComponent <Animator>(); while (anim.GetCurrentAnimatorStateInfo(0).normalizedTime < exitTime) { yield return(null); } State = Define.State.Idle; }
IEnumerator coMeleeAttack() { State = Define.State.BossMeleeAttack; yield return(new WaitForSeconds(1.5f)); _meleeAttackArea.SetActive(true); yield return(new WaitForSeconds(0.2f)); _meleeAttackArea.SetActive(false); yield return(new WaitForSeconds(1.3f)); StartCoroutine(ThinkSkill()); }
IEnumerator coWAction(Define.State state) { _player.GetComponent <PlayerController>().State = state; GameObject weapon = WeaponChange._equipedWeapon as GameObject; Managers.Sound.Play("Sounds/GameSound/SkillS"); _player.transform.Find("SkillDEffect").gameObject.SetActive(true); _player.GetComponent <PlayerStat>().Attack += 30; yield return(new WaitForSeconds(30.0f)); _player.transform.Find("SkillDEffect").gameObject.SetActive(false); _player.GetComponent <PlayerStat>().Attack -= 30; }
//애니메이션에서 호출해주고 있음. void OnHitEvent() { if (_lockTarget != null) { Managers.Sound.Play("Sounds/GameSound/Beat1"); Stat targetStat = _lockTarget.GetComponent <Stat>(); targetStat.OnAttacked(_stat); } if (_stopSkill) { State = Define.State.Idle; } else { State = Define.State.Skill; } }
void ActionSkills(Define.State state) { if (state == Define.State.SkillQ) { StartCoroutine(coQAction(state)); } else if (state == Define.State.SkillW) { StartCoroutine(coWAction(state)); } else if (state == Define.State.SkillE) { StartCoroutine(coEAction(state)); } else if (state == Define.State.SkillR) { StartCoroutine(coRAction(state)); } }
//캐릭터가 땅을 클릭할때 실행되는 함수. void OnMouseEvent_IdleRun(Define.MouseEvent evt) { //True ->무언가를 수확중일때 //수확중에 움직이면 수확하는 것을 멈춤. if (_LoadingBar != null) { Managers.UI.ClosePopupUI(_LoadingBar); } if (State == Define.State.DIe) { return; } //스크린에서 부터 Raycast를 쏴서 부딪친것을 hit에 저장시킴. RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); bool raycastHit = Physics.Raycast(ray, out hit, 100.0f, _mask); switch (evt) { //최초로 마우스를 눌렀을때 실행. case Define.MouseEvent.PointerDown: { if (raycastHit) { //부딪친 오브젝트의 좌표를 가져 온 후 //공격을 하고 있었다면 멈추고 움직 임. _desPos = hit.point; State = Define.State.Moving; _stopSkill = false; //Raycast에 부딪친 좌표가 만약 몬스터라면 _LockTarget에 값을 넣어 줌 if (hit.collider.gameObject.layer == (int)Define.Layer.Monster) { _lockTarget = hit.collider.gameObject; } else { _lockTarget = null; } } } break; //마우스를 누르고 있을때 실행. case Define.MouseEvent.Press: { //실시간으로 부딪친 위치를 바꿔 줌. if (_lockTarget == null && raycastHit) { _desPos = hit.point; } } break; //땠을때 실행. //공격하고 있었다면 공격을 멈춤 case Define.MouseEvent.PointerUp: _stopSkill = true; break; } }