개요
지난번에 구현해놨던 버튼에 실제 레벨 디자인을 적용하여 버튼을 눌렀을때 시각적으로 현재 경험치가 몇인지 얼마다 더 올려야하는지를 볼 수 있 도록 작업할 것이다. 우선 버튼 구현 했던 글은 아래 링크를 참조하면 된다.
유니티 방치형 프로젝트 - 모바일 버튼 터치 구현 관련 글
유니티 방치형 프로젝트 - 모바일 버튼 터치, 연속터치 판별 로직 작성 ( + 두트윈 사용하기)
커밋 : 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도 이전 메서드와 동일하다 !
'유니티 > 구현내용정리' 카테고리의 다른 글
| 유니티 방치형 프로젝트 - 캐릭터 정보 스크립터블 오브젝트 데이터 적용 (1) | 2025.03.24 |
|---|---|
| 유니티 - 클래스 다이어 그램 (UML 다이어그램) 정리 (2) | 2025.03.23 |
| 나누기 - 다음 Exp가 몇 오르는지 퍼센트 구하기 (0) | 2025.03.22 |
| 유니티 방치형 프로젝트 - 모바일 버튼 터치, 연속터치 판별 로직 작성 ( + 두트윈 사용하기) (0) | 2025.03.20 |
| 유니티 - 모바일에서 특정 해상도 UI 깨지는 문제 해결 (0) | 2025.03.19 |
