포스트

UE5 C++ | Crypt Raider, 지오메트리 스위핑, 인풋 시스템 (유데미)

언리얼 강의 중 Section 4를 정리한 다섯번째 글입니다.

UE5 C++ | Crypt Raider, 지오메트리 스위핑, 인풋 시스템 (유데미)

강의 정보 🎓


참조 vs 포인터 🆚

  • 공통점: 둘 다 메모리 주소를 기반으로 동작한다.
  • 차이점:
    • 포인터: 새 주소 재할당 가능
    • 참조: 최초 할당된 주소만 가리킴 (재할당 불가)

포인터 VS 참조 포인터 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 설정

IA_Grab Print String.png


블루프린트 호출 🎬

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 + BCryptRaiderEditor Win64 Development Build 빌드 후 시도한다.

Calling C++ function in Blueprint.png


요약 및 느낀점 📝

  • *와 &의 차이점에 대해 다루고 &에 대한 이해를 높였다.
  • 지오메트리 스위핑을 통해 충돌을 감지해서 출력을 하였다.
  • 인풋 시스템을 통해 왼쪽 클릭의 반응을 출력하였다.

    블루프린트로 C++함수를 직접 끌고오는 작업을 수행하였는데 이를 활용하면 C++과 블루프린트 간의 작업이 매우 수월해질것 같다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.