public void attated(float damage, CROWD_CONTROL cc) // 피격 처리 { float stateLevel = m_animator.GetInteger("stateLevel"); CharacterInfoManager.instance.m_iCurHp -= (int)damage; // 받은 데미지만큼 현재 체력을 감소시킨다. if (cc == CROWD_CONTROL.STUN) { if (stateLevel != 20) { m_animator.SetInteger("stateLevel", 19); // 스턴 상태로 레벨 전환 } } else if (cc == CROWD_CONTROL.DOWN) { if (stateLevel != 18) { m_animator.SetInteger("stateLevel", 17); // 피격 상태로 레벨 전환 } } if (CharacterInfoManager.instance.m_iCurHp <= 0.0f) // 체력이 없으면 { GameManager.instance.playerDie(); // 플레이어가 사망했다고 게임매니저에 알림 (게임매니저에서 추가 UI 처리) m_animator.SetTrigger("dieTrigger"); // 사망 트리거 활성화 m_animator.SetInteger("stateLevel", 44); // 사망 상태로 레벨 전환 delegateState(444); // 사망 델리게이트 전달 } }
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); } }
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; }
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); }
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); }