본문 바로가기
유니티

[유니티] #12 광부 타이쿤 게임 만들기 (엘리베이터 업그레이드)

by 디버그러 2025. 1. 26.

 

ElevatorUI 스크립트에서 Action을 선언한다.

샤프트 때와 마찬가지로 UI 스크립트에 만들고, 로직은 업그레이드 스크립트에서 처리한다.

RequestUpgrade 함수를 선언하고 매개 변수로 ElevatorUpgrade 객체를 전달해 메서드를 실행할 것이다.

 

 

 

UpgradeManager 스크립트에서 Action에 이벤트를 구독한다.

OnUpgradeRequest는 static으로 선언되어 있기 때문에 클래스의 인스턴스를 생성하지 않아도 해당 멤버에 접근할 수 있다.

대신 정적 멤버는 전역적 성격을 가지므로, 필요할 때만 사용하는 것이 좋다.

 

 

 

이제 샤프트 패널을 눌렀을 때처럼 엘리베이터 패널이라고 뜨게 해야 한다.

UpdateElevatorPanel 함수를 만들고 패널에 Elevator와 레벨이 뜨도록 한다.

엘리베이터 업그레이드 버튼을 누르면 Action에 ElevatorUpgrade 스크립트가 전달되고 그와 구독된 함수들이 실행된다.

 

 

 

업그레이드를 직관적으로 볼 수 있도록 Sprite 변수를 추가한다.

GameObject 배열에 stats를 선언하여 업그레이드 종류가 3개인 엘리베이터는 4번째 stats를 안보이게 할 것이다.

 

 

 

인스펙터에서 UpgradeManager 변수에 이미지를 드래그한다.

Manager로 따로 분리해서 Header 처리를 안했으면 더 헷갈릴만한 양이다.

 

 

 

Stat 안의 이미지를 바꾸기 위해 Image 변수를 선언한다.

엘리베이터는 stats[2]까지 있고 샤프트는 stats[3]까지 있기 때문에 활성화, 비활성화를 업데이트 할 때마다 해줘야 한다.

Image 변수로 참조를 가져왔기 때문에 업데이트 할 때마다 해당하는 아이콘으로 변하도록 한다.

 

 

 

아이콘 옆에 타이틀 텍스트를 변경하기 위한 Text 변수를 선언한다.

엘리베이터는 3개, 샤프트는 4개이다.

엘리베이터의 4번째 칸은 비활성화 했기 때문에 문제 없다.

 

 

 

패널에 이미지를 띄우기 위한 Image 타입 변수와 아이콘을 넣을 Sprite 변수를 선언한다.

 

 

 

PanelIcon이 업데이트 될 때 객체에 따라 다른 이미지가 나오게 된다.

 

 

 

Vertical Layout Group 컴포넌트에 Spacing을 조정한다.

Child Force Expand에서 체크를 해제하지 않으면 자식들까지 포함되어서 공백이 너무 넓어진다.

 

 

 

패널의 stat 안의 텍스트 변수 이름을 변경했다.

변수 이름을 바꾸고나서 인스펙터에서 다시 참조해주는 것을 잊으면 안된다.

 

 

 

엘리베이터 광부에 대한 참조는 Elevator 스크립트에 있다.

BaseUpgrade → Elevator 순서대로 올라가서 광부에 대한 참조를 받아온다.

 

 

 

UpdateElevatorPanel 함수에 내용을 추가한다.

참조한 엘리베이터 광부에서 능력치를 가져와 currentStat의 텍스트를 변경한다.

또한 능력치를 지역 변수로 저장해 계산하고난 후 statUpgraded 텍스트를 변경하도록 한다.

 

이 상태에서 플레이하면 엘리베이터를 업그레이드 했을 때 문제가 있다.

Upgrade 함수에서 샤프트 광부에 대한 내용만을 업데이트 하도록 되어 있기 때문에

업그레이드 버튼을 누르면 샤프트 광부 패널이 나오게 된다.

 

 

 

BaseUpgrade 스크립트를 참조해서 업그레이드 객체가 무엇인지 알아야 한다.

 

 

 

쉬운 방법은 샤프트나 엘리베이터에서 업그레이드를 하기 위한 버튼을 누를 때,

현재 업그레이드 패널이 샤프트인지 엘리베이터인지 저장하는 것이다.

 

 

 

UpgradeX1 ~ Max 까지의 버튼들을 모두 _currentUpgrade로 변경한다.

이제 변수에 저장된 참조에 따른 능력치와 비용이 패널에 표시된다.

 

 

 

이제 Upgrade 버튼을 눌렀을 때 현재 _currentUpgrade 상태에 따른 패널이 업데이트 된다.

여기선 == 가 아니라 is 를 쓰는 이유는 _currentUpgrade는 객체(인스턴스)이고, ShaftUpgrade는 타입이기 때문이다.

== 는 객체 간 참조가 동일한지 비교하는 연산자이기 때문에 is 를 써서 런타임 타입이 맞는지 확인하는 것이다.

 

if (_currentUpgrade is ShaftUpgrade shaftUpgrade) 이렇게 타입 변환된 객체를 사용하여 UpdateUpgradePanel(shaftUpgrade) 이렇게도 사용할 수 있다.

 

 

 

_currentUpgrade 변수를 전역 변수로 선언했기 때문에 Debug 모드를 켜서 확인할 수 있다.

업그레이드 패널을 열 때마다 참조하는 객체가 변하는 것을 볼 수 있다.

 

 

 

강의 출처: #39 Upgrade Elevator (Unity Tutorial | Tycoon idle game)