유니티 -방치형 프로젝트 (버튼 클릭 시 레벨업 적용하기)

반응형

개요

지난번에 구현해놨던 버튼에 실제 레벨 디자인을 적용하여 버튼을 눌렀을때 시각적으로 현재 경험치가 몇인지 얼마다 더 올려야하는지를 볼 수 있 도록 작업할 것이다. 우선 버튼 구현 했던 글은 아래 링크를 참조하면 된다.

 

유니티 방치형 프로젝트 - 모바일 버튼 터치 구현 관련 글

 

유니티 방치형 프로젝트 - 모바일 버튼 터치, 연속터치 판별 로직 작성 ( + 두트윈 사용하기)

커밋 : f27ee08227f3f820135ba0360756d6d9986f7dce터치 인터페이스 선언방치형 게임을 하다 보면 일반 터치와 쭉 누르면 연속 터치가 존재한다.구현해보자유니티에서 터치를 인식하는 인터페이스 IPointerDownH

cherry22.tistory.com

커밋 : fdfe9384b394abdc2e99db95f24da9d62dbf138f

핵심요약

1. 레벨디자인 데이터 CSV 파일을 파싱해서 사용하는 방법을 익힘

2. 수학적 수식을 통해 레벨업 관련 벨런싱 감각 익히기

 

구현할 것

1. 경험치 수치를 보여주는 수치 Bar
2. 경험치 퍼센트 (수치 Bar우측)
3. 예상 경험치? (초록색 EXP 우측)
4. 공격력 수치
5. 체력 수치

 

구현 결과물

스크립트 역할 간단 요약

1. CSVReader.cs  (모노 x)

 

✅ 호출지점

Csv_Importer (초기화 시점에 한 번만 호출함)

 

✅ 역할

  • 이 스크립트는 데이터를 가공한다.
  • 파일명을 인자로 받아 Resources 폴더에서 일치하는 파일명을 찾은 후 잘 가공해서 List<Dictionary<string,object> 타입으로 반환해준다
  • 아래 데이터를 리스트<딕셔너리<>> 에 잘 정리해서 반환하는 역할이며 직접적으로 실행하지 않고 외부호출에 의해 초기화 한다.

 

2. Csv_Importer ( 모노 x )

✅ 호출 지점

데벨디자인 데이터가 필요한 곳에서 호출함 
CSVReader.Read는 여러번 호출이 아닌 초기화 부분으로 1회만 호출

 

✅ 역할

  • 데이터 보관
  • static 처리 되어있기 때문에 아래처럼 외부에서 Csv_Importer 스크립트를 참조해서 데이터를 가져간다.

한 마디로 데이터 캐싱

 

✅ 3.Player_Mng (모노 x)

 

✅ 호출지점

아래와 같이 베이스 매니저에서 new를 통해 메모리에 올려둔다.

 

✅ Player_Mng 역할

  • MVC에서 모델에 가깝다 이유는 플레이어의 현재 레벨, 현재 경험치, 현재 체력, 공격력 등을 프로퍼티 Level, Exe, Hp,Atk 로 선언했기 때문.
  • 따라서 버튼을 클릭하거나 UI에 현재 레벨 경험치 등을 보여주기 위해 데이터 접근이 필요할 때 모델인 Player_Mng로 접근하는게 핵심이고 수학적 계산을 통해 데이터를 반환하도록 하는 메서드로 이루어진 스크립트이다.

 

Player_Mng.cs의 메서드 설명

1. 경험치 누적 및 레벨업 메서드 (ExpUp)

 

✅ 역할

뷰에서 버튼을 누르는 등의 상호작용에 의해 ExpUP을 호출하면 아래 메서드가 실행 되는데 단순하게 경험치를 누적시키고 레벨업 조건에 부합하다면 레벨업을 한다.

Exp[Level] 인자로 들어가는 Level은 초기값이 0이고 CSV에서는 첫 번째 row이다
어쩃든 GetExp가 필요한거니 5를 반환한다. (레벨이 만약1이엿다면 2번쨰 줄 6을 반환)

코드를 보면 Exp+=를 하는데 Get_Exp해서 가져온 5를 Exp에 누적시킨다.

2. 다음 레벨업 까지의 퍼센트 반환 메서드 (Exp_Percentage)

 

✅ 역할

  • 다음 렙업 까지 몇 퍼센트 남았는지 퍼센트 값 반환 (40%이렇게는 아니고 0.4 이런 식으로 반환함 * 100만 받는 곳에서 따로 해주면 됨)
  • 큰 구조에서 보면 아래 버튼을 눌렀을 때 상호작용하는 뷰 처리 (LevelUpButton.cs의 InitExp메서드) 하는 부분에서 Base_Mng.Player.Exp_Percentage() 호출 하고 반환 값으로 fillAmount에 적용해서 시각적으로 경험치 퍼센트를 보여준다.

 

어쩃든 이 메서드는 퍼센트만 잘 구하면 된다.

