Пример #1
0
 public void RespawnInit()
 {
     m_Anim.SetTrigger("RunIdle");
     status.CurrHp = status.MaxHp;
     status.CurrMp = status.MaxMp;
     gameObject.GetComponent <Collider>().enabled = true;
     playerUI.gameObject.SetActive(true);
     m_nvAgent.speed = status.moveSpeed;
     champState      = ChampState.Idle;
     skillCode       = SkillCode.wait;
 }
Пример #2
0
 private void Move() //이동상태함수
 {
     m_Anim.ResetTrigger("Skill");
     m_Anim.ResetTrigger("StopMove");
     m_Anim.ResetTrigger("StartAttack");
     m_Anim.SetTrigger("Move");             // 이동 애니메이션 실행
     m_nvAgent.SetDestination(destination); // 네비게이션 도착지점을 destination 변수 위치값으로
     if (m_nvAgent.velocity == Vector3.zero)
     {
         champState = ChampState.Idle;
     }
 }
Пример #3
0
    private void Chase() //추적상태함수
    {
        m_Anim.ResetTrigger("Skill");
        m_Anim.ResetTrigger("StopMove");
        m_Anim.ResetTrigger("StartAttack");
        m_Anim.SetTrigger("Move");
        m_nvAgent.SetDestination(lastClickedEnemyObject.transform.position);

        if (Vector3.Distance(lastClickedEnemyObject.transform.position, playerTr.transform.position) < status.attackRange && isAttackComplete)
        //추적중 공격사거리 안에 들어오고 감지된 적이 공격타겟일때
        {
            champState = ChampState.Attack; // 챔프 스테이트 Attack으로
            return;
        }
    }
Пример #4
0
 protected void ChampInit()
 {
     SetPlayerNickName();
     Splats = GetComponentInChildren <SplatManager>();
     SetPlayerLayerMask();
     movePoint       = GameObject.Find("MovePoint").transform.Find("MovePointImage").transform;
     renderer        = movePoint.GetComponent <SpriteRenderer>();
     m_nvAgent.speed = status.moveSpeed;
     status.CurrHp   = status.MaxHp;
     status.CurrMp   = status.MaxMp;
     status.Kill     = 0;
     status.Death    = 0;
     champState      = ChampState.Idle;
     skillCode       = SkillCode.wait;
 }
Пример #5
0
    private void Attack() // 공격상태함수
    {
        m_nvAgent.velocity = Vector3.zero;
        m_Anim.ResetTrigger("Skill");
        m_Anim.ResetTrigger("StopMove");
        m_Anim.ResetTrigger("Move");
        m_Anim.SetTrigger("StartAttack");
        AggroTarget = lastClickedEnemyObject;//어그로 바뀌는문 추가
        Vector3 attackTarget;

        attackTarget = new Vector3(lastClickedEnemyObject.transform.position.x, transform.position.y, lastClickedEnemyObject.transform.position.z);
        transform.LookAt(attackTarget); //공격대상을 항상 바라보게
        if ((Vector3.Distance(lastClickedEnemyObject.transform.position, playerTr.transform.position) > status.attackRange) && isAttackComplete)
        //공격중에 적이 챔프 사거리 밖으로 도망가면
        {
            champState = ChampState.Chase; //챔프 스테이트 Chase로
            return;
        }
    }
