서론
유니티 개발자로 일하고 다시 이직 준비를 하면서 항상 게임 완성을 위해서 개발을 임해왔다. 그렇게 많은 성과들이 있었지만 한편으로는 후회가 되는 점이 많이 생겼다. 먼저 완성이라는 거대한 목표를 향해 가는 여정이라고 생각하다 보니 중간중간 결과물을 남기는 것에 소홀했다. 특히 중간에 프로젝트가 멈추게 되면, 정리해 둔 것이 없어 내 노력에 비해 눈에 보이는 성과가 없는 것처럼 보였고, 이것이 생각보다 나에게 더 큰 허무를 주었다.
꼭 정리된 결과물만 문제가 되는 것은 아니었다. 한 게임의 완성을 목표로 개발하게 되면 초기에 아무리 FDD(기능 주도 개발)로 개발을 하겠다고 마음먹었다고 해도 기능의 구분이 모호해지고, 결국 독립적으로 기능을 떼어 만들 수 없었다. 이 때문에 장기적으로는 디버깅이나 로직 수정에 더 많은 시간을 할애하게 되었고, 개발의 흥미를 크게 낮추었다.
마지막으로 이직을 위해 준비하는 과정에서 게임의 완성 이상으로 어떤 기능을 공들여 개발했는가가 더 중요하다는 점을 깨달았다. 취미로 시작했던 게임 개발 초기에는 흥미를 위해서 내가 만들고 싶은 '게임'의 완성도가 무엇보다 중요했지만 회사 입장에서는 내 '게임'보다는 나의 개발 방식과 실력을 보고 싶어 한다는 것을 안 것이다.
그래서 지금부터는 아예 '기능'이라는 것에 초점을 맞춰서 git 레포지토리로 등록하는 것에 초점을 맞추려고 한다. 그 이유는 다음과 같다.
1. 완성에 상대적으로 적은 시간을 소모하므로 중도 하차에 대한 우려가 덜하다.
2. 상대적으로 덜 복잡한 로직으로 객체를 독립적으로 구성하기 쉽다.
3. '기능' 개발이므로 당연히 FDD를 따른다.
4. 하나의 기능에 집중하므로 내 설계와 개발 과정을 글로 풀어쓰기 쉽다.
5. 플로우가 상대적으로 단조롭기 때문에 디버깅, 로직 수정에 편하다.
개발과 더불어 앞으로 티스토리에 게시글로 일지를 남기면서 생각도 정리할 겸 개발에 대한 과정과 트러블슈팅, 설계를 러프하게나마 정리하려고 한다. 이를 통해 미래에 게시글을 통해 내일의 내가 이전의 노력을 보고 이전보다 허무함을 느끼지 않았음 좋겠다.
기능 소개
터치, 클릭, 핀치 등 여러가지 입력 값에 따라 원하는 카메라 액션을 연결해 주는 기능을 개발할 생각이다. 이전에 개발했던 2D 게임에서 일부 구현했던 기능으로 기존과 동일하게 2D 카메라를 기준으로 하되, 커스텀 기능을 조금 더 집중해서 개발하려고 한다.
단계 정의
씬 혹은 게임 전체의 카메라 액션을 유저가 정의하고 그에 맞게 카메라 액션이 실행되어야 한다.
정의 단계
1. 유저가 씬 또는 게임 전체에 대한 카메라 액션 프로필을 등록한다.
2. 프로필에 액션 유닛을 추가한다.
3. 유닛에서 입력, 동작, 추가 동작을 세팅한다.
4. 유닛의 이름과 처리 순서를 작성한다.
5. 새로운 유닛을 추가하거나 마친다.
세팅 단계
1. 게임을 실행합니다.
2. 게임 전체 공통적으로 작동할 카메라 액션 프로필을 로드한다.
3. 알맞게 카메라 액션으로 생성, 저장한다.
4. 씬에 진입한다.
5. 씬 종속적인 카메라 액션 프로필을 로드한다.
6. 프로필에 맞게 카메라 액션으로 생성, 저장한다.
실행 단계
1. 유니티 내장된 InputSystem으로 입력을 받는다.
2. 중앙 관리를 담당하는 핸들러에서 관련된 함수를 호출한다.
3. 호출된 입력에 대한 로직 처리 여부를 확인하고, 처리 중이 아닌 경우에만 액션을 실행한다.
4. 입력 타입에 맞게 알맞은 액션 링크드리스트를 가져와 순서대로 실행한다.
제거 단계
1. 제거할 액션들을 순회한다.
2. 액션이 실행 중인 경우 취소한다.
3. 액션을 핸들러의 링크드리스트에서 제거한다.
4. 링크드리스트의 연결을 갱신한다.
프로그램 순서도

다음과 같은 경우로 액션이 프로필을 통해 추가되거나 제거된다.
액션이 추가되는 경우
- 게임 시작 직후 공통 액션에 관련한 프로필이 있는 경우
- 씬 변경 후 해당 씬에 프로필이 등록되어 있는 경우
액션이 제거되는 경우
- 게임 종료 직전 모든 등록된 액션 제거
- 씬 변경 직전 이전 씬에 종속된 액션 제거
액션은 추가되고 제거될 때에 프로필에 명시한 priority에 따라 액션들 간의 순서를 조절한다.
액션 추가 시에 입력 타입을 키로 저장한 액션 객체의 링크드리스트에 추가하고 순서를 다시 갱신한다.
순서 정렬 시의 기준은 아래와 같다.
- priority가 낮은 순
- 추가된 시점

모든 액션은 해당하는 입력의 처리가 완료된 상태에서만 실행된다.
각 액션은 다음의 단계를 거쳐서 실행된다.
- 입력 유효 검사: 프로필로 설정한 입력 조건들을 만족하는지 체크한다.
- 동작 범위 재산정: 프로필로 설정한 동작 범위, 최소 동작 범위 등을 통해 최종적으로 동작할 범위(값)를 계산한다.
- 동작 실행
- 추가 동작 범위 재산정(선택): 프로필로 설정한 추가 동작의 범위, 최소 동작 범위 등을 통해 최종 범위(값)를 계산한다.
- 추가 동작 실행(선택)
액션 제거 시에 액션이 진행 중이라면 CancellationToken을 통해 진행 상황을 취소시키고 동작을 제거해야 한다.
액션 중간에 동작이 실패한 경우 에러 로그와 함께 다음 동작으로 넘어가야 한다. (try-catch 사용)
플로우 차트가 생각보다 잘 나와서 만족스럽다. 앞으로의 개발에 기초가 되는 것이라 공을 들였는데 그만큼 더 보람찬 것 같다.
다음 게시글에서는 해당 내용을 바탕으로 더 작은 범위로 기능을 쪼개고 각 기능 안에서 객체를 정의하고 구현하는 것을 하도록 하겠다.
'C# > Unity' 카테고리의 다른 글
| [2D 카메라 액션 패키지 개발] #03 - 계층 구조 기반으로 원사이클 코드 완성 (0) | 2025.11.07 |
|---|---|
| [2D 카메라 액션 패키지 개발] #02 - 모듈화 기준, 설정 계층 정의 (0) | 2025.11.04 |