UE5 C++ | Crypt Raider, 지오메트리 스위핑, 인풋 시스템 (유데미)
언리얼 강의 중 Section 4를 정리한 다섯번째 글입니다.
강의 정보 🎓
- 강의명: Unreal Engine 5 C++ Developer: Learn C++ & Make Video Games
- 플랫폼: 유데미
- 현재 섹션: Section 4 - Crypt Raider
- 주요 내용: 참조/포인터 개념, Sweep 활용법, 최신 인풋 시스템 적용, Grabber 블루프린트 연결 흐름을 다루었다.
참조 vs 포인터 🆚
- 공통점: 둘 다 메모리 주소를 기반으로 동작한다.
- 차이점:
- 포인터: 새 주소 재할당 가능
- 참조: 최초 할당된 주소만 가리킴 (재할당 불가)
예시
1
2
3
4
float Damage = 0;
float& DamageRef = Damage;
DamageRef = 5.0f;
UE_LOG(LogTemp, Display, TEXT("Damage: %f, DamageRef: %f"), Damage, DamageRef);
Const 참조 & 아웃 매개 변수 🛡️
const &
사용 시 내부에서 값 수정 불가- 참조가
const
가 아니면 아웃 매개 변수로 사용 중일 가능성이 높다. - 다음처럼 사용시
TickComponent
Damage가 바뀐다.
1
2
3
4
5
6
7
8
9
10
11
12
13
void UGrabber::TickComponent(...)
{
...
float Damage = 5;
PrintDamage(Damage);
UE_LOG(LogTemp, Display, TEXT("Original Damage: %f"), Damage);
}
void UGrabber::PrintDamage(float& Damage)
{
Damage = 2;
UE_LOG(LogTemp, Display, TEXT("Damage: %f"), Damage);
}
- 선언되었지만 값을 받지 못하고 즉시 함수로 전달된 변수가 있다면 아웃 매개 변수임을 짐작할 수 있다.
- 참조가 매개 변수인데 const가 아니라면 이 경우도 아웃 매개 변수라는 단서이다.
지오메트리 스위핑 🛠️
SweepSingleByChannel
- 지오메트리 스위핑 충돌 감지 구현 예시
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
FCollisionShape Sphere = FCollisionShape::MakeSphere(GrabRadius);
FHitResult HitResult;
bool HasHit = GetWorld()->SweepSingleByChannel(
HitResult,
Start,
End,
FQuat::Identity,
ECC_GameTraceChannel2,
Sphere
);
if(HasHit)
{
UE_LOG(LogTemp, Display, TEXT("Hit Result: %s"), *HitResult.GetActor()->GetActorNameOrLabel());
}
else
{
UE_LOG(LogTemp, Display, TEXT("Hit Nothing!"));
}
ECollisionChannel 설정
- 프로젝트 폴더 → config 폴더 → DefaultEngine.ini → Grabber 검색한다.
ECC_GameTraceChannel2가 채널 이름이다.
1
+DefaultChannelResponses=(Channel=ECC_GameTraceChannel2,DefaultResponse=ECR_Ignore,bTraceType=True,bStaticObject=False,Name="Grabber")
인풋 동작 매핑 🎮
5.1 이후부터 강의 내용으로 진행 못하며 다음과 같은 내용이 있다.
언리얼 엔진(UE) 5.1 또는 이후 버전을 사용하며 이 강의를 시청할 수강생을 위한 간략한 지침입니다.
프로젝트 진행 간 문제가 발생하지 않도록 강사와 동일한 소프트웨어 버전을 사용하며 이 강의를 시청할 것을 권장해 드립니다. 하지만 최신 언리얼 엔진 버전을 사용해 발생하는 문제들을 해결하는 데 부담이 없으시다면, 계속 읽어 주세요!
UE 5.1부터 표준 인풋 시스템이 더 이상 사용되지 않으며 향상된 인풋 시스템으로 대체되었습니다.
이건 꽤 큰 변경사항이며 마켓플레이스에서 기존의 캐릭터를 임포트하거나 이 강의에서 설명하는 내용을 따라 하실 때 문제가 발생할 수 있습니다.
새로운 인풋 시스템에서 발생하는 문제를 해결하는 내용을 이 강의에서 전부 다룰 수는 없지만, 새 인풋 시스템이 어떻게 동작하는지 학습하고 싶으시다면 YouTube에서 Steven Ulibarri의 훌륭한 강의를 참고하실 것을 권장해 드립니다.
UE5 C++ 향상된 입력 – 1 – 핵심 개념 및 문서 (01:06:29)
UE5 C++ 향상된 입력 – 2 – C++ 함수를 입력 액션에 바인딩하기 (00:53:16)
UE5 C++ 향상된 입력 – 3 - Float 타입과 반전(Negate) 모디파이어 (00:16:16)
UE5 C++ 향상된 입력 – 4 – 2D 인풋 액션 사용하기 (00:16:45)
UE5 C++ 향상된 입력 – 5 – 방향키 입력으로 캐릭터 움직이기 (00:39:41)
변경된 인풋 시스템
- Content → FirstPerson → Input → Action → IA_Grab 생성한다.
- Value Type: Digital(bool) 설정
- Content → FirstPerson → Input → IMC_Default
- IA_Grab 추가
- Mapping 추가 → Left Mouse Button, Gamepad Right Trigger
- IMC_Default는 BP_FirstPersonCharacter에 이미 매핑되어있다.
BP_Player 설정
블루프린트 호출 🎬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Grabber.h
UFUNCTION(BlueprintCallable)
void Grab();
UFUNCTION(BlueprintCallable)
void Release();
// Grabber.cpp
void UGrabber::Grab()
{
UE_LOG(LogTemp, Display, TEXT("Grab"));
}
void UGrabber::Release()
{
UE_LOG(LogTemp, Display, TEXT("Released grab"));
}
블루프린트 연동
- BP_Player에서 Grabber 컴포넌트 드래그 → Grab / Release 함수 노드를 사용한다.
- 만약 노드가 보이지 않으면:
- VS Code →
Ctrl + Shift + B
→CryptRaiderEditor Win64 Development Build
빌드 후 시도한다.
- VS Code →
요약 및 느낀점 📝
- *와 &의 차이점에 대해 다루고 &에 대한 이해를 높였다.
- 지오메트리 스위핑을 통해 충돌을 감지해서 출력을 하였다.
- 인풋 시스템을 통해 왼쪽 클릭의 반응을 출력하였다.
블루프린트로 C++함수를 직접 끌고오는 작업을 수행하였는데 이를 활용하면 C++과 블루프린트 간의 작업이 매우 수월해질것 같다.