TurnManager

TurnManager에서는 턴을 관리하고, 코스트를 관리한다.

1.턴

게임 시작 code

    WaitForSeconds delay05 = new WaitForSeconds(0.5f);
    public IEnumerator StartGameCo() //게임을 시작
    {
        Gamesetup(); // 코스트 설정
        isLoading =true;
        for(int i=0;i<startCardCount;i++)
        {
            yield return delay05; //0.5초 간격으로 카드 뽑는다.
            OnAddCard?.Invoke(true);
        }
        StartCoroutine(StartTurnCo());
    }

턴 시작 code

    IEnumerator StartTurnCo()
    {
        isLoading =true;
        SetGauge(myTurn);
        if(myTurn) // 나의 턴일 때는 알림이 뜬다. 
        {
            GameManager.Inst.Notification("나의 턴!");
            AbilityManager.Inst.eTurnState=AbilityManager.ETurnState.turnStart; 
            AbilityManager.Inst.stateTrigger =true;
        }
        yield return delay07;
        if(myTurn)
            OnAddCard?.Invoke(myTurn);
        yield return delay07;
        isLoading =false;
        OnTurnStarted?.Invoke(myTurn);
    }

2.코스트

코스트는 게임을 하면서 매턴 1개의 최대 용량이 증가하고 시작 시에는 2개로 시작된다. 몬스터를 소환하거나 마법을 사용할 때 코스트를 사용한다.

    void Gamesetup() //최초의 코스트는 2씩 지급
    {
        myGaugeCnt =2;
        otherGaugeCnt=2;
        myTurn = FirstTurn();
    }
    public bool FirstTurn() // 카드의 코드를 비교하여 우선 순위를 정하고, 내가 선이면 true 상대가 선이면 false를 반환
    {
        for(int i =0;i<50;i++)
        {
            if(CardManager.Inst.itemBuffer[i].code>CardManager.Inst.otherItemBuffer[i].code)
            {
                return true;
            }
            else if(CardManager.Inst.itemBuffer[i].code<CardManager.Inst.otherItemBuffer[i].code)
            {
                return false;
            }
        }
        return true;
    }

버튼을 통해 턴을 종료할 때마다 내가 종료하면 상대의 최대 코스트 한개가 증가, 상대가 종료하면 내 코스트가 증가

    public void EndTurn()
    {
        if(myTurn)
        {
            otherGaugeCnt++;
            AbilityManager.Inst.eTurnState=AbilityManager.ETurnState.turnEnd;
            AbilityManager.Inst.stateTrigger =true;
            byte[] send = new byte[1] {Convert.ToByte(106)};
            Backend.Match.SendDataToInGameRoom(send);
        }
        else
        {
            myGaugeCnt++;
        }
        myTurn = !myTurn;
        Debug.Log("End Turn");

        StartCoroutine(StartTurnCo());
    }

턴 시작 코루틴이 진행될 때 호출되며, 코스트의 값에 따라 코스트 오브젝트를 화면에 표시한다.

< 코스트 >

    public void SetGauge(bool myTurn)
    {
        if(myTurn)
        {
            for(int i=0;i<myGaugeCnt;i++)
            {
                myGauge.transform.GetChild(i).gameObject.SetActive(true);
            }
            myNowGaugeCnt=myGaugeCnt;
        }
        else
        {
            for(int i=0;i<otherGaugeCnt;i++)
            {
                otherGauge.transform.GetChild(i).gameObject.SetActive(true);
            }
            otherNowGaugeCnt = otherGaugeCnt;
        }
    }

코스트를 소모할 때마다 호출되며, 인자로 나인지 상대인지, 사용되는 코스트의 값을 갖는다.

    public void ConsumeCost(bool isMine, int cost)
    {
        int cnt = isMine ? myNowGaugeCnt : otherNowGaugeCnt;
        GameObject Gauge = isMine ? myGauge : otherGauge;
        cnt = cnt -cost;
        if(isMine)
            myNowGaugeCnt -=cost;
        else
            otherNowGaugeCnt -=cost;
        for(int i=0; i<22;i++)
        {
            Gauge.transform.GetChild(i).gameObject.SetActive(false);
        }
        for(int i=0;i<cnt;i++)
        {
            Gauge.transform.GetChild(i).gameObject.SetActive(true);
        }
    }