
새로운 Singleton 스크립트를 만들어서 제네릭 싱글톤 패턴을 구현한다.
외부에서 임의로 변경하거나 초기화하지 못하게 프로퍼티를 이용해 instance를 반환한다.
제네릭 싱글톤은 상속을 통해 확장되도록 설계되었다.
Awake 메서드는 싱글톤 초기화와 관련된 중요한 작업을 수행하므로,
외부로부터 보호하는 대신 상속받은 클래스에서는 사용할 수 있도록 protected로 설정한다.
또한 상속받은 클래스에서 초기화 과정을 확장하거나 수정할 수 있도록 virtual로 설정한다.
this as T를 사용하는 이유는 현재 객체를 T로 형변환하여 instance에 저장하려는 것이다.


이제 제네릭 싱글톤을 만들었으니 스크립트로 가서 교체한다.
기존 인스턴스를 지우고 Singleton 스크립트를 상속받으면 된다.
다른 스크립트에 사용한 ShaftManager.Instance와 GoldManager.Instance 모두 정상 작동한다.

엘리베이터 광부를 만들 차례다.
Skinning Editor에서 Create Bone으로 뼈를 만든다.

Visibility 버튼을 눌러 생성한 뼈를 볼 수 있다.
각 뼈에 맞는 이름을 붙이고 깊이를 수정한다.
기본적으로 Body 안에 모든 뼈를 넣고 연결되도록 했다.

씬에서 몸통을 기준으로 뼈를 이어 붙인다.
뼈의 둥근 부분으로 이동하고 뾰족한 부분으로 회전한다.

Animation을 만들어서 오른팔과 오른발의 회전값을 조정했다.
레코드 기능을 킨 상태로 해당 뼈의 인스펙터에서 값을 조정하면 편하다.

엘리베이터 스프라이트를 씬에 배치하고 ElevatorMiner의 자식으로 넣는다.


ShaftManager에서 private로 선언된 shaft 목록을 가져오기 위해 List로 Shafts 변수를 선언한다.
ElevatorMiner 스크립트를 만들고 BaseMiner를 상속한다.
현재 생성된 샤프트에 인덱스로 접근하기 위해 int로 변수를 선언한다.
MoveToNextLocation 함수를 만들고 함수가 호출될 때 인덱스값이 0이 되도록 하고,
Shaft 클래스 변수를 만들어 현재 생성된 샤프트를 저장하고,
가져온 위치값을 저장하여 MoveMiner 함수로 전달한다.

Update 메서드에 Input.GetKeyDown 메서드를 사용해 동작하는지 확인한다.
ElevatorMiner 오브젝트에 스크립트를 넣고 실행해 보며 테스트한다.

Elevator는 상하로만 움직여야 한다.
fixedPos 변수를 선언하여 x값은 그대로 두고 y값만 입금 상자 위치로 바꾼다.

Elevator 스크립트를 만들고 private 변수를 만든다.
외부에 값을 주고받아오기 위해 public으로 변수를 만들어 캡슐화한다.

Create Empty로 Elevator를 만들고 자식 오브젝트로 Deposit과 DepositLocation을 넣는다.
Deposit에는 스크립트를 넣어 주고 Location은 씬에서 위치만 조정해 준다.
Elevator 스크립트의 참조로 자식 오브젝트를 드래그하여 넣어준다.

ElevatorMiner 스크립트에 Deposit 클래스 변수를 선언한다.
싱글톤 인스턴스를 통해 가져온 샤프트로 현재 입금 상자를 저장한다.

Deposit 스크립트에 CanCollectGold 함수를 추가한다.
return으로 현재 골드가 0보다 큰지 여부를 반환한다.


입금 위치를 가져오기 위해 elevator 변수를 선언한다.
CollectGold 함수를 오버라이드 하여 재정의 한다.
엘리베이터 광부가 아래로 내려가다가 수집할 금과 입금 상자가 없다면,
샤프트 인덱스를 초기화하고 입금 위치로 다시 올라가는 것이다.

Deposit 스크립트에서 CollectGold 함수와 EvaluateAmountToCollect 함수를 추가한다.
CollectGold 함수에서 광부의 용량을 고려하여 실제 수집 가능한 금액을 계산하고,
EvaluateAmountToCollect 함수에서 수집 가능 금액과 현재 금 저장량을 비교하여 반환하는 것이다.

ElevatorMiner 스크립트에 함수를 추가한다.
먼저 CollectGold에서 수집 가능한 금의 양을 계산하고 코루틴을 실행한다.
초반에는 초당 50 골드를 수집하기에 200 골드를 수집하는 데에 4초가 걸린다.
코루틴에 전달한 골드를 엘리베이터 광부의 CurrentGold에 저장하고,
잠시 대기한 뒤에 입금 위치로 이동하는 순서다.
'유니티' 카테고리의 다른 글
| [유니티] #9 광부 타이쿤 게임 만들기 (창고 광부, 로딩바) (0) | 2025.01.20 |
|---|---|
| [유니티] #8 광부 타이쿤 게임 만들기 (버그 수정, 창고) (0) | 2025.01.20 |
| [유니티] #6 광부 타이쿤 게임 만들기 (싱글톤, 골드매니저) (0) | 2025.01.17 |
| [유니티] #5 광부 타이쿤 게임 만들기 (업그레이드, 델리게이트) (0) | 2025.01.16 |
| [유니티] #3 광부 타이쿤 게임 만들기 (애니메이터, 프로퍼티) (0) | 2025.01.13 |