본문 바로가기
유니티

[유니티] #2 광부 타이쿤 게임 만들기 (코루틴, DOTween)

by 디버그러 2025. 1. 12.

 

Game 탭에서 해상도를 수정한다.

1080x1920 크기로 설정했다.

 

하이라이키 창에서 UI → Image를 눌러 Source Image에 배경을 넣는다.

 

 

 

인스펙터에서 X, Y 축 값을 0으로 수정하고 크기를 1080x1920으로 수정한다.

게임 탭 배경이 이미지 크기(1080x1920)와 딱 맞게 된다.

 

 

 

Canvas의 Render Mode를 Screen Space - Camera로 변경하고 메인 카메라를 넣어준다.

캔버스 이미지가 플레이어를 가리지 않고 씬과 게임창에 똑같이 뜨는 것을 볼 수 있다.

 

 

 

가져올 이미지를 Multiple로 설정하고 Sprite Editor에 들어간다.

Automatic Slice를 하면 자동으로 이미지가 잘라진다.

Ctrl 버튼을 누르면 모든 스프라이트의 히트박스를 볼 수 있다.

 

 

 

새로운 이미지를 씬에 배치하면 종종 가려질 때가 있다.

Sorting Layers에서 Level을 추가했다.

순서를 바꿔주면 Player가 항상 모든 레이어 위에 렌더링 된다.

 

 

 

이제 코드를 작성하기에 앞서 플러그인 설치가 필요하다.

DOTween 무료 버전을 사용하였으며 단순화된 코드를 통해 무엇이든 애니메이션화 할 수 있다.

 

 

 

DOTween을 임포트하고 Tools → Demigiant → DOTween Utillity Panel을 통해 Setup 한다.

이제 코드에서 DOTween을 쓸 수 있다.

 

 

 

BaseMiner 스크립트를 만들고 변수를 선언한다.

moveMiner 함수를 만들고 DOMove 함수를 사용한다.

이 함수를 사용하면 newPosition 까지 이동하게 된다.

 

 

 

ShaftMiner 스크립트를 만들고 BaseMiner를 상속받게 한다.

shaftMiningLocation은 SerializeField로 하여 인스펙터에서 위치를 넣을 것이다.

 

Update 메서드에서 M키를 눌렀을 경우 moveMiner 함수가 동작하도록 만든다.

 

 

 

BaseMiner 스크립트에서 prop 이라고 치고 탭을 누르면 자동으로 프로퍼티가 만들어진다.

프로퍼티는 데이터를 읽고 쓰는 방법을 캡슐화한 것으로 코드의 가독성, 안전성을 높인다.

 

 

GetCapacity() { return initialCollectCapacity; } 이런 식으로 만들 수도 있지만 프로퍼티를 활용한 코드가 더 직관적이다.

추가적인 데이터 검증이나 로직을 추가 할 수 있고, { get; private set; } 이렇게 읽기 전용, 쓰기 전용으로 만들 수 있다.

 

 

 

변수의 값에 액세스 할 수 있는 프로퍼티를 만들었다.

Awake 메서드에 프로퍼티와 변수를 연결한다.

 

 

 

BaseMiner 스크립트에서 virtual 함수를 선언하고 이를 상속한 ShaftMiner 스크립트에서 override 한다.

collectTime 변수는 용량이 꽉 찰 때까지의 수집 시간을 의미하며 수집 용량 / 초당 수집량이다.

 

 

 

BaseMiner 스크립트에 IEnumerator(반복자)를 이용한 IECollect 함수를 만들었다.

yield return null; 은 다음 프레임까지 대기한다는 뜻이다.

 

코루틴은 지연, 반복, 조건 기반 작업이 필요할 때 유용하다.

1. 지연 작업: yield return new WaitForSeconds(1f);
2. 조건 대기: yield return new WaitUntil(()->isReady);
3. 프레임 기반 반복: while (true) { yield return null; }

 

IEnumerator로 정의된 함수(코루틴)은 직접 호출해서 실행되지 않고 StartCoroutine을 사용하여 실행해야 한다.

특히 유니티는 매 프레임 단위로 화면을 갱신하기에 코루틴은 프레임 기반 논리와 잘 맞는다.

 

 

 

Invoke 함수와 비슷한 점이 있어서 차이점을 찾아봤다.

Invoke는 단순한 지연 작업에 사용하기 좋고, 코루틴은 복잡한 반복/조건 작업에 사용하기 좋다.

 

 

 

ShaftMiner 스크립트에서 IEnumerator를 override 한다.

수집 시간만큼 대기하고 움직이도록 만들었다.

 

 

 

BaseMiner 스크립트에 shaftDepositLocation 변수를 추가한다.

하이라이키 창에서 Create Empty로 MiningLocation과 DepositLocation을 만들고 이를 인스펙터 창에 넣어준다.

 

 

 

프로퍼티로 CurrentGold를 만들고 Awake 메서드에서 0으로 초기화했다.

 

 

 

IECollect 메서드에 매개 변수를 추가했다.

virtual 함수는 부모와 자식의 매개 변수가 같아야 하기에 두 스크립트에 다 추가해준다.

StartCoroutine 함수에도 추가된 매개 변수에 CollectCapacity 프로퍼티를 넣었다.

 

 

 

BaseMiner 스크립트에서 IsTimeToCollect 변수를 프로퍼티로 만들고 Awake 메서드에서 초기화한다.

 

 

 

tween 변수를 추가하여 람다 표현식을 사용했다.

원래라면 tween.onComplete = 함수 이름; 으로 만들어야 하지만

() => { } 람다 표현식을 통해 간단히 무명 함수를 정의했다.

 

 

▲ Debug 모드 켜기 전후

 

게임을 플레이하여 테스트 해볼 때 Debug 모드를 켜면 변수 값을 확인하기 편하다.

 

 

 

BaseMiner 스크립트에 Virtual로 DepositGold 함수를 만든다.

ShaftMiner 스크립트에서 override로 재정의 한다.

 

 

 

BaseMiner 스크립트에서 IsTimeToCollect가 true가 아닐 경우 DepositGold 함수가 실행된다.

 

 

 

BaseMiner 스크립트에 ChangeGoal 함수를 선언한다.

이 함수는 IsTimeToCollect 변수의 상태를 전환한다.

 

ShaftMiner 스크립트의 코루틴과 DepositGold 함수에 ChangeGoal 함수를 추가한다.

 

IsTimeToCollect 변수가 true면 코루틴이 실행(자원 저장 장소로 이동)되고,

false면 DepositGold(자원 채굴 장소로 이동)가 실행된다.

 

 

 

강의 출처: #7 Collect Gold (Unity Tutorial | Tycoon idle game)