2026/04/16 TIL
오늘의 목표
아침 코드카타(완료)
<c++과 언리얼 엔진으로 3D 게임 개발> 2-3, 2-4강
3D 슈팅 게임 만들기 과정
1. 캐릭터 구현
2. 캐릭터 입력 매핑 구현
3. 캐릭터 기본 동작 구현 (WASD 이동, 점프, 카메라 회전, 스프린트)
4. 캐릭터 애니메이션 적용 (Idle, Walk, Jump, Sprint)
5. 아이템 설계하기 (지뢰 아이템, 코인 아이템, 체력 회복 아이템)
6. 아이템 상호작용 (범위 내 있을 경우 체력 감소, 획득 시 점수 증가, 획득 시 체력 증가)
7. 아이템 랜덤 스폰 및 레벨 별 각 아이템 개수 설정
8. 캐릭터 데미지 및 아이템 점수 관리 시스템
9. 웨이브 시스템을 통한 게임 흐름 제어
10. HUD에 실시간 정보 반영
11. 게임 흐름에 맞춘 메뉴 UI 구현
12. UI 애니메이션 효과 및 3D 위젯 UI 구현
13. 파티클 효과 적용 (지뢰 폭발, 아이템 습득)
14. 사운드 효과 적용 (지뢰 폭발 사운드, 아이템 습득, 발걸음)
15. 프로젝트 배포
3. 캐릭터 기본 동작 구현 (WASD 이동, 점프, 카메라 회전, 스프린트)
캐릭터 움직임 함수 정의
Character 클래스
함수 선언
전방 선언
struct FInputActionValue;
/*
...
*/
UFUNCTION()
void Move(const FInputActionValue& value); // 설정한 Value Type에 따라 입력값을 받게 됨
UFUNCTION()
void Look(const FInputActionValue& value);
& 객체 참조 -> struct의 경우 크기가 큰 경우가 많기 때문에 객체 복사를 할 경우 메모리를 많이 사용하게 되므로 참조 사용
const -> 참조한 객체의 수정을 막기 위함
UFUNCTION()
void StartJump(const FInputActionValue& value);
UFUNCTION()
void stopJump(const FInputActionValue& value);
UFUNCTION()
void StartSprint(const FInputActionValue& value);
UFUNCTION()
void StopSprint(const FInputActionValue& value);
점프 시작 / 점프 끝
스프린트 시작 / 스프린트 끝
지금은 필요없지만 중간에 처리해야할 것이 있을 경우를 대비해서 나눠두는 게 좋다.
이것들은 모두 입력 바인딩 시스템으로, 모두 UFUNCTION()으로 묶어서 리플렉션 시스템에 등록해줘야한다.
// Called to bind functionality to input
void ASpartaCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
if (UEnhancedInputComponent* EnhancedInput = Cast<UEnhancedInputComponent>(PlayerInputComponent)) //
{
if (ASpartaPlayerController* PlayerController = Cast<ASpartaPlayerController>(GetController)))
{
if (PlayerController->MoveAction)
{
Enhancedinput->BindAction(
PlayerController->MoveAction, // PlayerController에서 받은 입력값
ETriggerEvent::Triggered, // 키가 눌려서 이벤트 발생
this, // 이 객체
&ASpartaCharacter::Move // 함수 호출
);
}
}
}
}
챕터 2-4 숙제
2개의 State Machine을 단일 State Machine으로 통합해보기

Locomotion과 Main States, 두 가지 State Machine으로 만들어진 캐릭터 애니메이션을 하나의 State Machine으로 통일해야 한다.


Locomotion이 들어있던 부분을 Locomotion 내의 Idle과 Walk/Run으로 바꿔줬다.
Land 모션이 끝나면 Idle로, Land중 움직이고 있으면 Walk/Run으로 상태가 변환된다.
처음에는 Idle로 돌아가는걸로만 설정했더니 랜드할 때 살짝 움직임이 이상해서 Walk/Run으로의 변환도 적용해줬더니 나아졌다.
이제 Land State 내의 로코모션을 바꿔야한다.


공중에서 Idle 상태로 가는 것은 이미 잘 구현이 되어 있을 것 같아서 WalkRun -> Land의 경우만 블렌딩해주기로 했다.
이렇게 하니 하나의 StateMachine만으로 잘 굴러간다!
오늘 배운 개념 정리
애니메이션 블루프린트
Local Player Subsystem
-> IMC를 가지고 있는 내비게이션 역할
PlayerController
-> 입력을 받음, Character에게 명령
Character
-> 명령 수행