Пример #6
0
    protected void Update()
    {
        #region 로컬플레이어처리
        if (PV.IsMine)
        {
            //////////////////////// 스킬 처리 //////////////////////////////////////////////////////////////////////////
            switch (skillCode)
            {
            case SkillCode.wait: Wait(); break;

            case SkillCode.q: Qskill(); break;

            case SkillCode.w: Wskill(); break;

            case SkillCode.e: Eskill(); break;

            case SkillCode.r: Rskill(); break;

            default: break;
            }

            if (Input.GetKeyDown(KeyCode.Q))
            {
                isQskillActivate = true;
                isAkeyActivate   = false;
            }

            if (Input.GetKeyDown(KeyCode.W))
            {
                isWskillActivate = true;
                isAkeyActivate   = false;
            }

            if (Input.GetKeyDown(KeyCode.E))
            {
                isEskillActivate = true;
                isAkeyActivate   = false;
            }

            if (Input.GetKeyDown(KeyCode.R))
            {
                isRskillActivate = true;
                isAkeyActivate   = false;
            }

            if (Input.GetMouseButtonDown(1) || Input.GetKeyDown(KeyCode.A))
            {
                CancleIndicator();
            }

            if (isQskillActivate && Input.GetMouseButtonDown(0) && qCoolTimeDone && status.CurrMp >= qSkillUseMana)
            {
                isQskillActivate = false;
                skillCode        = SkillCode.q;
                skillPosition    = hit.point;
                CancleIndicator();
            }

            if (isEskillActivate && Input.GetMouseButtonDown(0) && eCoolTimeDone)
            {
                isEskillActivate = false;
                skillCode        = SkillCode.e;
                skillPosition    = hit.point;
                CancleIndicator();
            }

            ////////////////////////////////////////////////////////////////////////////////////////////////////////////

            ////////////////////////임시 포탑우선순위 검출///////////////
            //t_distance = Vector3.Distance(transform.position, GameObject.FindWithTag("EnemyTower").transform.position);
            //if (t_distance > GameObject.FindWithTag("EnemyTower").GetComponent<Turret>().m_range)
            //{
            //    AggroTarget = null;
            //}
            ///////////////////////////////////////////////////////
            m_Anim.SetFloat("AttackSpeed", status.attackSpeed); // 공격속도 애니메이션 스피드를 챔프 공격속도에 맞춰서
            //m_nvAgent.speed = status.moveSpeed;
            //////////////////// 레이캐스트 부분 ////////////////////////////////////////////////////////////////////////////////

            ray  = GameObject.FindGameObjectWithTag("MainCamera").GetComponent <Camera>().ScreenPointToRay(Input.mousePosition); //메인카메라로 부터 마우스 좌표값에 광선을쏜다
            hits = Physics.RaycastAll(ray, 100.0f, layermask);                                                                   //hits배열안에 레이어마스크에 걸린 적 정보들을

            Debug.DrawRay(ray.origin, ray.direction * 100.0f, Color.green);                                                      // 씬 뷰에서 확인용으로 실제 게임에선 안보임
            //////////////////// 레이캐스트 부분 ////////////////////////////////////////////////////////////////////////////////

            //////////////////// 공격 타겟 정하는부분 //////////////////////////////////////////////////////////////////////////
            if (Physics.Raycast(ray, out hit, 100.0f, layermask))
            {
                if (Input.GetMouseButtonDown(1))
                {
                    lastClickedEnemyObject = hit.collider.gameObject;                              //광선에 맞은 오브젝트의 Collider를 attackTarget변수에 넣어준다
                }
                if (isAkeyActivate)
                {
                    if (Input.GetMouseButtonDown(0))
                    {
                        lastClickedEnemyObject = hit.collider.gameObject;                              //광선에 맞은 오브젝트의 Collider를 attackTarget변수에 넣어준다
                    }
                }
            }
            if (Physics.Raycast(ray, out hit, 100.0f))
            {
                currentCursorObject = hit.collider.gameObject;
            }

            //if (currentCursorObject.layer == LayerMask.NameToLayer("Floor")) outlineActive = false;
            //else outlineActive = true;

            //if (outlineActive)
            //{
            //    currentCursorObject.GetComponent<Outline>().enabled = true;
            //    outlineObject = currentCursorObject;
            //}
            //else
            //{
            //    if(outlineObject != null) outlineObject.GetComponent<Outline>().enabled = false;
            //}
            //////////////////// 공격 타겟 정하는부분 //////////////////////////////////////////////////////////////////////////

            //////////////////// 마우스 커서 변경 부분 //////////////////////////////////////////////////////////////////////////
            switch (cursorType)
            {
            case CursorType.EnemyCursor: Cursor.SetCursor(EnemyAttackCursor, hotSpot, CursorMode.Auto); break;

            case CursorType.BasicAkeyCursor: Cursor.SetCursor(BasicAkeyCursor, new Vector2(BasicAkeyCursor.width / 2, BasicAkeyCursor.height / 2), CursorMode.Auto); break;

            case CursorType.EnemyAkeyCursor: Cursor.SetCursor(EnemyAkeyCursor, new Vector2(EnemyAkeyCursor.width / 2, EnemyAkeyCursor.height / 2), CursorMode.Auto); break;

            case CursorType.OnlyEnemyChampionCursor: Cursor.SetCursor(OnlyEnemyChampionCursor, hotSpot, CursorMode.Auto); break;

            default: Cursor.SetCursor(DefaultCursor, hotSpot, CursorMode.Auto); break;
            }
            //////////////////// 마우스 커서 변경 부분 //////////////////////////////////////////////////////////////////////////

            //////////////////// 챔프 스테이트 변경 부분 ////////////////////////////////////////////////////////////////////////
            switch (champState)
            {
            case ChampState.Idle: Idle(); break;

            case ChampState.Move: Move(); break;

            case ChampState.Chase: Chase(); break;

            case ChampState.Attack: Attack(); break;

            case ChampState.UseSkill: UseSkill(); break;

            default: Idle(); break;
            }
            //////////////////// 챔프 스테이트 변경 부분 ////////////////////////////////////////////////////////////////////////

            if (Input.GetKeyDown(KeyCode.A))
            {
                isAkeyActivate   = true;
                isQskillActivate = false;
                isEskillActivate = false;
            }

            if (isAkeyActivate)
            {
                AttackRangeObject.SetActive(true);                 // 공격 사거리 오브젝트 띄워줌
            }
            else
            {
                AttackRangeObject.SetActive(false);        // 공격 사거리 오브젝트 지워줌
            }
            if (!isSkillCast)                              // 스킬사용이 끝나고나서
            {
                if (hits.Length == 0)                      // 레이어마스크에 레이캐스트 히트정보가 없을경우 즉 마우스가 땅위에 있을때
                {
                    cursorType = CursorType.DefaultCursor; // 마우스가 땅위에있을때니까 default 커서로
                    if (Input.GetMouseButtonDown(1) && Physics.Raycast(ray, out hit, 100.0f, 1 << 12))
                    //마우스가 땅위에있고 클릭을 한번했을때
                    {
                        isAkeyActivate = false;
                        renderer.color = new Color(1, 1, 1, 1);
                        destination    = hit.point;
                        champState     = ChampState.Move;
                        StartCoroutine("CreateAndRemoveImage");
                    }
                    if (Input.GetMouseButton(1) && Physics.Raycast(ray, out hit, 100.0f, 1 << 12))
                    //마우스가 땅위에있고 클릭을 꾸욱하고있을때
                    {
                        isAkeyActivate = false;
                        destination    = hit.point;       // 마우스로 클릭한 지점의 좌표를 destination 변수에 넣는다
                        champState     = ChampState.Move; // 챔프 스테이트를 Move로
                    }
                    if (isAkeyActivate)
                    {
                        cursorType = CursorType.BasicAkeyCursor;
                        if (Input.GetMouseButtonDown(0) && Physics.Raycast(ray, out hit, 100.0f, 1 << 12))
                        {
                            isAkeyActivate = false;
                            renderer.color = new Color(1, 0, 0, 1);
                            StartCoroutine("CreateAndRemoveImage");
                            destination = hit.point;
                            champState  = ChampState.Move;
                        }
                    }
                }
                else // 반대경우는 마우스가 레이어마스크 즉 적위에 있을때겠지??
                {
                    cursorType = CursorType.EnemyCursor; //마우스가 적위에있으니 공격커서로
                    if (Input.GetMouseButtonDown(1) && !isSkillCast) //마우스 우클릭했을때
                    {
                        if (Vector3.Distance(playerTr.transform.position, lastClickedEnemyObject.transform.position) > status.attackRange)
                        //클릭한 적오브젝트가 공격사거리 보다 멀리있다면
                        {
                            isAkeyActivate = false;
                            champState     = ChampState.Chase;
                        }
                        else
                        {
                            isAkeyActivate = false;
                            champState     = ChampState.Attack;
                        }
                    }
                    if (isAkeyActivate) // 마우스가 적위에있을때 a키가 활성화 되어있으면
                    {
                        cursorType = CursorType.EnemyAkeyCursor;
                        if (Input.GetMouseButtonDown(0)) // 그상태에서 마우스 왼쪽클릭을하면
                        {
                            if (Vector3.Distance(playerTr.transform.position, lastClickedEnemyObject.transform.position) > status.attackRange)
                            //클릭한 적오브젝트가 공격사거리 보다 멀리있다면
                            {
                                isAkeyActivate = false;
                                champState     = ChampState.Chase;
                            }
                            else
                            {
                                isAkeyActivate = false;
                                champState     = ChampState.Attack;
                            }
                        }
                    }
                }
            }

            if (m_nvAgent.enabled)
            {
                if (m_nvAgent.remainingDistance <= 0.2f && m_nvAgent.velocity.magnitude >= 0.2f) // 도착지점에 거의 도달했을경우
                {
                    champState = ChampState.Idle;
                }
            }

            if (Input.GetKeyDown(KeyCode.S))  //s키 눌렀을때
            {
                champState = ChampState.Idle; //챔프 스테이트 Idle로
            }
            if (status.CurrHp <= 0 && death == false)
            {
                death = true;
                Dead();
            }
            if (status.CurrExp >= status.MaxExp)
            {
                LevelUp();
            }
            if (m_AttackTarget != null && normalAttack != null)
            {
                if (m_AttackTarget != null)
                {
                    normalAttack.transform.LookAt(m_AttackTarget.transform.position);
                    normalAttack.transform.Translate(Vector3.forward * Time.deltaTime * 20.0f);
                    if (Vector3.Distance(m_AttackTarget.transform.position, normalAttack.transform.position) < 0.2f && PhotonNetwork.IsMasterClient &&
                        !m_AttackTarget.CompareTag("EnemyHero") && !m_AttackTarget.CompareTag("TeamHero") && !m_AttackTarget.CompareTag("TeamTower") &&
                        !m_AttackTarget.CompareTag("EnemyTower") && !m_AttackTarget.CompareTag("TeamNexus") && !m_AttackTarget.CompareTag("EnemyNexus") && PV.IsMine)
                    {
                        m_AttackTarget.GetComponent <Status>().CurrHp -= status.AD;
                        int a = m_AttackTarget.GetComponent <PhotonView>().ViewID;
                        int b = GameObject.FindGameObjectWithTag("Player").GetComponent <PhotonView>().ViewID;
                        if (m_AttackTarget.GetComponent <Status>().CurrHp <= 0)
                        {
                            Debug.Log(b);
                            PV.RPC("RemoteDeadMinion", RpcTarget.AllBuffered, b, m_AttackTarget.GetComponent <Status>().DieExp);
                        }
                        PhotonNetwork.Destroy(normalAttack);
                        m_AttackTarget = null;
                    }
                    else if (Vector3.Distance(m_AttackTarget.transform.position, normalAttack.transform.position) < 0.2f && !PhotonNetwork.IsMasterClient &&
                             !m_AttackTarget.CompareTag("EnemyHero") && !m_AttackTarget.CompareTag("TeamHero") && !m_AttackTarget.CompareTag("TeamTower") &&
                             !m_AttackTarget.CompareTag("EnemyTower") && !m_AttackTarget.CompareTag("TeamNexus") && !m_AttackTarget.CompareTag("EnemyNexus") && PV.IsMine)
                    {
                        int a = m_AttackTarget.GetComponent <PhotonView>().ViewID;
                        int b = GameObject.FindGameObjectWithTag("Player").GetComponent <PhotonView>().ViewID;
                        PV.RPC("RemoteHitMinion", RpcTarget.MasterClient, a, status.AD);
                        if (m_AttackTarget.GetComponent <Status>().CurrHp <= 0)
                        {
                            Debug.Log(b);
                            PV.RPC("RemoteDeadMinion", RpcTarget.AllBuffered, b, m_AttackTarget.GetComponent <Status>().DieExp);
                        }
                        PhotonNetwork.Destroy(normalAttack);
                        m_AttackTarget = null;
                    }
                }
            }
            if (DataManager.instance.gameOver)
            {
                PhotonNetwork.LocalPlayer.CustomProperties.Remove(PlayerInformation.PLAYER_CHAMPION);
                PhotonNetwork.LocalPlayer.CustomProperties.Remove(PlayerInformation.PLYAER_KILL);
                PhotonNetwork.LocalPlayer.CustomProperties.Remove(PlayerInformation.PLAYER_DEATH);

                PhotonNetwork.LocalPlayer.CustomProperties.Add(PlayerInformation.PLYAER_KILL, status.Kill);
                PhotonNetwork.LocalPlayer.CustomProperties.Add(PlayerInformation.PLAYER_DEATH, status.Death);

                PhotonNetwork.LocalPlayer.SetCustomProperties(PhotonNetwork.LocalPlayer.CustomProperties);

                PhotonNetwork.Destroy(gameObject);
            }
        }
        #endregion
        //isMine이 아닌 것들은 동기화
        else
        {
            //끊어진 시간이 너무 길 경우(텔레포트)
            if ((transform.position - curPos).sqrMagnitude >= 10.0f * 10.0f)
            {
                transform.position = curPos;
                transform.rotation = curRot;
            }
            //끊어진 시간이 짧을 경우(자연스럽게 연결 - 데드레커닝)
            else
            {
                transform.position = Vector3.Lerp(transform.position, curPos, Time.deltaTime * 10.0f);
                transform.rotation = Quaternion.Slerp(transform.rotation, curRot, Time.deltaTime * 10.0f);
            }

            status.MaxHp   = remoteMaxHp;
            status.MaxMp   = remoteMaxMp;
            status.CurrMp  = remoteCurrMp;
            status.CurrHp  = remoteCurrHp;
            status.DieExp  = remoteDieExp;
            status.CurrExp = remoteCurrExp;

            if (status.CurrHp <= 0)
            {
                gameObject.GetComponent <Collider>().enabled = false;
                playerUI.gameObject.SetActive(false);
            }
            else
            {
                gameObject.GetComponent <Collider>().enabled = true;
                playerUI.gameObject.SetActive(true);
            }
        }
        ///////////////////////////////////////////// hp 및 mp 감소 부분 //////////////////////////////////////////////////////
        HpBar.GetComponent <Image>().fillAmount = (status.CurrHp / status.MaxHp);
        MpBar.GetComponent <Image>().fillAmount = (status.CurrMp / status.MaxMp);
        ///////////////////////////////////////////// hp 및 mp 감소 부분 //////////////////////////////////////////////////////
    }