유니티

[유니티] #10 광부 타이쿤 게임 만들기 (업그레이드 패널)

디버그러 2025. 1. 23. 00:35

 

이제 업그레이드 패널을 만들어볼 차례다.

새로운 Canvas를 만들고 안에 Image로 UpgradePanel을 만들어 크기와 색깔을 변경했다.

그 안에 Top으로 앵커 위치를 맞춰주고, Button을 Set Native Size로 원본 이미지와 같은 크기로 만들었다.

 

 

 

Button 안에 Image를 만들어 X 이미지를 넣었다.

버튼 크기를 조정해주고 Top의 색깔도 바꿔줬다.

 

 

 

Top 안에 텍스트를 넣고 예시로 글을 작성했다.

사이즈는 45, 가운데 정렬, 래핑 없음으로 설정한다.

 

 

 

UpgradePanel 안에 Image로 MinerIcon과 StatsContainer를 넣는다.

알파값을 100으로 해서 약간 투명해지게 했다.

추가로 Vertical Layout Group 컴포넌트를 넣는다.

 

 

 

StatsContainer 안에 Image로 Stat를 만들어 알파값 100의 약간 투명한 색상을 만든다.

안에 Image를 넣을 박스와 텍스트를 넣을 Title을 만든다.

참고로 stat는 통계라는 뜻이다.

 

 

 

Image로 Info를 만들고 안에 텍스트 박스 2개를 넣는다.

각각 CurrentLevel과 UpgradeLevel을 뜻한다.

 

 

 

StatsContainer 안에 Vertical Layout Group이 있기 때문에

Ctrl + D로 Stat를 복사하면 자동 정렬 된다.

padding을 Top으로 10정도 주는 게 좋다.

 

 

 

Image로 Bottom을 추가하고 약간 색깔을 준다.

안에 Button을 만들고 텍스트에 Upgrade라고 써주면 버튼 같이 보인다.

 

 

 

Bottom 안에 Upgrade 횟수 버튼을 만든다.

안에 Text로 1, 10, 50, Max라고 적었다.

 

 

 

ShaftUI 스크립트에 Action을 새로 만든다.

이번 Action은 업그레이드 창 버튼을 누를 때의 이벤트를 연결할 것이다.

 

 

 

아래 UpgradeRequest 함수를 만든다.

매개 변수로 shaft 스크립트와, shaftUpgrade 스크립트를 전달할 것이다.

 

 

 

이제 샤프트 업그레이드 버튼을 클릭했을 때 바로 업그레이드가 되는 게 아니라

업그레이드 창이 뜨도록 변경할 것이다.

 

 

 

새로운 UpgradeManager 스크립트를 만든다.

샤프트가 여러 개이기 때문에 어떤 샤프트인지 확인하기 위해 Shaft 스크립트 변수도 선언한다.

 

OnEnable, OnDisable 함수를 통해 이벤트를 구독, 구독 해제한다.

(OnDestroy 이벤트에도 구독 해제를 해놓으면 UpgradeManager 객체가 파괴됐을 때 이벤트 해제를 할 수 있다.)

 

 

 

Shaft 스크립트에서 int형으로 ShaftID 변수를 선언한다.

여기에 샤프트에 대한 고유 ID를 저장할 것이다.

 

 

 

샤프트를 추가할 때마다 플러스되는 인덱스값을 새로운 샤프트의 ID에 넣어주면 된다.

처음에 생성된 샤프트는 Start 메서드에서 ID를 넣는다.

 

 

 

Upgrade 스크립트의 ShaftUpgradeRequest 함수에서 샤프트 리스트를 가져온다.

for문을 통해 샤프트 ID와 일치하는 샤프트를 찾는다.

찾은 샤프트와 관련하여 변수에 데이터를 저장하고 업그레이드 패널을 연다.

 

이 사람은 샤프트가 생성될 때마다 각 샤프트만의 UpgradeUI를 만드는게 아니라

