[Unity2D] 새콤달콤 딸기농장 메인 오브젝트 개발(8) - 연구 기능 구현

SHG·2022년 5월 25일
0

알바생 API가 끝나고 이젠 연구 API를 구현할 차례가 왔다..! 새콤달콤 딸기농장의 연구 기능은 아래와 같이 총 6가지이다.

모든 연구를 구현해보도록 하자..!

구현🪄


현재 UI는 다른 팀원분이 만들어 놓으셨고 필자는 골드 버튼을 눌렀을 때 적용되는 API를 구현하면 된다!

우선 각 딸기의 가치는

를 참고하며 근접하게 구현하였다.

Globalvariable.cs 🌍

	public readonly int CLASSIC_FIRST = 6;
    public readonly int SPECIAL_FIRST = 100;
    public readonly int UNIQUE_FIRST = 200;

Globalvariable을 적용한 global 오브젝트를 받아와서 글로벌 변수들을 적용했다. 이 때

float researchCoeffi = (DataController.instance.gameData.researchLevel[num]) * globalVar.getEffi();

이 코드를 통해 저장되어야 할 변수인 연구레벨을 가져온 뒤 global.getEffi()로 미리 정해놓은 2%라는 계수를 곱해 연구 계수를 만든다.

Research.cs 🧑‍🏭

public void clickCoin_Research()
{
	//...
    DataController.instance.gameData.researchLevel[prefabnum]++;//레벨업
    //...
}

위의 코드를 통해 저장되어야 할 변수인 researchLevel[prefabnum]의 레벨을 연구 버튼을 눌렀을 시 1씩 증가시킨다.

IncreaseBerryPrice() 🍓

public void IncreaseBerryPrice()
{
    float researchCoeffi = (DataController.instance.gameData.researchLevel[0]) * globalVar.getEffi();     
    for (int i = 0; i < 192; i++)
    {
        if (globalVar.berryListAll[i] == null) continue;

        if (i < 64)
            globalVar.berryListAll[i].GetComponent<Berry>().berryPrice
                = Convert.ToInt32((globalVar.CLASSIC_FIRST + i * 3) * (1 + researchCoeffi));
        else if (i < 128)
            globalVar.berryListAll[i].GetComponent<Berry>().berryPrice
                = Convert.ToInt32((globalVar.SPECIAL_FIRST + (i - 64) * 5) * (1 + researchCoeffi));
        else
            globalVar.berryListAll[i].GetComponent<Berry>().berryPrice
                = Convert.ToInt32((globalVar.UNIQUE_FIRST + (i - 128) * 7) * (1 + researchCoeffi));
    }
}

버튼이 눌렸을 때 IncreaseBerryPrice()가 호출되며 모든 딸기의 값을 레벨당 2%씩 증가시킨다.

문제 발생 및 해결 💡

여기선 Convert.ToInt32(float)형식으로 float를 int으로 형 변환하는데 필자는 초기에 단순(int)로 변환을 했었다. 하지만 데이터가 생각했던 것 처럼 나오지 않아 찾아보니 (자료형)형식은 안전하지 않은, 즉 데이터가 손실될 수 있는 변환방식이라고 한다.

DecreaseBerryGrowTime() 🌳

public void DecreaseBerryGrowTime()
{
       
   float researchCoeffi = (DataController.instance.gameData.researchLevel[1]) * Globalvariable.instance.getEffi();

   for (int i = 0; i < DataController.instance.gameData.stemLevel.Length; i++)
   {
       DataController.instance.gameData.stemLevel[i] = (Globalvariable.instance.STEM_LEVEL[i] * (1 - researchCoeffi));
   }

}

저장되어 있는 데이터인 딸기의 성장 시간을 정하는

DataController.instance.gameData.stemLevel[i]

을 가져와 4개의 구간 연구 계수에 따라 감소시켜준다.

DecreaseBugGenerateProb() 🌱

public void DecreaseBugGenerateProb()
{
    float researchCoeffi = (DataController.instance.gameData.researchLevel[3]) * Globalvariable.instance.getEffi();     
    DataController.instance.gameData.bugProb = (Globalvariable.BUG_PROB * (1 - researchCoeffi));
}

DecreaseWeedGenerateProb() 🕷️

public void DecreaseWeedGenerateProb()
{
    float researchCoeffi = (DataController.instance.gameData.researchLevel[4]) * Globalvariable.instance.getEffi();
    DataController.instance.gameData.weedProb = Globalvariable.WEED_PROB * (1 - researchCoeffi);
}

잡초와 벌레는 동일하게 저장되어 있는 데이터인 bugProb, weedProb를 가져와 연구 계수만큼 낮추어준다.

IncreaseRainDuration() 🌧️

시원한 소나기 연구는 소나기의 지속 시간을 늘려주는 연구로 Particle로 구현한 소나기의 duration을 늘려주면 구현 가능했다. 이 때 duration에 직접 접근하여 수정하려고 하면 readonly 형식이기때문에 수정이 불가하다!! 따라서 .main을 통해 우회적으로 값을 대입해주는 방식을 채택하였다.

public void IncreaseRainDuration()
{
    float researchCoeffi = (DataController.instance.gameData.researchLevel[4]) * Globalvariable.instance.getEffi();

    var main = rainParticle.main;
    main.duration = Globalvariable.RAIN_DURATION * (1 + researchCoeffi);

    DataController.instance.gameData.rainDuration = Globalvariable.RAIN_DURATION * (1 + researchCoeffi);
}

하지만 이 때 만약 파티클이 실행 중 일 때 파티클의 지속 시간을 변경하려고 한다면 아래와 같은 오류가 발생한다.

이러한 오류를 피하려면 비가 내리고 있는지 확인하는 조건문에 만약 비가 내리고 있다면 비가 끝나고 지속 시간을 늘리는 방식으로 구현해야한다!!

따라서

public void AccessRainDuration()
{
    var main = rainParticle.main;

    if (rainParticle.isPlaying)
    {
        Invoke("IncreaseRainDuration", rainParticle.main.duration + 1.0f);
    }
    else
    {
        IncreaseRainDuration();
    }  
}

와 같이 비가 내리고 있을 때 Invoke 함수로 지속 시간 + 1초만큼 이 후에 안전하게 지속 시간을 늘렸다.

GameManager.cs ⚙️

ClickedTruck() 🛻

public void ClickedTruck()
{
    bonusTruckCoin = (int)(DataController.instance.gameData.truckCoin *
        DataController.instance.gameData.researchLevel[5] * Globalvariable.instance.getEffi());
    ShowCoinText(truckCoinText, DataController.instance.gameData.truckCoin);
    ShowCoinText(truckCoinBonusText, bonusTruckCoin);
}

부르는 게 값 연구는 Research.cs에서 연구레벨만 증가시켜준다면 더 해줄 처리는 없다!! 트럭을 눌렀을 때 해당 연구 레벨을 불러와서 보너스 코인을 보여주는 형식으로 구현 하였다!!

profile
기록에 익숙해지자...!

1개의 댓글

comment-user-thumbnail
2022년 5월 28일

얼른 하게해주세요

답글 달기