Пример #1
0
    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());
    }
Пример #2
0
    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;
            }
        }
    }
Пример #3
0
    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));
    }
Пример #4
0
    IEnumerator coEAction(Define.State state)
    {
        _player.GetComponent <PlayerController>().State = state;
        GameObject weapon = WeaponChange._equipedWeapon as GameObject;


        yield return(null);
    }
Пример #5
0
    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);
        }
    }
Пример #6
0
    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;
    }
Пример #7
0
    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());
    }
Пример #8
0
    IEnumerator CheckIfSkillisFinish()
    {
        float    exitTime = 0.9f;
        Animator anim     = GetComponent <Animator>();

        while (anim.GetCurrentAnimatorStateInfo(0).normalizedTime < exitTime)
        {
            yield return(null);
        }

        State = Define.State.Idle;
    }
Пример #9
0
    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());
    }
Пример #10
0
    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;
    }
Пример #11
0
    //애니메이션에서 호출해주고 있음.
    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;
        }
    }
Пример #12
0
 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));
     }
 }
Пример #13
0
    //캐릭터가 땅을 클릭할때 실행되는 함수.
    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;
        }
    }