퍼센트 구하는 공식은 Percentage = 차지하는 값  / 전체 값  * 100
하면 되는데 리턴 된 곳에서 알아서 붙여서 쓰면 되니 따로 곱하진 않는다

 

근데  막 나누고 곱하고 하는 공식들이 이해가 잘 안 가서따로 블로그에 정리한 글이 있으니 그 글을 참고해 보는것도 좋다.

방치형 유니티 프로젝트 - 퍼센트 구하기 

 

나누기 - 다음 Exp가 몇 오르는지 퍼센트 구하기

갑자기 나누기 개념이 헷갈려서 메모 하기로 했다.위와 같은 레벨디자인이 있다고 가정하자. 만약 현재 레벨이 1이라면 버튼을 세 번 눌러야 레벨2가 될 것이다.왜냐하면 GetExp가 얻는 경험치이

cherry22.tistory.com

 

그리고 리턴하기 전에 exp랑 myExp 부분을 -= 하는게 있는데 이유는 아래와 같다.                     

 

초기레벨 0, 목표경험치 15, 획득 경험치 5 이상태에서 버튼 세 번 누르면
레벨 UP 해서 레벨1, 목표경험치 49 , 획득 경험치 6 이 될 것이다.

 

나는 방금 레벨업 했고 이전 목표 경험치를 초과하지 않았기 때문에 퍼센트가 0 으로 보여야 하는게 정상이다 이론상으로 근데 현재 경험치가 15이기 때문에 15 나누기 49 하면 0.306... 이렇게 나온다 30% 라는 것이다. 그래서 어쩃든 레벨업을 했을 때 퍼센트가 정상적으로 보이려면 아래와 같이 이전 목표 경험치를 빼야한다.

1. 현재 목표 EXP에서 이전 목표 EXP를 뺀다.

49 - 15 = 34

 

2. 현재 누적 된 경험치에서 이전 목표 EXP를 뺸다

15 - 15 = 0 

 

3.  현재 누적 경험치  / 전체 값

 

4. 현재 누적 경험치 (0) / 전체( 34 ) 

 

결과 : 즉 결과값 0인것이다

3. 획득 경험치 예상값 - Next_Exp()

 

이 메서드도 마찬가지로 뷰에서 상호작용이 있을 때 호출당하는 메서드로 몇 퍼센트의 경험치가 추가되는지 알 수 있는 예상 경험치 값이다.

예상 경험치

계산 공식은 비슷하다.

내가 레벨업 버튼을 눌렀을 때 받는 경험치 나누기 목표 경험치를 하면 된다.

exp -= 하는 것은 이전과 동일하게 정확한 값을 구하기 위해서이다.

 

4. 예상 공격력 - Next_Atk

 

유저는 다음 레벨업 때 추가 될 공격력을 미리 보는것도 좋아한다.

그래야 기대감을 갖고 게임을 하기 때문이다.

 

이 메서드는 레벨업 시 반영 될 공격력을 계산하는 함수이다.

수식을 정리해 보면 아래와 같다.

float a = Get_EXP * (Level + 1) / 5;

 

 

예를 들어:

  • Get_EXP = 6
  • Level = 1 (실제레벨)

그럼 계산은 이렇게 된다.

6 * (1 + 1) / 5
= 6 * 2 / 5
= 12 / 5
= 2.4

❓ 그럼 왜 이런 구조일까?

✔ 1. Get_EXP * (Level + 1)

레벨이 높을수록 더 많이 오르게 하자!
Get_EXP는 기본 값이고, (Level + 1)은 배율이야.

✔ 2. 나누기 5

전체 값이 너무 커지지 않게 조절하는 밸런싱 계수야.
즉, "공격력 성장 폭을 조절하는 역할".


🔄 곱하기랑 나누기 순서가 헷갈릴 때 팁

🎯 실전에서 기억할 포인트:

"기본 값 * 성장 배율 / 조절 값"

예를 들면:

기본 값: Get_EXP
성장 배율: (Level + 1)
조절 값: 5

👀 수식 순서가 바뀌면 어떻게 될까?

예를 들어:

a = Get_EXP * ((Level + 1) / 5);

이렇게 괄호로 바꾸면 결과가 달라져!!

예시 비교:

  • 6 * (2 / 5) = 6 * 0.4 = 2.4 ✅
  • 하지만 (6 * 2) / 5 도 12 / 5 = 2.4 → 이건 괜찮지

근데 반대로:

  • (2 / 5) → 먼저 나누면 0.4로 작아짐
  • 정수끼리 나누면 0이 될 수도 있어!

그래서 곱하기를 먼저 하는 게 안정적이야.


💡 그래서 대부분 이런 식으로 짬

a = baseValue * scale / balance;
또는
a = 경험치 * (레벨 보정치) / 성장 억제


🎯 정리

  • *는 성장량 늘리기
  • /는 조절 (너무 커지는 거 방지)
  • 순서는 곱하고 나누는 게 일반적 (먼저 곱하면 정밀도 좋아짐)

 

 

 

hp도 이전 메서드와 동일하다 !

반응형