본문 바로가기
유니티

[유니티] #5 광부 타이쿤 게임 만들기 (업그레이드, 델리게이트)

by 디버그러 2025. 1. 16.

 

광부의 이동 속도, 수집 속도 및 정리 용량을 업그레이드 하기 위한 배수가 필요하다.

부모 스크립트로 BaseUpgrade 스크립트를 만든다.

SerializeField를 사용해 private로 변수를 선언했다.

 

 

 

Start 메서드에서 CurrentLevel을 1로 설정한다.

UpgradeCost는 private로 선언된 initialUpgradeCost를 외부에서 사용하고 업데이트 하기 위한 프로퍼티다.

그외 virtual로 Base가 될 함수를 선언한다.

 

 

 

Shaft 스크립트를 참조하기 위한 변수를 선언한다.

자식 스크립트에서도 사용하기 위해 protected로 선언했다.

 

 

 

새로운 ShaftUpgrade 스크립트를 만들고 BaseUpgrade 스크립트를 상속 받는다.

RunUpgrade 함수를 오버라이드 하여 일단 로그만 나오도록 한다.

업그레이드를 위해 이 스크립트는 Shaft 오브젝트에 넣어준다.

 

 

 

Button을 Shaft 안에 만들고 크기를 0.5로 지정한다.

Button 안에 복사한 TMP를 넣고 앵커를 Alt+Shift를 누르고 Stretch로 변경한다.

버튼과 텍스트 박스가 딱 맞게 한 후 폰트를 0.15로 줄이고 Level 1이라고 적었다.

 

 

 

Button을 클릭했을 때 이벤트를 설정해야 한다.

Shaft 스크립트를 넣어주고 Upgrade 함수를 선택하고 int값을 1로 넣어준다.

 

버튼을 누를 때마다 Upgrade 함수에서 RunUpgrade 함수가 호출되어 로그가 나온다.

 

 

 

업그레이드가 성공하면 CurrentLevel을 올리고 UpgradeCost 비용을 올린다.

Multiplier가 2로 설정되어 있기에 비용이 2배가 된다.

 

 

 

새로운 List 클래스 _miners 변수를 만든다.

Start 메서드에서 초기화하고 광부가 생성되어 newMiner가 생기면 List에 추가한다.

miners 프로퍼티를 만들어 외부에서 접근할 수 있도록 한다.

 

 

 

ShaftUpgrade 스크립트에서 베이스인 변수에 접근하기 위해 protected로 보호 수준을 바꿔준다.

foreach 문을 이용해 List 목록에 있는 miners의 수집 용량과 초당 수집량을 Multiplier와 곱한다.

 

 

 

BaseMiner 스크립트의 moveSpeed 변수는 private로 선언되어 있다.

이 값을 변경하기 위해서는 보호 수준을 바꿔야 하기에 보안을 위해 프로퍼티를 추가했다.

 

CurrentLevel이 10레벨이 될 때마다 광부의 이동속도가 증가한다.

moveSpeedMultiplier가 1.25f이므로 25%씩 빨라진다.

 

 

 

Action으로 OnUpgrade를 선언한다.

OnUpgrade는 연결된 메서드를 호출하면서 현재 객체(this)와 CurrentLevel 값을 전달한다.

 

OnUpgrade?.Invoke(); 에서 ? 는 null이 아닐 때 호출하는 것을 의미하며 코드를 간략하게 만들 수 있다.

 

 

 

Action은 C#에서 제공하는 내장 델리게이트 타입이며 간편하게 사용할 수 있도록 만들어졌다.

단순한 콜백 또는 이벤트를 만들 때에 유용하다.

다수의 함수 호출을 간단히 처리할 수 있고 필요에 따라 함수 추가, 삭제가 가능하다.

 

 

 

UI를 업데이트 하기 위해 currentLevelTMP 변수를 선언한다.

Action 메서드 연결시 대상이 shaft인지 확인하기 위해 shaftUpgrade 클래스 변수도 선언한다.

 

 

 

Action 이벤트 트리거가 발동되면 메서드를 연결할 함수가 필요하다.

UpgradeShaft 에서 Action 이벤트를 받아서 UI를 업데이트하는 역할을 한다.

 

OnEnable 메서드에서 Action 이벤트와 UpgradeShaft 함수를 연결해준다.

객체가 비활성화 되면 객체가 없는데도 이벤트가 발생하여 메모리 누수가 발생할 수 있으니

Disable 메서드에서 연결을 해제한다.

 

 

 

ToString 함수를 통해 문자열로 만들어도 되지만 문자열 보간을 이용하면

중괄호 {} 안에 변수가 문자열에 삽입되기 때문에 더 간편하다.

 

 

 

Level UI를 누르면 레벨이 올라가면서 광부가 한 번에 얻는 골드량이 늘어난다.

 

 

 

 

 

강의 출처: #14 Upgrade Shaft (Unity Tutorial | Tycoon idle game) - YouTube