IEnumerator CreateBattleHero() { BattleHero battleHero = null; yield return(StartCoroutine(GetHero(heroID, x => battleHero = x))); battleHero.gameObject.SetActive(true); HeroData hero = CreateHeroData(); battleHero.team = BattleUnit.Team.Red; battleHero.Init(null, hero); battleHero.ReGen(); battleHeroList.Add(battleHero); coroutine = null; }
//IEnumerator CloseAfterRun() //{ // for (int i = 0; i < heroSelectSlotList.Count; i++) // { // if (heroSelectSlotList[i].battleHero != null) // heroSelectSlotList[i].battleHero.skeletonAnimation.state.SetAnimation(0, heroSelectSlotList[i].battleHero.runAnimation, true); // } // yield return new WaitForSeconds(1.7f); //} /// <summary> 영웅 출전 </summary> IEnumerator StartExploration() { bool isNewBattle = Battle.currentBattleGroup.battleType != battleGroupID; //던전 아이디 //string dungeonID = Battle.currentBattleGroupID; //선택된 영웅을 해당 씬에 배치하면서 전투 시작 if (selectedHeroDataList == null || selectedHeroDataList.Count == 0) { Debug.Log("선택한 영웅이 없습니다."); yield break; } for (int i = 0; i < heroSelectSlotList.Count; i++) { if (heroSelectSlotList[i].battleHero != null) { heroSelectSlotList[i].battleHero.skeletonAnimation.state.SetAnimation(0, heroSelectSlotList[i].battleHero.spineAnimationRun /*runAnimation*/, true); } } //yield return new WaitForSeconds(2.2f); for (int i = 0; i < selectedHeroDataList.Count; i++) { HeroData d = HeroManager.heroDataDic[selectedHeroDataList[i].id]; d.battleGroupID = battleGroupID; //d.isUsing = true; } //리스트 새로 만들어서 배틀그룹 생성 List <HeroData> heroList = new List <HeroData>(selectedHeroDataList); if (isNewBattle) { UIFadeController.FadeOut(1f); while (!UIFadeController.isFinishFadeOut) { yield return(null); } } //Battle.CreateBattleGroup(battleGroupID, heroList); BattleGroup battleGroup = Battle.battleGroupList.Find(x => x.battleType == battleGroupID); //새로운 배틀그룹 생성 if (!battleGroup) { Battle.CreateBattleGroup(battleGroupID, heroList); battleGroup = Battle.battleGroupList.Find(x => x.battleType == battleGroupID); while (!battleGroup.isInitialized) { yield return(null); } } //기본 배틀그룹의 멤버 변경 else { //기존 멤버중 없던애는 배틀 그룹에 새로 추가 & 스폰 for (int i = 0; i < heroList.Count; i++) { //기존 멤버는 가만히 냅둠 if (battleGroup.originalMember.Find(x => x.heroData == heroList[i])) { continue; } BattleHero battleHero = null; yield return(StartCoroutine(actorPool.Instance.GetActor(heroList[i].heroID, x => battleHero = x))); if (!battleHero) { continue; } battleHero.team = BattleUnit.Team.Red; battleHero.Init(battleGroup, heroList[i]); battleHero.gameObject.SetActive(true); battleHero.ReGen(); battleGroup.redTeamList.Add(battleHero); battleGroup.originalMember.Add(battleHero); } //기존 멤버 중 제외된 애는 배틀그룹에서 제외 for (int i = battleGroup.originalMember.Count - 1; i >= 0; i--) { HeroData heroData = heroList.Find(x => x == battleGroup.originalMember[i].heroData); if (heroData != null) { continue; } BattleHero h = battleGroup.originalMember[i]; h.heroData.battleGroupID = string.Empty; h.Despawn(); //battleGroup.originalMember[i].SetBattleGroup(null); //battleGroup.originalMember[i].gameObject.SetActive(false); battleGroup.originalMember.Remove(h); battleGroup.redTeamList.Remove(h); //h.heroData.battleGroupID = string.Empty; //h.Despawn(); } //데이타 저장 Battle.SaveStageInfo(battleGroup); } //Battle.ShowBattle(battleGroupID); //이렇게 안 하면 가장 마지막에 봤던 전투그룹으로 돌아가서 출전 후 다른 전투그룹이 비쳐짐 Battle.lastBattleGroupID = battleGroupID; //전투 화면으로 돌아가고 창 닫기 SceneLobby.Instance.SceneChange(LobbyState.Battle); Close(); //한프레임 쉬어야 프리킹 현상 없음 yield return(null); //페이드 인 if (isNewBattle) { UIFadeController.FadeIn(1f); } }
public IEnumerator InitCoroutine(BattleGroup battleGroup, BattleUnit.Team team = BattleUnit.Team.Red, List <HeroData> heroList = null) { while (actorList.Count > 0) { actorList[0].onDie -= OnDie; actorList[0].Despawn(); yield return(null); } deadTeamMemberCount = 0; teamMemberCount = 0; if (heroList == null) { yield break; } teamMemberCount = heroList.Count; for (int i = 0; i < teamMemberCount; i++) { BattleHero battleHero = null; yield return(StartCoroutine(actorPool.Instance.GetActor(heroList[i].heroID, x => battleHero = x))); if (!battleHero) { continue; } battleHero.team = team; if (battleGroup.battleType == BattleGroup.BattleType.PvP) { battleHero.InitPvP(battleGroup, heroList[i]); } else if (battleGroup.battleType == BattleGroup.BattleType.Normal) { battleHero.Init(battleGroup, heroList[i]); } battleHero.gameObject.SetActive(true); battleHero.ReGen(); battleHero.onDie += OnDie; actorList.Add(battleHero); } //스테이지 시작 trigger인 버프 적용하기 for (int i = 0; i < actorList.Count; i++) { BattleHero hero = actorList[i]; for (int a = 0; a < hero.buffController.buffList.Count; a++) { Buff buff = hero.buffController.buffList[a]; if (buff.baseData.trigger != "OnStartStage") { continue; } if (buff.triggerProbability < UnityEngine.Random.Range(1, 10001)) { continue; } BattleUnit target = null; if (buff.baseData.triggerTarget == "SkillTarget") { target = hero; } else if (buff.baseData.triggerTarget == "BuffTarget") { target = hero; } if (target && !target.isDie) { target.buffController.AttachBuff(hero, buff.baseData.triggerBuff, 1, buff); } } } }
override public void TriggerEffect() { //타겟 고르기 skill.CollectTargets(); //Debug.Log("타겟 초기화"); if (skill.targetList == null || skill.targetList.Count == 0) { if (skill.onTriggerEvent != null) { skill.onTriggerEvent(skill, skillEvent); } return; } for (int i = 0; i < skill.targetList.Count; i++) { BattleHero target = skill.targetList[i]; //타격 이펙트 if (skillEvent != null && skillEvent.hitEffect) { GameObject hitEffectObj = Battle.GetObjectInPool(skillEvent.hitEffect.name); //풀링 안되어 있으면 함. if (!hitEffectObj) { hitEffectObj = GameObject.Instantiate(skillEvent.hitEffect, target.transform.position, Quaternion.identity, skill.owner.transform.parent) as GameObject; hitEffectObj.name = skillEvent.hitEffect.name; //hitEffectObj.AddComponent<SelfDestroyParticle>(); hitEffectObj.SetActive(false); hitEffectObj.AddComponent <BattleGroupElement>(); Battle.AddObjectToPool(hitEffectObj); } if (hitEffectObj) { //Vector3 hitPos = target.GetClosestPoint(skill.owner.transform.position); Vector3 hitPos = target.collider.transform.position;// .GetClosestPoint(skill.owner.transform.position); hitEffectObj.transform.position = hitPos; if (skillEvent.attachToTarget) { hitEffectObj.transform.SetParent(target.transform); } hitEffectObj.transform.localScale = Vector3.one; //캐릭터 위치에 따라 뒤집기 if (skill.owner is BattleHero) { BattleHero h = skill.owner as BattleHero; bool isFlip = h.flipX; float x = isFlip ? -1f : 1f; hitEffectObj.transform.localScale = new Vector3(x, 1f, 1f); } //히트 파티클 오브젝트 활성 hitEffectObj.SetActive(true); hitEffectObj.GetComponent <BattleGroupElement>().SetBattleGroup(skill.owner.battleGroup); OrderController orderControllerA = hitEffectObj.GetComponent <OrderController>(); OrderController orderControllerB = target.GetComponent <OrderController>(); if (orderControllerA) { if (orderControllerB) { orderControllerA.parent = orderControllerB; } else { orderControllerA.parent = null; } } ParticleSystem p = hitEffectObj.GetComponentInChildren <ParticleSystem>(); if (p) { p.Play(); } Animation anim = hitEffectObj.GetComponentInChildren <Animation>(); if (anim) { anim.Play(); } } } bool isSuccessHit = false; //대상한테 데미지 적용. 힐은 피 채워줌 if (!string.IsNullOrEmpty(skill.skillData.power)) { double damageModifyType = 0d; if (skill.skillData.damageType == SkillBase.DamageType.Physical) { damageModifyType = skill.owner.master.stats.GetValueOf(StatType.AttackPowerPhysical); } else if (skill.skillData.damageType == SkillBase.DamageType.Magical) { damageModifyType = skill.owner.master.stats.GetValueOf(StatType.AttackPowerMagical); } double damageModifyRange = 0d; if (skill.skillData.rangeType == SkillBase.RangeType.Melee) { damageModifyRange = skill.owner.master.stats.GetValueOf(StatType.AttackPowerMelee); } else if (skill.skillData.rangeType == SkillBase.RangeType.Range) { damageModifyRange = skill.owner.master.stats.GetValueOf(StatType.AttackPowerRange); } double power = skill.GetPower(target) * (1 + damageModifyType * 0.0001d) * (1 + damageModifyRange * 0.0001d); //if (skill.owner.master.heroData.baseData.id.Contains("Centaur")) // Debug.Log(power + ", " + skill.GetPower(target) + ", " + damageModifyType + ", " + damageModifyRange); if (skill.skillData.effectType == "Heal") { target.Damage(skill.owner.master, -power, SkillBase.DamageType.Pure, skill, "Heal"); } else if (skill.skillData.effectType == "Resurrect") { target.Damage(skill.owner.master, -power, SkillBase.DamageType.Pure, skill, "Resurrect"); BattleHero h = target as BattleHero; h.ReGen(true); } else { //콜라 - 수호자 버프 처리 List <Buff> buffGuardList = target.buffController.buffList.FindAll(x => x.id == "Buff_Knight_Passive" && x.target == target && x.owner != target && !x.owner.isDie); if (buffGuardList != null && buffGuardList.Count > 0) { int count = buffGuardList.Count; for (int a = 0; a < count; a++) { //수호자들끼리 30%만큼 피해를 나눠서 받음 buffGuardList[a].owner.Damage(skill.owner.master, power * 0.3d * 1 / count, skill.skillData.damageType, skill, "Guard"); } //직접 얻어 맞은애는 70% isSuccessHit = target.Damage(skill.owner.master, power * 0.7d, skill.skillData.damageType, skill); } else { isSuccessHit = target.Damage(skill.owner.master, power, skill.skillData.damageType, skill); } //대상 흔들림 if (isSuccessHit && skill.skillData.forceType == SkillBase.ForceType.Shake) { target.Shake(0.4f, 0.15f, 0.03f); } } } if (skill.skillData.effectType == "Trail_End") { skill.owner.GetComponentInChildren <EffectTrail>().OffEffect(); } if (skill.skillData.forceType == SkillBase.ForceType.Dash) { if (skill.skillData.forcePower != 0f) { float force = skill.skillData.forcePower; Vector2 point = new Vector2(target.transform.position.x + force, target.transform.position.y); target.Dash(point, 1); } } // 밀기 if (skill.skillData.forceType == SkillBase.ForceType.Push) { if (skill.skillData.forcePower != 0f) { float force = skill.skillData.forcePower; //대상이 왼쪽에 있는 경우 반대로 함 if (target.transform.position.x < skill.transform.position.x) { force = -force; } //Debug.Log("force : " + force); target.addedForce += (Vector3.right * force); //Debug.Log("force : " + force); } //target.Knockback2(skill, skill.skillData.forcePower); } if (skill.skillData.forceType == SkillBase.ForceType.Pull) { float force = skill.skillData.forcePower; float filp = Random.Range(2.5f, 3.5f); float y = Random.Range(-1f, 1f); //대상이 왼쪽에 있는 경우 반대로 함 if (target.transform.position.x < skill.transform.position.x) { filp = -filp; } Vector2 point = new Vector2(skill.owner.master.transform.position.x + filp, skill.owner.master.transform.position.y + y); //Debug.Log(target.heroData.heroName + " 끌려옴"); target.Pull(point, 1); } else if (skill.skillData.forceType == SkillBase.ForceType.Knockback) { // 표현이 넉백에 가까움.. //밀어내기/당기기 효과 if (skill.skillData.forcePower != 0f) { float force = skill.skillData.forcePower; //대상이 왼쪽에 있는 경우 반대로 함 if (target.transform.position.x < skill.transform.position.x) { force = -force; } target.addedForce += Vector3.right * force; } } else if (skill.skillData.forceType == SkillBase.ForceType.Knockback2) { target.Knockback2(skill, skill.skillData.forcePower); } else if (skill.skillData.forceType == SkillBase.ForceType.Airborne) { target.Airborne(skill, skill.skillData.forcePower); } else if (skill.skillData.forceType == SkillBase.ForceType.FallDown) { target.FallingDown(skill, skill.skillData.forcePower); } //버프 적용 int r = UnityEngine.Random.Range(0, 10000); if (r <= skill.skillData.buffProbability) { target.buffController.AttachBuff(skill.owner.master, skill.skillData.buffID, skill.skillData.buffStack); } if (!isSuccessHit) { continue; } } if (skill.onTriggerEvent != null) { skill.onTriggerEvent(skill, skillEvent); } OnTrailEnd(); }