게임 프로그래밍 이징 함수와 카메라 감속 경험담
카메라가 멈출 때 게임의 질감이 갈렸다
좌표는 맞는데 어색했던 첫 인상
게임 프로그래밍에서 카메라 이동은 처음엔 단순해 보입니다. 목표 좌표를 정하고 현재 좌표를 조금씩 따라가게 만들면 끝날 것 같지만, 실제로 플레이해 보면 멈추는 순간의 감속감이 전체 조작감의 인상을 꽤 크게 바꿉니다. 저는 최근 작은 액션 프로토타입을 만들며 이징 함수를 여러 방식으로 붙여 보았고, 생각보다 장단점이 또렷하다는 것을 몸으로 확인했습니다.
처음에는 선형 보간만 사용했습니다. 플레이어가 대시하면 카메라가 같은 속도로 따라오고, 목표 지점에 가까워지면 갑자기 속도가 줄어드는 느낌이 났습니다. 수치상으로는 틀리지 않았지만, 눈으로 볼 때는 카메라가 플레이어를 따라오는 것이 아니라 뒤늦게 끌려오는 듯했습니다. 이때부터 수학적으로 맞는 움직임과 게임에서 기분 좋은 움직임은 다르다는 생각이 들었습니다.
Will Perone 같은 개발자 포트폴리오 사이트를 찾는 독자라면 아마 이런 순간을 한 번쯤 겪었을 겁니다. 렌더링도 되고 입력도 받는데, 이상하게 손맛이 부족한 상태 말입니다. 저는 그 틈을 메우는 가장 작고 실용적인 도구가 이징 함수라고 느꼈습니다.
- 선형 이동: 구현은 쉽지만 감속과 가속의 표정이 없어 기계적으로 보입니다.
- ease out: 목표 지점에 가까워질수록 부드럽게 멈춰 카메라와 UI에 잘 맞았습니다.
- ease in out: 시작과 끝이 모두 부드러워 컷신, 메뉴 전환, 퍼즐 오브젝트에 안정적이었습니다.
- 탄성 계열: 시각적 재미는 크지만 전투 카메라에는 과하면 멀미나 혼란을 만들었습니다.
팁: 이징 함수는 ‘더 멋진 움직임’보다 ‘플레이어가 다음 행동을 예측하기 쉬운 움직임’을 먼저 기준으로 고르는 편이 실패가 적었습니다.
이징 함수를 직접 써 보며 좋았던 부분
작은 코드로 체감 품질이 커졌다
가장 만족스러웠던 점은 비용 대비 효과였습니다. 별도 플러그인이나 무거운 애니메이션 시스템을 붙이지 않아도, 몇 줄의 수식만으로 카메라와 UI 전환의 질감이 달라졌습니다. 특히 개인 프로젝트나 포트폴리오용 테크 데모에서는 작은 수학 라이브러리를 직접 만들고 적용해 보는 과정 자체가 좋은 설명거리가 됩니다.
저는 처음에 이징 함수를 별도 파일로 빼지 않고 카메라 코드 안에 넣었습니다. 빠르게 결과를 보는 데는 좋았지만, 메뉴 버튼, 체력바, 대미지 숫자에도 같은 움직임을 쓰고 싶어지자 바로 지저분해졌습니다. 결국 easing.h 같은 작은 유틸 파일로 분리했고, 그 순간부터 사용성이 좋아졌습니다. 개발자 입장에서는 코드가 한 단계 정리되고, 플레이어 입장에서는 화면 움직임이 한결 통일됩니다.
개념을 잡을 때는 게임 개발 행사의 맥락도 도움이 됩니다. 예를 들어 GDC 관련 용어 설명처럼 게임 개발자들이 기술과 제작 경험을 공유하는 장을 떠올리면, 이징 함수도 단순 공식이 아니라 ‘플레이 경험을 조율하는 언어’로 보이기 시작합니다.
- 카메라 추적에는 ease out을 먼저 적용했습니다. 이동 후반부의 떨림이 줄고, 플레이어가 멈춘 뒤 화면이 늦게 도착하는 느낌이 약해졌습니다.
- 메뉴 전환에는 ease in out을 사용했습니다. 갑자기 튀어나오는 느낌이 사라져 작은 게임이라도 완성도가 높아 보였습니다.
- 피격 연출에는 back 또는 elastic 계열을 짧게 넣었습니다. 다만 지속 시간이 길면 조작 화면을 방해해서 0.1초대의 짧은 사용이 더 좋았습니다.
- 오브젝트 등장에는 ease out cubic이 무난했습니다. 과시적이지 않으면서도 눈에 띄는 움직임을 만들 수 있었습니다.
수학 라이브러리로 분리했을 때의 장점
이징 함수를 함수 하나씩 흩뿌려 놓으면 금방 관리가 어려워집니다. 저는 입력값을 0에서 1 사이로 제한하고, 반환값도 가능한 한 예측 가능한 범위에 두는 방식으로 작은 math 모듈을 만들었습니다. 이렇게 해 두면 나중에 엔진을 바꾸거나 언어를 옮겨도 핵심 동작을 재사용하기 쉽습니다.
또한 테스트하기도 좋아집니다. 특정 이징 함수가 0을 넣었을 때 0에 가깝게 시작하고, 1을 넣었을 때 1에 도달하는지만 확인해도 기본적인 실수를 많이 줄일 수 있습니다. 게임 프로그래밍에서는 눈으로 보는 검증이 중요하지만, 이런 작은 수학 함수는 자동 테스트와 궁합이 좋았습니다.
- 재사용성: 카메라, UI, 이펙트, 튜토리얼 연출에서 같은 함수명을 공유할 수 있습니다.
- 디버깅 편의: 움직임이 어색할 때 수식 문제인지 호출 타이밍 문제인지 나누어 볼 수 있습니다.
- 포트폴리오 설명력: ‘부드럽게 만들었다’보다 ‘이징 함수를 분리해 움직임 정책을 관리했다’가 더 설득력 있게 들립니다.
불편했던 점은 공식보다 적용 위치였다
이징 함수 자체보다 시간값 관리가 더 까다로웠다
직접 써 보며 가장 자주 막힌 부분은 공식이 아니었습니다. 검색하면 ease out quadratic, cubic, sine 같은 수식은 금방 찾을 수 있습니다. 문제는 그 수식에 넣을 정규화된 시간값을 어떻게 안정적으로 만들 것인가였습니다. 프레임마다 delta time을 더해 0에서 1까지 진행시키는 구조는 단순하지만, 상태 전환이 많아지면 예상보다 쉽게 꼬입니다.
예를 들어 대시 중 카메라가 목표를 따라가다가 플레이어가 벽에 부딪히면, 기존 이징 진행률을 유지할지 다시 시작할지 결정해야 합니다. 유지하면 자연스러운 경우도 있지만, 방향이 급격히 바뀌는 액션 게임에서는 이전 움직임의 관성이 남아 불쾌하게 보일 때가 있었습니다. 반대로 매번 다시 시작하면 반응은 빠르지만 화면이 살짝 끊기는 느낌이 생깁니다.
기획 의도와도 연결됩니다. 기획자의 역할을 설명한 자료를 보면 게임에서 규칙과 경험을 설계하는 관점이 중요하다는 점을 떠올릴 수 있습니다. 개발자가 이징 함수를 고를 때도 단순히 보기 좋은 곡선을 고르는 것이 아니라, 플레이어가 어떤 정보를 읽어야 하는지 먼저 정해야 했습니다.
- 진행률 재시작: 입력 반응은 빠르지만, 자주 반복되면 미세한 튐이 생깁니다.
- 진행률 유지: 움직임은 부드럽지만, 급박한 액션에서는 카메라가 한 박자 늦게 느껴질 수 있습니다.
- 속도 기반 보간: 자연스러운 추적에 유리하지만, 목표 도달 시간을 정확히 맞추기 어렵습니다.
- 상태별 이징 분리: 구현량은 늘지만 대시, 점프, 피격, 컷신의 성격을 다르게 만들 수 있습니다.
함수 이름만 보고 고르면 실패했다
easeOutCubic이라는 이름만 보면 대부분의 상황에 잘 맞을 것 같지만, 실제 화면에서는 카메라 거리, 해상도, 캐릭터 속도에 따라 느낌이 달라집니다. 같은 함수라도 100픽셀 이동과 800픽셀 이동은 전혀 다르게 보입니다. 저는 이 차이를 모르고 한 함수를 여러 곳에 복붙했다가 UI는 괜찮은데 카메라는 둔하고, 카메라는 괜찮은데 버튼은 과하게 늘어지는 상태를 겪었습니다.
그래서 이후에는 함수만 고르지 않고 지속 시간과 이동 거리까지 묶어서 봤습니다. 작은 버튼은 0.12초에서 0.18초, 화면 패널은 0.2초에서 0.35초, 카메라 추적은 고정 시간보다 거리와 속도에 따라 반응하도록 잡는 편이 낫게 느껴졌습니다. 이 수치는 정답이라기보다 제 프로토타입에서 손맛이 무너지지 않았던 범위에 가깝습니다.
- 먼저 선형 이동으로 기준 동작을 만듭니다.
- 같은 지속 시간에 ease out을 적용해 체감 차이를 확인합니다.
- 이동 거리가 커질수록 어색해지는지 확인합니다.
- 조작 입력 직후의 반응성이 늦어지면 지속 시간을 줄입니다.
- 카메라가 예쁘지만 게임이 어려워졌다면 과감히 덜어냅니다.
카메라와 UI에 적용한 실제 세팅
카메라 추적에는 덜 화려한 함수가 오래 갔다
제 경우 카메라에는 화려한 이징보다 담백한 감속이 오래 살아남았습니다. 처음엔 elastic, back 계열도 넣어 봤지만 캐릭터가 자주 방향을 바꾸는 게임에서는 화면 중심이 계속 과장되어 흔들렸습니다. 플레이어는 캐릭터를 조작하고 있다고 느껴야 하는데, 카메라가 자기 연기를 시작하면 시선의 주도권을 빼앗아 갑니다.
결국 카메라에는 ease out cubic이나 지수 감쇠에 가까운 추적 방식을 주로 사용했습니다. 목표 지점에 빠르게 가까워지되 마지막에는 부드럽게 정착하는 식입니다. 여기에 카메라 데드존을 작게 넣으니 미세한 입력마다 화면이 반응하지 않아 피로감이 줄었습니다. 게임 프로그래밍에서 카메라 이징은 움직임의 예쁨보다 정보의 안정성을 우선해야 한다는 쪽으로 생각이 바뀌었습니다.
특히 플랫폼 게임에서는 점프 정점과 착지 순간이 중요합니다. 점프할 때 카메라가 너무 늦게 올라가면 위쪽 장애물을 늦게 보게 되고, 착지할 때 너무 부드럽게 내려오면 바닥 판정이 흐릿하게 느껴집니다. 그래서 수직 추적과 수평 추적의 이징을 다르게 잡는 방식이 의외로 효과적이었습니다.
| 적용 대상 | 써 본 함수 | 체감 장점 | 주의할 점 |
|---|---|---|---|
| 카메라 수평 추적 | ease out cubic | 방향 전환 후 안정적 | 지속 시간이 길면 둔함 |
| 카메라 수직 추적 | linear와 ease out 혼합 | 점프 정보가 또렷함 | 착지 때 튐 방지 필요 |
| 메뉴 패널 | ease in out sine | 부드럽고 과하지 않음 | 짧은 메뉴에는 느릴 수 있음 |
| 대미지 숫자 | ease out back | 타격감이 살아남 | 많이 뜨면 산만함 |
UI에는 일관성이 더 중요했다
UI에서는 카메라와 다른 문제가 보였습니다. 버튼, 패널, 알림창이 각각 다른 이징을 쓰면 전체 게임이 덜 정돈되어 보입니다. 저는 처음에 버튼은 통통 튀게, 팝업은 느리게, 토스트 알림은 미끄러지게 만들었는데, 합쳐 놓고 보니 한 화면 안에서 서로 다른 게임이 말하는 듯했습니다.
그래서 UI에는 기본 이징을 하나 정하고, 강조가 필요한 요소에만 변형을 주었습니다. 예를 들어 일반 패널은 ease in out sine, 보상 획득은 ease out back, 경고 알림은 짧은 linear fade를 사용했습니다. 사용자가 반복해서 보는 부분일수록 얌전하게, 드물게 보는 보상이나 성취 순간일수록 살짝 표현을 키우는 방식이 가장 안정적이었습니다.
- 기본 UI: 같은 함수와 비슷한 지속 시간을 유지해 화면 언어를 통일합니다.
- 보상 연출: 약간의 overshoot를 허용하면 획득감이 살아납니다.
- 경고 메시지: 너무 부드러우면 긴급성이 약해져 짧고 분명한 움직임이 낫습니다.
- 설정 화면: 장식보다 즉시성이 중요해 과한 애니메이션을 줄이는 편이 좋았습니다.
실사용 팁: 이징 세팅은 개발자가 혼자 볼 때보다 녹화해서 다시 볼 때 문제가 잘 보입니다. 플레이 중에는 ‘괜찮다’고 느껴도 영상으로 보면 화면이 늦거나 과한 지점이 드러납니다.
포트폴리오 프로젝트에서 보여 주기 좋은 방식
코드보다 before와 after가 설득력 있었다
이징 함수는 포트폴리오에 넣기 좋은 주제입니다. 너무 거대하지 않으면서도 개발자의 감각과 수학 이해를 동시에 보여 줄 수 있기 때문입니다. 다만 코드 조각만 올리면 보는 사람이 체감하기 어렵습니다. 저는 선형 이동, ease out 적용, 카메라 데드존 추가 순서로 짧은 영상을 붙였을 때 반응이 훨씬 좋았습니다.
Will Perone 사이트처럼 game programming, math libraries, tech projects가 함께 놓인 공간이라면 더 그렇습니다. 단순히 ‘이징 함수를 구현했습니다’라고 쓰기보다, 수학 함수가 플레이 경험을 어떻게 바꾸었는지를 보여 주는 편이 사이트 주제와 잘 맞습니다. 개발자의 포트폴리오는 결과물만이 아니라 판단 과정을 보여 줄 때 더 강해집니다.
예산과 시간 관리 관점에서도 작게 시작하기 좋습니다. 계획예산 제도에 관한 설명처럼 큰 프로젝트에서는 자원 배분의 논리가 중요한데, 개인 개발에서도 비슷합니다. 이징 함수 작업은 적은 구현 비용으로 체감 품질을 올릴 수 있어, 제한된 시간 안에서 우선순위를 두기 좋은 항목이었습니다.
- 문제 화면 기록: 선형 이동만 적용한 화면을 먼저 녹화합니다. 어색한 지점을 말로 설명하기 쉬워집니다.
- 함수별 비교: cubic, sine, back 정도만 비교해도 충분합니다. 너무 많은 곡선은 보는 사람을 피곤하게 만듭니다.
- 설계 의도 설명: 왜 이 함수를 골랐는지, 어떤 함수는 왜 버렸는지를 적습니다.
- 작은 테스트 첨부: 입력값 0, 0.5, 1에서 기대값이 어떻게 나오는지 보여 주면 math library로서의 신뢰가 올라갑니다.
- 실제 플레이 연결: 버튼 애니메이션이 아니라 카메라, 타격, 점프 같은 플레이 순간과 연결하면 설득력이 커집니다.
개발자 글쓰기에서 놓치기 쉬운 표현
후기 형식으로 적을 때는 성공담만 쓰면 오히려 밋밋합니다. 어떤 함수가 실패했는지, 왜 다시 바꿨는지, 플레이 테스트에서 어떤 말을 들었는지를 넣으면 훨씬 살아납니다. 저도 elastic 계열을 자랑하고 싶었지만, 실제 플레이에서는 멀미가 난다는 피드백을 받고 과감히 뺐습니다. 이 한 줄이 오히려 기술 선택의 근거가 되었습니다.
또 하나는 수식의 난이도를 조절하는 것입니다. 독자가 모두 수학 공식을 보러 오는 것은 아닙니다. 함수 그래프와 코드가 있으면 좋지만, 본문에서는 ‘처음에 빠르게 움직이고 끝에서 천천히 멈춘다’처럼 체감 언어로 풀어 쓰는 편이 읽기 쉽습니다. technical portfolio와 blog 사이의 균형을 잡는 데 이 방식이 유용했습니다.
- 좋았던 점: 구현 비용이 낮고 카메라, UI, 연출에 폭넓게 재사용됩니다.
- 아쉬운 점: 함수보다 상태 관리와 타이밍 튜닝에 시간이 더 듭니다.
- 보여 줄 자료: 짧은 영상, 곡선 그래프, 핵심 코드, 실패한 세팅의 이유가 좋습니다.
- 피해야 할 표현: ‘부드럽다’만 반복하면 정보가 얕아 보이므로, 반응성·가독성·피로감 같은 기준을 함께 씁니다.
부드러움이 항상 좋은 선택은 아니었다
반응성이 필요한 장면에서는 덜어내는 쪽이 맞았다
이징 함수를 쓰다 보면 모든 움직임을 부드럽게 만들고 싶어집니다. 하지만 실제 사용 후기를 기준으로 말하면, 부드러움은 만능이 아니었습니다. 슈팅, 격투, 정밀 플랫폼처럼 입력 반응이 중요한 장면에서는 애니메이션이 조금만 길어져도 조작이 늦게 먹는 듯한 착각을 줍니다. 플레이어가 버튼을 눌렀는데 화면이 예쁘게 따라오느라 늦는다면, 그 예쁨은 장점이 아니라 방해가 됩니다.
저는 공격 판정 표시, 위험 경고, 입력 버퍼 피드백에는 이징을 거의 쓰지 않거나 매우 짧게만 사용했습니다. 반대로 결과 확인, 메뉴 이동, 보상 표시처럼 플레이 판단을 방해하지 않는 곳에는 적극적으로 썼습니다. 즉 게임 프로그래밍에서 이징 함수의 핵심은 적용이 아니라 선택이었습니다. 어디에 넣느냐보다 어디에서 빼느냐가 더 중요해지는 순간이 많았습니다.
또 다른 관점도 있습니다. 일부 개발자는 직접 이징 함수를 만들기보다 엔진의 트윈 시스템이나 애니메이션 커브 에디터를 쓰는 편이 낫다고 말합니다. 저도 상용 프로젝트라면 그 의견에 꽤 동의합니다. 디자이너와 협업해야 하고, 실시간으로 곡선을 조절해야 한다면 코드 함수보다 시각적 도구가 빠릅니다. 다만 개인 프로젝트나 math library를 보여 주는 포트폴리오라면 직접 구현해 보는 경험이 분명한 자산이 됩니다.
- 직접 구현이 좋은 경우: 작은 엔진, 개인 포트폴리오, 수학 라이브러리 실험, 런타임 의존성을 줄이고 싶은 프로젝트입니다.
- 엔진 도구가 좋은 경우: 디자이너 협업, 컷신 제작, 복잡한 UI 시퀀스, 자주 바뀌는 연출 작업입니다.
- 이징을 줄일 장면: 위험 판정, 즉시 피드백, 정밀 점프, 조준선, 빠른 전투 카메라입니다.
- 이징을 늘릴 장면: 보상 표시, 메뉴 패널, 월드맵 이동, 튜토리얼 강조, 비전투 카메라 전환입니다.
다른 선택지를 인정하면 튜닝이 쉬워졌다
흥미롭게도 이징을 덜 쓰기로 결정한 뒤에 오히려 전체 움직임이 좋아졌습니다. 모든 요소가 부드럽게 움직일 때는 어떤 움직임이 중요한지 구분하기 어려웠지만, 즉각적인 요소와 부드러운 요소를 나누자 화면의 우선순위가 또렷해졌습니다. 플레이어는 빠르게 반응해야 할 것과 천천히 감상해도 되는 것을 자연스럽게 구분했습니다.
그래서 지금은 이징 함수를 ‘품질을 올리는 마법’이라기보다 시간을 배분하는 도구로 봅니다. 어떤 화면에는 0.15초의 여유가 있고, 어떤 판정에는 0.03초의 지연도 부담스럽습니다. 이 차이를 인정하면 함수 선택도 훨씬 담백해집니다. 부드러운 카메라보다 즉각적인 카메라가 더 좋은 게임도 있고, 수식보다 편집 가능한 커브가 더 좋은 팀도 있습니다. 그 반대 의견을 남겨 둔 채로 선택할 때, 작은 이징 함수 하나도 개발자의 판단을 보여 주는 좋은 기술 메모가 됩니다.
- 플레이어가 즉시 알아야 하는 정보에는 이징을 줄입니다.
- 반복해서 보는 UI에는 과한 탄성을 피합니다.
- 보여 주고 싶은 순간에는 짧고 선명한 ease out을 씁니다.
- 협업 프로젝트라면 코드 함수와 커브 에디터 중 누가 더 자주 수정할지 먼저 봅니다.
- 포트폴리오에서는 성공한 세팅뿐 아니라 버린 세팅의 이유도 함께 남깁니다.

- 다음글무료 툴에서 유료 장비까지 게임 프로그래밍 예산 키우기 26.09.27
등록된 댓글이 없습니다.
