예제 #1
0
    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;
    }
예제 #2
0
    //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();
    }
예제 #3
0
    //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);
        }
    }
예제 #4
0
파일: BattleTeam.cs 프로젝트: TimonYoon/Dev
    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);
                }
            }
        }
    }
예제 #5
0
    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);
        }
    }