게임 엔진/Unity

[Unity] Gpt를 활용한 가변 슬라이더 만들기

겜도리도리 2023. 7. 19. 16:57
반응형

개요

가변 슬라이더를 만들어야 했는데... 다 만들고 난 뒤 GPT를 사용해 리팩토링한 경험을 공유한다.

 

니즈

원래 위와 같은 슬라이더가 있었다. 작은 흰색 동그라미가 50 단위로 있었는데, 보상 단위마다는 흰색 큰 동그라미를 넣어주었다.

이 슬라이더를 보상 간격이 일정하게 바꿔달라고 요청이 들어왔는데, 그러면 보상 단위마다 슬라이더가 차는 비율을 조정해야했다.

요렇게 보상마다 포인트 간격은 다르고, 간격은 일정하게 바꿨어야 했음

구현

QuestData = 현재 퀘스트 정보를 저장하고 있는 클래스

rewardData = 포인트 리워드 정보를 가지고 있는 클래스

int rewardDatesLength = rewardDatas.Count();
int rewardStep = 0;
for (int idx = 0; idx < rewardDatesLength; idx++)
{
    if (QuestData.Point >= rewardDatas[idx].RewardPoint)
    {
        rewardStep = idx + 1;
    }
    else
        break;
}

처음에는 몇단계까지 해금을 했는지를 찾아 rewardStep 변수에 저장에 줬다.

float gaugeValue = 0.0f;
if (rewardStep == rewardDatesLength)
{
    gaugeValue = 1.0f;
}
else
{
    gaugeValue = (float)rewardStep / rewardDatesLength;
    float gaugeValueStart;
    if (rewardStep == 0)
    {
        gaugeValueStart = 0.0f;
    }
    else
    {
        gaugeValueStart = rewardDatas[rewardStep - 1].RewardPoint;
    }
    float gaugeValueEnd = rewardDatas[rewardStep].RewardPoint;
    float t = (float)(QuestData.Point - gaugeValueStart) / (gaugeValueEnd - gaugeValueStart);
    gaugeValue += Mathf.Lerp(0.0f, 1.0f / rewardDatesLength, t);
}

SilderGauge.value = gaugeValue;

그 후에는 gaugeValue 값을 구한 뒤, 슬라이더의 값을 gaugeValue로 설정해주었다.

만땅인 경우에는 꽉 채워주고, 아닌 경우에는 현재까지 누적된 RewardStep의 포인트 정보 + 다음 Step까지의 값을 가져와 Start와 End에 설정해주었다.

이 때 리워드에는 초기값 정보가 없어서 (받을 리워드 정보만 들어있음) 하나도 보상을 수령 못한 경우에는 Start를 0으로 설정했다.

최종 gagueValue 값은 Lerp를 사용해 구하였다.

 

구현 완료

구현은 완료했지만,,, 만족스럽지 못한 부분이 있어서 리팩토링을 하기로 했다.

qpt 사용함.

 

리팩토링

int rewardDatesLength = rewardDatas.Count();
int rewardStep = 0;
for (int idx = 0; idx < rewardDatesLength; idx++)
{
    if (QuestData.Point >= rewardDatas[idx].RewardPoint)
    {
        rewardStep = idx + 1;
    }
    else
        break;
}

먼저 rewardStep을 구하는 부분은 LINQ로 더 간단하게 줄일 수 있었다.

int rewardStep = rewardDatas.TakeWhile(e => playerPeriodPointQuest.Point >= e.RewardPoint).Count();

무분별한 LINQ는 자제해야한다고는 하지만,,, TakeWhile을 사용하면 엄청 간단하게 코드를 줄일 수 있었다.

float gaugeValue = 0.0f;
if (rewardStep == rewardDatesLength)
{
    gaugeValue = 1.0f;
}
else
{
    gaugeValue = (float)rewardStep / rewardDatesLength;
    float gaugeValueStart;
    if (rewardStep == 0)
    {
        gaugeValueStart = 0.0f;
    }
    else
    {
        gaugeValueStart = rewardDatas[rewardStep - 1].RewardPoint;
    }
    float gaugeValueEnd = rewardDatas[rewardStep].RewardPoint;
    float t = (float)(QuestData.Point - gaugeValueStart) / (gaugeValueEnd - gaugeValueStart);
    gaugeValue += Mathf.Lerp(0.0f, 1.0f / rewardDatesLength, t);
}

SilderGauge.value = gaugeValue;

복잡하게 게이지를 계산하던 부분은

float gaugeValue = rewardStep / (float)rewardDatas.Count;

if (rewardStep < rewardDatas.Count)
{
    float additionalGaugeStart = (rewardStep == 0) ? 0.0f : rewardDatas[rewardStep - 1].RewardPoint;
    float additionalGaugeEnd = rewardDatas[rewardStep].RewardPoint;
    float t = (playerPeriodPointQuest.Point - additionalGaugeStart) / (additionalGaugeEnd - additionalGaugeStart);
    gaugeValue += Mathf.Lerp(0.0f, 1.0f / rewardDatas.Count, t);
}

SliderGauge.value = gaugeValue;

1. 처음에 이미 획득한 Step만큼 게이지를 미리 설정해주고

2. 아직 획득하지 못한 보상이 있다면 추가적인 게이지를 더해준다.

3. Start는 3항 연산자를 사용하여 보상을 아직 하나도 받지 못하는 상태라면 0으로 설정

4. 추가적인 게이지를 구하는 공식은 마찬가지로 Lerp사용

 

길고 불필요한 코드가 싹다 제거가 되었다!

gpt는 신이다.

반응형