UpgradeUI 하나이고 샤프트가 켜질 때마다 UI에 정보를 업데이트하도록 만드는 것 같다.

 

 

 

Title의 텍스트를 변경하기 위한 변수를 선언한다.

UpdateUpgradePanel 함수를 만들고 현재 선택된 샤프트의 번호와 레벨로 텍스트를 업데이트 하도록 한다.

 

 

 

UI 창을 닫는 Close 버튼에 UI창을 여는 함수를 연결한다.

체크 버튼 해제를 하면 반대로 창을 닫게 된다.

 

지금까지 Close 함수를 따로 만들었는데 이건 꽤 유용한 것 같다.

 

 

 

UpgradeManager 스크립트에서 텍스트 변수를 선언한다.

shaft 변수를 이용해 광부의 능력치를 가져오고 텍스트 값에 넣는다.

하나의 Shaft에 있는 광부는 모두 능력치가 동일하기에 0번째 광부를 가져와도 된다.

 

 

 

UpgradeManager 오브젝트의 인스펙터에서 참조할 대상을 드래그한다.

 

 

 

업그레이드 변수도 추가한다.

플레이 버튼을 누르고 창을 닫았다가 열어보면 값이 업데이트 되는 것을 볼 수 있다.

샤프트에 있는 버튼을 눌러야 Action 이벤트가 호출돼서 UI가 업데이트 된다.

 

 

 

BaseUpgrade 스크립트에서 프로퍼티를 추가한다.

업그레이드 배수를 UpgradeManager에서 사용하기 위한 것이다.

 

 

 

UpdateUpgradePanel에 내용을 추가한다.

업그레이드 했을 때 올라가는 값을 Mathf.Abs 함수를 이용해 절대값으로 바꾼다. (200-(200*2)) = -200

물론 앞뒤 순서를 바꿔도 되지만 혹시 모를 음수가 될 상황을 막아준다.

 

 

 

코드가 너무 많아져서 개선 가능한 부분을 수정했다.

특히 for문을 통해서 샤프트 ID를 비교하는 코드를 Find 함수로 바꿨다.

 

 

Find 함수는 List에서 특정 조건을 만족하는 첫 번째 요소를 찾는 데 사용된다.

조건은 람다식이나 별도의 함수로 정의가 가능하다.

 

 

 

OpenUpgradePanel(참) 호출 시 업그레이드 패널이 이미 열려 있는 경우 불필요한 업데이트를 막을 수 있다.

 

 

 

위아래 코드는 동일하지만 아래 코드가 훨씬 간결하다.

?는 null 조건 연산자이며 객체가 null이면 null을 반환하고,

객체가 null이 아니면 멤버를 호출하거나 접근한다.

 

 

 

null 대체값을 제공할 수 있다.

??는 null 병합 연산자이며 객체가 null 이면 기본값을 반환한다.

 

 

 

아래 코드를 ?와 삼항 연산자를 통해 위 코드로 간결하게 만들었다.

 

1. _selectedshaft가 null일 경우 ?.Count는 실행되지 않고 false가 반환된다.

2. _selectedshaft.Miners가 null인 경우 ?.Count는 실행되지 않고 false가 반환된다.

3. Count가 0인 경우 조건식은 false가 반환된다.

4. _selectedshaft.Miners.Count > 0 이 true인 경우에만 값을 가져온다.

 

 

스크립트가 완벽하게 동작하고 참조가 모두 올바르게 설정되어 있다면,

Null 검사는 불필요하지만 현실적으로 그럴 수는 없으므로 Null 검사가 꼭 필요하다.

대신 오류 발생 시 디버깅의 어려움이 생길 수 있으니 로그를 추가하거나 예외 처리를 활용해야 한다.

 

 

 

 

강의 출처: #33 Fill Upgrade Information (Unity Tutorial | Tycoon idle game)