コード例 #1
0
    /// <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;
            }
        }
    }
コード例 #2
0
    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);
        }
    }
コード例 #3
0
    /// <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;
    }
コード例 #4
0
    /// <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();
    }