Exemplo n.º 1
0
    public override void attacted(float damage, SPECIAL_DAMAGE sd = SPECIAL_DAMAGE.NONE, CROWD_CONTROL cc = CROWD_CONTROL.NONE)
    {
        if (sd == SPECIAL_DAMAGE.CRITICAL)
        {
            damage *= 1.25f;                                  // 크리티컬 증폭 계수 25%
        }
        else if (sd == SPECIAL_DAMAGE.BACK_ATTACK)
        {
            damage *= 1.1f;                                   // 백어택 증폭 계수 10%
        }
        else if (sd == SPECIAL_DAMAGE.CRITICAL_BACK_ATTACK)
        {
            damage *= 1.375f;                                 // 크리티컬 백어택 증폭 계수 복리 25*10%
        }
        int stateLevel = m_animator.GetInteger("stateLevel"); // 상태 레벨을 받아옴

        if (stateLevel == (int)ENEMY_STATE.DIE)               // 사망 상태이면 리턴
        {
            return;
        }
        m_fCurHP -= damage;                                                   // 체력 감소
        if (cc == CROWD_CONTROL.STUN)
        {
            cc = CROWD_CONTROL.STUN_IMMUNE;
        }
        DamageTextVisible((int)damage, sd, cc);

        InGameUIManager.Instance.showEnemyInfo("미노 킹", percentHP);  // 체력 상태를 UI에 전달
        GameManager.instance.addScore((int)damage);
        ScoreUIManager.Instance.replaceScroeUI();                   // 스코어UI를 갱신

        if (m_fCurHP <= 0.0f && stateLevel != (int)ENEMY_STATE.DIE) // 체력이 0보다 작고 사망상태가 아니면
        {
            m_animator.SetTrigger("die");                           // 사망 트리거 활성화
            m_eEnemyState = ENEMY_STATE.DIE;                        // 사망상태로 전환
            m_animator.Play("Die");
            Destroy(transform.gameObject, 3.0f);                    // 3초뒤삭제
            dropItem();
            dropGold();
            GameManager.instance.winDungeon();
        }
        else if (stateLevel != (int)ENEMY_STATE.DIE)
        {
            if (m_fCurHP <= m_fMaxHP * 0.5f && m_bPhaseChange == false)   // 체력이 50퍼 이하이면 다음페이즈
            {
                GameManager.instance.startSubDialog();
                m_animator.speed = 1.5f;
                m_bPhaseChange   = true;
            }
            if (IsInvoking("shoutCoolTime") == false && m_bPhaseChange == true)        // 2페이즈부터는 소리치기발동
            {
                m_fShoutCoolTime = 24.0f;
                m_animator.SetBool("shout", true);
                InvokeRepeating("shoutCoolTime", 0.0f, 0.1f);
                m_eEnemyState = ENEMY_STATE.SKILL;
            }
        }
        m_animator.SetInteger("stateLevel", (int)m_eEnemyState); //상태 전이
        m_animator.SetBool("stateTransition", true);
    }
Exemplo n.º 2
0
    private void OnTriggerEnter(Collider coll)                // 공격 충돌 처리
    {
        if (coll.gameObject.tag == "enemy")                   // 충돌 대상이 적 태그를 가지고 있으면
        {
            CROWD_CONTROL  cc = CROWD_CONTROL.NONE;           // 특수 공격상태
            SPECIAL_DAMAGE sd = SPECIAL_DAMAGE.NONE;          // 특수 추가 데미지
            int            criticalPercent = 20;              // 기본 치명타 확률

            int             str         = CharacterInfoManager.instance.m_iCurStr;
            EnemyInfomation enemyScript = coll.GetComponentInParent <EnemyInfomation>();                                                        // 적 스크립트를 받아와서

            if (Vector3.Dot(coll.transform.forward, (transform.position - coll.transform.position).normalized) < Mathf.Cos(90 * Mathf.Deg2Rad)) // 내적을 구해서 적의 정면에서 90도내에 플레이어가 없으면 (좌우 합쳐 180도)
            {
                cc = CROWD_CONTROL.BACK_ATTACK;                                                                                                 // 백어택 발동
                criticalPercent *= 2;                                                                                                           // 크리티컬 확률 2배
            }

            if (Random.Range(0, 100) < criticalPercent)                                                                                           // 크리티컬 확률 안에 들어오면
            {
                if (cc == CROWD_CONTROL.BACK_ATTACK)
                {
                    sd = SPECIAL_DAMAGE.CRITICAL_BACK_ATTACK;
                }
                else
                {
                    sd = SPECIAL_DAMAGE.CRITICAL;
                }
            }
            enemyScript.attacted(m_fCurAttackDamage * str, sd, cc); // 그 적은 내 현재 공격모션의 데미지를 부여함
        }
        if (coll.gameObject.tag == "Potal")                         // 충돌 대상이 스테이지를 넘어가는 포탈이면
        {
            if (s_eventPlayerState == null)
            {
                GameManager.instance.nextDungeonLoad();
            }
            else
            {
                GameManager.instance.stateExplain(1);
            }
        }
        if (coll.gameObject.tag == "DropItem")                   // 충돌 대상이 아이템이면
        {
            DropItem dropItemScripte = coll.GetComponent <DropItem>();
            ItemManager.Instance.putInventroyItem(dropItemScripte.getItenName()); // 인벤토리에 아이템을 넣음
            ObjectPoolManager.Instance.PushToPool("DropItem", coll.gameObject);
        }
        if (coll.gameObject.tag == "DropGold")
        {
            DropGold dropGoldScripte = coll.GetComponent <DropGold>();
            CharacterInfoManager.instance.m_playerInfo.m_iGold += coll.GetComponent <DropGold>().getGoldAmount();
            ProfileUIManager.Instance.changeGold();
            ObjectPoolManager.Instance.PushToPool("DropGold", coll.gameObject);
        }
        if (coll.gameObject.tag == "Barrigate")
        {
            GameManager.instance.stateExplain(0);
        }
    }
