📚 입력 시스템 시리즈
🚀 들어가며
이전 글에서는 키 입력을 단순히 확인하는 것을 넘어서,
Pressed Held Released
세 가지 상태를 구분하는 방법을 구현해봤습니다.
하지만 여기서 한 가지 문제가 남아 있습니다.
❓ 입력 처리가 게임 코드 곳곳에 흩어지지 않게 하려면?
❓ 특정 객체만 입력을 받게 하려면?
❓ 입력을 이벤트처럼 처리하려면?
이번 글에서는 Polling 방식의 입력을
👉 이벤트 기반 구조(Event System)로 확장하는 방법을 살펴보겠습니다.
🎯 현재 구조의 문제
지금까지 구현한 구조는 다음과 같습니다.
if (input.IsJumpPressed())
{
Jump();
}
이 방식은 간단하고 직관적이지만, 문제가 있습니다.
입력 처리 코드가 게임 로직에 직접 연결됨 ↓ 코드가 여러 곳에 분산됨 ↓ 확장 어려움
🎯 해결 방향
입력 처리 구조를 다음과 같이 바꿉니다.
입력 감지 ↓ 이벤트 발생 ↓ 등록된 함수 실행
즉,
👉 입력을 “직접 처리”하지 않고
👉 “이벤트로 전달”하는 구조입니다.
🧠 이벤트 구조 기본 개념
이 구조는 매우 단순합니다.
입력 발생 ↓ OnJump 이벤트 호출 ↓ 등록된 함수 실행
🎮 델리게이트와 연결
이제 이전에 구현했던 델리게이트를 활용할 수 있습니다.
Delegate OnJump;
입력 시스템에서는 이렇게 사용합니다.
if (input.IsJumpPressed())
{
OnJump.Broadcast();
}
이제 입력 시스템은 “무슨 일이 일어나는지” 모릅니다.
단순히 이벤트만 발생시킵니다.
🎯 게임 객체에서 입력 처리
이제 실제 게임 로직은 이렇게 작성됩니다.
class Player
{
public:
void Jump()
{
std::cout << "Player Jump\n";
}
};
Player player;
OnJump.Add([&player]()
{
player.Jump();
});
이 구조의 핵심은 다음입니다.
입력 시스템 ↓ 이벤트 발생 ↓ Player 반응
🔥 무엇이 달라졌나?
기존 구조:
입력 → 바로 함수 호출
변경된 구조:
입력 → 이벤트 → 객체 반응
👉 완전히 다른 구조입니다.
🎯 장점
- 입력과 게임 로직이 분리된다
- 여러 객체가 하나의 입력에 반응할 수 있다
- 확장성이 좋아진다
- 엔진 구조와 동일한 형태가 된다
🧠 전체 흐름 정리
GetAsyncKeyState ↓ Input System ↓ Pressed 판별 ↓ Delegate Broadcast ↓ Game Object 실행
이 구조가 바로 게임 엔진 입력 시스템의 기본 형태입니다.
🎯 핵심 정리
- Polling 방식 입력은 이벤트 구조로 확장할 수 있다
- 입력 시스템은 이벤트만 발생시키는 역할을 한다
- 실제 로직은 델리게이트를 통해 연결된다
- 입력과 게임 로직을 분리하는 것이 핵심이다
이 구조를 이해하면
게임 엔진의 입력 시스템과 이벤트 흐름이 어떻게 연결되는지 보이기 시작합니다.
🎮 마무리
입력 시스템은 단순히 키를 읽는 코드가 아니라,
👉 사용자 행동을 게임 객체로 전달하는 구조입니다.
이 구조를 이해하면 게임 엔진의 설계 방식이 자연스럽게 보이기 시작합니다.
🚀 한 단계 더 나아가고 싶다면
입력 시스템, 델리게이트, 게임 루프는 모두 하나의 흐름으로 연결됩니다.
단순히 사용하는 것을 넘어서,
엔진이 어떻게 동작하는지 이해하는 데 초점을 맞춘 내용입니다.