コード例 #1
0
 public override void setTag(TARGETTAG tg)
 {
     if (tg == TARGETTAG.ENEMY)
     {
         base.setTag(TARGETTAG.FRIEND);
     }
     else
     {
         base.setTag(TARGETTAG.ENEMY);
     }
 }
コード例 #2
0
    // Update is called once per frame
    void Update()
    {
        switch (curState)
        {
        case BattleState.INIT:
            //전투 시작전 준비 페이즈

            //모든 캐릭터 스킬 초기화
            foreach (BattleChar bc in myBC)
            {
                while (bc.DC.charSkillSet == null)
                {
                }
                bc.DC.charSkillSet.initSkillSet();
            }
            foreach (BattleChar bc in enemyBC)
            {
                while (bc.DC.charSkillSet == null)
                {
                }
                bc.DC.charSkillSet.initSkillSet();
            }

            curState++;
            break;

        case BattleState.OVER:

            foreach (BattleChar bc in myBC)
            {
                bc.DC.charSkillSet.resetSkillSet();
            }

            print("Battle Over!");    //yes//전투 결과를 업데이트한다. 이동씬으로 복귀한다.


            break;


        case BattleState.READY:
            //전투 전 페이즈
            //AP가 꽉찬 캐릭터 체크/ 전멸한 팀이 있는지 체크/ AP 업데이트
            //아군 또는 적군 유닛이 전멸하였는가?
            if ((myBattleChars.Count <= 0 || enemys.Count <= 0))
            {
                curState = BattleState.OVER;
                break;
            }
            //no//전투를 지속한다.

            //행동력이 꽉찬 캐릭터가 있는가?
            //yes//스킬사용
            else if (readyPlayer.Count > 0)
            {
                curState++;
            }
            //no//행동력이 꽉찰때까지 업데이트
            else
            {
                //모든 살아있는 캐릭터의 행동력 올리기 / 행동력이 꽉찬 캐릭터는 readyPlayer List에 추가
                foreach (GameObject T in myBattleChars.ToArray())
                {
                    BattleChar srt = T.GetComponent <BattleChar>();
                    if (srt != null)
                    {
                        if (srt.getHP() > 0.0f)
                        {
                            srt.UpdateAP();
                            if (srt.IsFullAP())
                            {
                                readyPlayer.Add(T);
                                readyBC.Add(srt);
                                srt.UpdateBuff();
                            }
                        }
                    }
                }
                foreach (GameObject T in enemys.ToArray())
                {
                    BattleChar srt = T.GetComponent <BattleChar>();
                    if (srt != null)
                    {
                        if (srt.getHP() > 0.0f)
                        {
                            srt.UpdateAP();
                            if (srt.IsFullAP())
                            {
                                readyPlayer.Add(T);
                                readyBC.Add(srt);
                                srt.UpdateBuff();
                            }
                        }
                    }
                }

                //행동력이 꽉찬 캐릭터들을 스피드 순으로 정렬
                readyPlayer.Sort(delegate(GameObject a, GameObject b) { return(a.GetComponent <BattleChar>().getSPD().CompareTo(b.GetComponent <BattleChar>().getSPD())); });
                readyBC.Sort(delegate(BattleChar a, BattleChar b) { return(a.getSPD().CompareTo(b.getSPD())); });
            }

            break;

        case BattleState.START:
            //전투 시작, 배틀매니저와 캐릭터를 셋업
            player = readyPlayer[0].GetComponent <BattleChar>();
            target.Clear();
            ClearTile();
            originPos = player.transform.position;

            if (player.stateSturn != null)
            {
                if (player.stateSturn.getTurn() > 0)
                {
                    player.curAP = 0;
                    curState     = BattleState.END;
                    break;
                }
            }
            else if (player.stateCount != null)
            {
                if (player.stateCount.getTurn() > 0)
                {
                    player.curAP = 0;
                    curState     = BattleState.END;
                    break;
                }
            }

            // 스킬 ID를 스킬 객체에 전달
            skills.AddRange(player.DC.charSkillSet.set);
            for (int i = 0; i < 4; i++)
            {
                if (skills[i].type == SKILLTYPE.PAS)
                {
                    //패시브
                    buttons[i + 1].GetComponent <Button>().interactable = false;
                }
                else if (!skills[i].testMP())
                {
                    //마나가 부족한 경우
                    buttons[i + 1].GetComponent <Button>().interactable = false;
                }
                else
                {
                    //액티브 스킬이고 마나가 충분한 경우
                    if (skills[i].targetTag == TARGETTAG.FRIENDDEAD)
                    {
                        if (myDeadBC.Count <= 0)
                        {
                            buttons[i + 1].GetComponent <Button>().interactable = false;
                            break;
                        }
                    }

                    if (skills[i].targetTag == TARGETTAG.ENEMYDEAD)
                    {
                        if (myDeadBC.Count <= 0)
                        {
                            buttons[i + 1].GetComponent <Button>().interactable = false;
                            break;
                        }
                    }


                    buttons[i + 1].GetComponent <Button>().interactable = true;
                }
            }
            normal = player.DC.charSkillSet.normal;

            //버튼 이미지 스킬 아이디에 맞추어 변경하기
            buttons[0].GetComponent <Image>().sprite = Resources.Load <Sprite>(normal.image);

            for (int i = 0; i < 4; i++)
            {
                buttons[1 + i].GetComponent <Image>().sprite = Resources.Load <Sprite>(skills[i].image);
            }

            //현재 스킬 사용중인 캐릭터 보여주기용


            //스킬 사용창 활성화
            if (player.tg == TARGETTAG.FRIEND)
            {
                skWIndow.SetActive(true);
            }

            curState++;
            break;

        case BattleState.TARGET:
            //스킬 선택 및 공격할 타겟 선택
            ClearTile();

            player.floor.GetComponent <MeshRenderer>().material.color = Color.yellow;
            player.floor.SetActive(true);

            //플레이어 캐릭터
            if (player.tg == TARGETTAG.FRIEND)
            {
                //스킬 선택하기 in 스킬 메뉴
                //스킬 사용 가능 타겟 표시하기 및 설정
                if (!sklSelected.Equals(nullSkl))
                {
                    //print(sklSelected.level);
                    switch (sklSelected.targetTag)
                    {
                    case TARGETTAG.ENEMY:
                        foreach (GameObject obj in enemys.ToArray())
                        {
                            obj.GetComponent <BattleChar>().getTarget().floor.GetComponent <MeshRenderer>().material.color = Color.red;
                            obj.GetComponent <BattleChar>().getTarget().floor.SetActive(true);
                        }
                        targetNum = sklSelected.targetNum;
                        tg        = sklSelected.targetTag;

                        break;

                    case TARGETTAG.ENEMYALL:
                        foreach (GameObject obj in enemyField)
                        {
                            obj.GetComponent <MeshRenderer>().material.color = Color.red;

                            obj.SetActive(true);
                        }
                        targetNum = enemys.Count;
                        tg        = TARGETTAG.ENEMY;

                        break;

                    case TARGETTAG.FRIEND:
                        foreach (GameObject obj in myBattleChars.ToArray())
                        {
                            obj.GetComponent <BattleChar>().floor.GetComponent <MeshRenderer>().material.color = Color.green;

                            obj.GetComponent <BattleChar>().getTarget().floor.SetActive(true);
                        }
                        targetNum = sklSelected.targetNum;
                        tg        = TARGETTAG.FRIEND;

                        break;

                    case TARGETTAG.FRIENDALL:
                        foreach (GameObject obj in myField)
                        {
                            obj.GetComponent <MeshRenderer>().material.color = Color.green;
                            obj.SetActive(true);
                        }
                        targetNum = myBattleChars.Count;
                        tg        = TARGETTAG.FRIEND;

                        break;

                    case TARGETTAG.SELF:
                        player.floor.GetComponent <MeshRenderer>().material.color = Color.green;
                        player.getTarget().floor.SetActive(true);
                        targetNum = 1;
                        tg        = TARGETTAG.FRIEND;

                        break;

                    case TARGETTAG.FRIENDDEAD:
                        foreach (BattleChar bc in myDeadBC)
                        {
                            bc.floor.GetComponent <MeshRenderer>().material.color = Color.green;
                            bc.getTarget().floor.SetActive(true);
                        }

                        break;

                    case TARGETTAG.ENEMYDEAD:
                        foreach (BattleChar bc in enemyDeadBC)
                        {
                            bc.floor.GetComponent <MeshRenderer>().material.color = Color.red;
                            bc.getTarget().floor.SetActive(true);
                        }

                        break;

                    case TARGETTAG.NONE:

                        break;
                    }

                    //타겟 선택하기
                    SelectTarget(target);

                    //타겟 선택이 끝나면
                    if (target.Count == targetNum)
                    {
                        curState++;                //다음 단계로 이동
                        skWIndow.SetActive(false); // 스킬창 닫기
                        ClearTile();               //발판 색 초기화
                        break;
                    }
                }
            }
            //적 캐릭터
            else
            {
                // 스킬 선택
                sklSelected = ((EnemySkillSet)player.DC.charSkillSet).getSkill();

                // 타겟 선택
                target.AddRange(((EnemyActiveSkills)sklSelected).getTarget());

                // 테스트 용도로 적 캐릭터 스킬도 사용자가 선택함, 실제 사용시 AI를 구현 적용해야됨
                //if (!sklSelected.Equals(nullSkl))
                //{
                //    //print(sklSelected.level);
                //    switch (sklSelected.targetTag)
                //    {
                //        case TARGETTAG.ENEMY:
                //            foreach (GameObject obj in enemys.ToArray())
                //            {
                //                obj.GetComponent<BattleChar>().getTarget().floor.GetComponent<MeshRenderer>().material.color = Color.red;
                //                obj.GetComponent<BattleChar>().getTarget().floor.SetActive(true);
                //            }
                //            targetNum = sklSelected.targetNum;
                //            tg = sklSelected.targetTag;

                //            break;

                //        case TARGETTAG.ENEMYALL:
                //            foreach (GameObject obj in enemyField)
                //            {
                //                obj.GetComponent<MeshRenderer>().material.color = Color.red;
                //                obj.SetActive(true);
                //            }
                //            targetNum = enemys.Count;
                //            tg = TARGETTAG.ENEMY;

                //            break;

                //        case TARGETTAG.FRIEND:
                //            foreach (GameObject obj in myBattleChars.ToArray())
                //            {
                //                obj.GetComponent<BattleChar>().floor.GetComponent<MeshRenderer>().material.color = Color.green;
                //                obj.GetComponent<BattleChar>().getTarget().floor.SetActive(true);
                //            }
                //            targetNum = sklSelected.targetNum;
                //            tg = TARGETTAG.FRIEND;

                //            break;

                //        case TARGETTAG.FRIENDALL:
                //            foreach (GameObject obj in myField)
                //            {
                //                obj.GetComponent<MeshRenderer>().material.color = Color.green;
                //                obj.SetActive(true);
                //            }
                //            targetNum = myBattleChars.Count;
                //            tg = TARGETTAG.FRIEND;

                //            break;

                //        case TARGETTAG.SELF:
                //            player.floor.GetComponent<MeshRenderer>().material.color = Color.green;
                //            player.getTarget().floor.SetActive(true);
                //            targetNum = 1;
                //            tg = TARGETTAG.FRIEND;

                //            break;

                //        case TARGETTAG.NONE:

                //            break;

                //    }

                //    //타겟 선택하기
                //    SelectTarget(target);

                //타겟 선택이 끝나면
                if (target.Count == sklSelected.targetNum)
                {
                    curState++;                //다음 단계로 이동
                    skWIndow.SetActive(false); // 스킬창 닫기
                    ClearTile();               //발판 색 초기화
                    break;
                }
                //}
            }

            break;

        case BattleState.SPELL:
            //선택된 스킬이 실제로 적용되는 단계
            //zoomPlayerCam();

            if (animStack <= 0)
            {
                print(player.name + " use " + sklSelected.name);
                sklSelected.useSkill(target);
            }
            else
            {
                curState++;
                //curState = BattleState.END;
            }
            break;

        case BattleState.ANIM:
            //애니메이션 출력 되는 단계
            if (animStack <= 0)
            {
                curState = BattleState.END;
            }

            break;

        case BattleState.END:     //전투의 끝, 배틀 매니저 초기화
            resetCam();
            player2origin();


            player.StateUpdate();
            player.EndBuff();
            player.curAP = 0;
            print(player.body.name + "'s turn is end.");
            readyPlayer.Remove(player.body);
            readyBC.Remove(player);

            sklSelected = nullSkl;
            target.Clear();
            skills.Clear();
            targetNum = 10;


            curState = BattleState.READY;

            break;
        }
    }
コード例 #3
0
ファイル: Skill.cs プロジェクト: MAC-10-Ingram/EFD
 public virtual void setTag(TARGETTAG tg)
 {
     targetTag = tg;
 }