Exemplo n.º 3
0
    protected void DamageTextVisible(int damageAmount, SPECIAL_DAMAGE sd = SPECIAL_DAMAGE.NONE, CROWD_CONTROL cc = CROWD_CONTROL.NONE)
    {
        GameObject m_damageText      = ObjectPoolManager.Instance.PopFromPool("DamageText");
        DamageText damageTextScripte = m_damageText.GetComponent <DamageText>();

        m_damageText.SetActive(true);

        if (cc == CROWD_CONTROL.STUN)
        {
            damageTextScripte.damageAmount = damageAmount.ToString() + "\n[888888]스턴[-]";
        }
        else if (cc == CROWD_CONTROL.STUN_IMMUNE)
        {
            damageTextScripte.damageAmount = damageAmount.ToString() + "\n[888888]스턴 면역[-]";
        }
        else if (cc == CROWD_CONTROL.BACK_ATTACK)
        {
            damageTextScripte.damageAmount = damageAmount.ToString() + "\n[ff0000]백어택[-]";
        }
        else
        {
            damageTextScripte.damageAmount = damageAmount.ToString();
        }

        if (sd == SPECIAL_DAMAGE.CRITICAL)
        {
            damageTextScripte.damageAmount = damageAmount.ToString() + "[ff0000]크리티컬[-]";
        }
        else if (sd == SPECIAL_DAMAGE.BACK_ATTACK)
        {
            damageTextScripte.damageAmount = damageAmount.ToString() + "[ff00ff]백어택[-]";
        }
        else if (sd == SPECIAL_DAMAGE.CRITICAL_BACK_ATTACK)
        {
            damageTextScripte.damageAmount = damageAmount.ToString() + "[ff0000]크리티컬 [ff00ff]백어택[-]";
        }

        damageTextScripte.targetTransform = transform.position;
    }
Exemplo n.º 4
0
    public virtual void attacted(float damage, SPECIAL_DAMAGE sd = SPECIAL_DAMAGE.NONE, CROWD_CONTROL cc = CROWD_CONTROL.NONE)
    {
        if (sd == SPECIAL_DAMAGE.CRITICAL)
        {
            damage *= 1.25f;                                  // 크리티컬 증폭 계수 25%
        }
        else if (sd == SPECIAL_DAMAGE.BACK_ATTACK)
        {
            damage *= 1.1f;                                   // 백어택 증폭 계수 10%
        }
        else if (sd == SPECIAL_DAMAGE.CRITICAL_BACK_ATTACK)
        {
            damage *= 1.375f;                                 // 크리티컬 백어택 증폭 계수 복리 25*10%
        }
        int stateLevel = m_animator.GetInteger("stateLevel"); // 상태 레벨을 받아옴

        if (stateLevel == (int)ENEMY_STATE.DIE)               // 사망 상태이면 리턴
        {
            return;
        }
        m_fCurHP -= damage;                                          // 체력 감소
        DamageTextVisible((int)damage, sd, cc);
        InGameUIManager.Instance.showEnemyInfo("미노타우루스", percentHP); // 체력 상태를 UI에 전달
        GameManager.instance.addScore((int)damage);
        ScoreUIManager.Instance.replaceScroeUI();                    // 스코어UI를 갱신

        if (m_fCurHP <= 0.0f && stateLevel != (int)ENEMY_STATE.DIE)  // 체력이 0보다 작고 사망상태가 아니면
        {
            CharacterInfoManager.instance.m_playerInfo.m_iCurExp += m_iGetExp;
            if (CharacterInfoManager.instance.levelUpCheck() == true)
            {
                unityChanScripte.levelUp();
            }
            ProfileUIManager.Instance.changeStatus();

            m_animator.SetTrigger("die");          // 사망 트리거 활성화
            m_eEnemyState = ENEMY_STATE.DIE;       // 사망상태로 전환
            m_animator.Play("Die");
            Destroy(transform.gameObject, 3.0f);   // 3초뒤삭제
            dropItem();
            dropGold();
        }
        else if (stateLevel != (int)ENEMY_STATE.DIE)
        {
            if (cc == CROWD_CONTROL.STUN)
            {
                m_animator.SetTrigger("stun");
                m_eEnemyState = ENEMY_STATE.STUN;
            }
            else
            {
                if (stateLevel != (int)ENEMY_STATE.STUN)
                {
                    m_animator.SetTrigger("attated");
                    m_eEnemyState = ENEMY_STATE.GET_DAMAGE;
                }
            }
        }
        m_animator.SetInteger("stateLevel", (int)m_eEnemyState); //상태 전이
        m_animator.SetBool("stateTransition", true);
    }