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; }
//public TextMeshProUGUI resultUI; #endregion protected override void UnityAwake() { CardSelectorManager.SetIns(cardSelectorManager); resultPanel.gameObject.SetActive(false); BattleHero tempHero; if (CharacterInDungeon.Ins == null) { tempHero = Initializer.Ins.defaultHero; } else { tempHero = Initializer.Ins.GetHero(CharacterInDungeon.Ins.character); } hero = tempHero.gameObject.CreateWithoutChange(heroParent).GetComponent <BattleHero>(); hero.Init(); BattleCharacterManager.Ins.SetHero(hero); this.signals = new SignalController(); }
//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() { //풀링 안되어 있으면 함. GameObject summonObj = Battle.GetObjectInPool(skillEvent.summonObject.name); if (!summonObj) { summonObj = GameObject.Instantiate(skillEvent.summonObject, skill.owner.transform.position, Quaternion.identity, skill.owner.transform.parent) as GameObject; summonObj.transform.localPosition = Vector3.zero; summonObj.name = skillEvent.summonObject.name; //summonObj.GetComponent<Totem>().Init(owner); if (!summonObj.GetComponent <BattleGroupElement>()) { summonObj.AddComponent <BattleGroupElement>(); } Battle.AddObjectToPool(summonObj); } if (!summonObj) { return; } summonObj.SetActive(false); //랜덤한 위치, 배경에서 삐져나가지 않게 스폰 float posX = UnityEngine.Random.Range(-1f, 1f); float posY = UnityEngine.Random.Range(-1f, 1f); Vector3 pos = skill.owner.transform.position + new Vector3(posX, posY, skill.owner.transform.position.z); BoxCollider unitArea = skill.owner.battleGroup.GetComponentInChildren <BoxCollider>(); pos.y = Mathf.Clamp(pos.y, unitArea.bounds.min.y, unitArea.bounds.max.y); summonObj.transform.position = pos; if (skill.castTarget) { summonObj.transform.position = skill.castTarget.transform.position; } Totem t = summonObj.GetComponent <Totem>(); if (t) { t.lifeTime = skill.skillData.summonTime; t.Init(skill.owner); } bool isNecromancy = skill.skillData.summonID.Contains("Skeleton"); bool isDoppelganger = skill.skillData.summonID.Contains("Ninja"); BattleHero hero = summonObj.GetComponent <BattleHero>(); if (hero) { hero.team = skill.owner.team; HeroData hData = null; if (!string.IsNullOrEmpty(skill.skillData.summonID) && HeroManager.heroBaseDataDic.ContainsKey(skill.skillData.summonID)) { hData = new HeroData(HeroManager.heroBaseDataDic[skill.skillData.summonID]); } Stat attackPower = skill.owner.stats.GetParam(StatType.AttackPower); //강령술 하드코딩. 시전자 공격력에 영향 받아서 hp, 공격력 결정 if (isNecromancy) { hero.master = skill.owner; hData.baseData.maxHP = 1; /*attackPower.value * 2*/; // (int)(skill.owner.attackPower * 2f); hData.baseData.attackPower = (int)(attackPower.value * 0.1f); // (int) (skill.owner.attackPower * 0.1f); //강령술로 소환한 애들은 부활 불가 hero.canResurrect = false; //강령술 대상이 된 애들도 부활 불가 if (skill.castTarget) { skill.castTarget.canResurrect = false; } } hero.lifeTime = skill.skillData.summonTime; hero.Init(skill.owner.battleGroup, hData, skill.owner.team); Stat statMaxHP = hero.stats.GetParam(StatType.MaxHP); if (statMaxHP != null) { statMaxHP.baseValue = attackPower.value * 2; } Stat statCurHP = hero.stats.GetParam(StatType.CurHP); statCurHP.value = statMaxHP.value; if (!isNecromancy) { hero.isFinishSpawned = true; } if (isDoppelganger) { hero.master = skill.owner; statMaxHP.value = 1d; statCurHP.value = statMaxHP.value; Stat statAttackPower = hero.stats.GetParam(StatType.AttackPower); statAttackPower.value = attackPower.value; hero.canResurrect = false; } //소환물 설정 hero.isSummonded = true; } //소환된 애 오브젝트 활성 summonObj.SetActive(true); summonObj.GetComponent <BattleGroupElement>().SetBattleGroup(skill.owner.battleGroup); if (hero) { if (hero.team == BattleUnit.Team.Red) { skill.owner.battleGroup.redTeamList.Add(hero); } else if (hero.team == BattleUnit.Team.Blue) { skill.owner.battleGroup.blueTeamList.Add(hero); } if (isNecromancy) { hero.skeletonAnimation.enabled = true; //Debug.Log(hero.skeletonAnimation.state.GetCurrent(0)); hero.skeletonAnimation.state.ClearTrack(0); hero.skeletonAnimation.state.SetAnimation(0, "Resurrect", false); //hero.skeletonAnimation.state.Interrupt += OnInterruptResurrect; hero.skeletonAnimation.state.AddAnimation(0, hero.idleAnimation, true, 0f); //hero.StartCoroutine(CheckFinishResurrect(hero)); } if (isDoppelganger) { //분신 위치 조정 if (skill.owner.summonCount > 0) { Vector3 summonPos = skill.owner.transform.position; summonPos.x += -3f; summonObj.transform.position = summonPos; } else { Vector3 summonPos = skill.owner.transform.position; summonPos.x += 3f; summonObj.transform.position = summonPos; } hero.skeletonAnimation.enabled = true; hero.skeletonAnimation.state.ClearTrack(0); hero.skeletonAnimation.state.SetAnimation(0, "Skill_Clone", false); hero.skeletonAnimation.state.AddAnimation(0, hero.idleAnimation, true, 0f); hero.spineAnimationDie = hero.skeletonAnimation.SkeletonDataAsset.GetAnimationStateData().skeletonData.FindAnimation("Die_Clone"); } } skill.owner.summonCount += 1; if (skill.onTriggerEvent != null) { skill.onTriggerEvent(skill, skillEvent); } }