UE5 C++ | Warehouse Wreckage, 함수와 섹션 마무리 (유데미)
언리얼 강의 중 Section 2를 정리한 마지막 글입니다.
강의 정보 🎓
- 강의명: Unreal Engine 5 C++ Developer: Learn C++ & Make Video Games
- 플랫폼: 유데미
- 현재 섹션: Section 2 - Warehouse Wreckage
- 주요 내용: 함수와 섹션 마무리에 대해 다루었다.
Level 블루프린트 기초 (UE 5.3.2 기준) 📘
Level 블루프린트에서 My Bluepriont창 열기
Window
→My Blueprint
Variables(변수)
- 변수 생성 후 Default Value를 설정하려면 좌측 상단
Compile
버튼을 반드시 클릭해줘야 한다. - 변수 이름 예시:
ammo
- 변수 드래그 시:
Set
/Get
선택 가능Alt + 드래그
→ Set 노드를 생성Ctrl + 드래그
→ Get 노드 생성
Branch Node (분기 노드)
- 조건에 따라 참(True) / 거짓(False) 분기를 수행한다.
greater
,equal
,less
등 비교 연산 노드와 함께 사용한다.
Comment Block
- 여러 노드 선택 후
C
키 → 주석 블록 생성한다. - 노드 묶음의 의미나 역할 설명이 가능하다.
Function 만들기
- 블루프린트 안에서 직접 함수 생성이 가능하다.
- 노드 선택 → 우클릭 →
Collapse to Function
을 하게되면 해당 노드들을 함수에 바로 넣어서 만들어 준다.
코드 네이밍 중요!
“코드는 의사소통의 도구다”
→ 팀, 팀원, 미래의 나를 위해 명확하고 일관된 네이밍 필수!
함수 리턴 및 실행 핀 정리 🧩
함수의 Input과 Output
- 왼쪽 패널에서 함수 선택 → 디테일 창에서 확인 할 수 있다.
- Input / Output은 여러 개 추가 가능
- 변수 이름을 파스칼(Pascal), 카멜(Camel) 방식으로 작성하면, 자동으로 띄어쓰기 적용된다. (예:
HasAmmo
→ “Has Ammo”)
함수 실행 핀(Pin) 제거 방법
HasAmmo
와 같이 단순한 계산 함수인데도 실행 핀이 생긴다면, 이는 Side Effect가 있기 때문
Side Effect란?
함수 실행 시, 눈에 띄는 변화(상태 변화)가 발생하는 것을 뜻한다.
예:
Print String
,Add Impulse
,Set Ammo
등
Pure Function
오직 계산 & 리턴이 목적인 함수를 뜻하며, Side Effect 없으며 이에 따라 실행 핀이 없다는 특징이 있다. 이를 위해서 함수 디테일 창에서 “Pure” 체크박스를 활성화 해야만 한다.
예:
Get Ammo
,Get Actor Forward Vector
,Multiply
,Minus
,Greater
등
멤버 함수 📦
Spawn Projectile
함수에서BP_Projectile
관련 로직이 많다면, 해당 로직은BP_Projectile
내부로 옮기는 게 효율적이다.BP_Projectile
클래스 블루프린트 → My Blueprint → Functions 에서 함수 생성 가능- 해당 함수는 클래스의 멤버 함수(Member Function)가 됨
멤버 함수 특징
- 항상 특정 인스턴스에서 호출
- 암묵적으로 “Self”를 입력 값으로 가짐 → 디테일 창에는 안 보여도 존재
Self (Get a reference to self)
노드는 현재 인스턴스를 참조할 때 사용
멤버 함수 적용
[ 멤버 함수로 작성하지 전의 레벨 블루 프린트 ]
1
2
Variable node Get StaticMeshComponent uses an invalid target. It may depend on a node that is not connected to the execution chain, and got purged.
[5103.17] Compile of BP_Projectile failed. 1 Fatal Issue(s) 0 Warning(s) [in 46 ms] (/Game/MyContent/BP_Projectile.BP_Projectile)
- 위의 Get Static Mesh Component의 경우 Read the value of variable StaticMeshComponent 라는 설명이 있다.
- Target은 Static Mesh Actor Object Reference를 받는다고 한다.
[ BP_Projectile 멤버 함수 Launch (Static Mesh Component)를 수정 ]
- 일단 Target이 존재 하지 않는다.
- 이것 자체로 Static Mesh Componet Object Reference를 전달하는 듯 하다.
- 또는 Self를 통해서 기존 Get Static Mesh Component에 연결해도 작동한다.
- 위의 두 방식의 차이는?
컴파일 오류 파헤치기 With GPT ⚠️
StaticMeshComponent 접근 방식의 차이
Get StaticMeshComponent
노드를 직접 호출하는 방식- 이 방식은 BP_Projectile 블루프린트 내부에 선언된 StaticMeshComponent 변수를 직접 참조합니다.
- 노드 생성 시, 타겟(Target)이 자동으로
Self
로 설정되어 있어 따로 지정하지 않아도 작동합니다. - 컴파일 시점에 블루프린트의 소유 객체(Self)를 기준으로 참조되기 때문에 정적이고 안전한 방식입니다.
Get StaticMeshComponent
노드에Self
를 명시적으로 연결하는 방식- 이 역시 결국 같은 StaticMeshComponent에 접근합니다.
- 차이는 Target 핀을 명시적으로 Self로 연결해줌으로써, 개발자의 의도를 더 명확하게 표현하는 것입니다.
- 언리얼에서는 명시적으로 Target을 연결하는 걸 권장하는 경우가 있습니다 (특히 외부 참조가 많거나 컴포넌트가 동적으로 바뀌는 경우).
구분 | 내부 동작 | 장점 | 사용 추천 상황 |
---|---|---|---|
Target 연결 없이 호출 | Self로 자동 설정됨 | 간단하고 빠름 | 내부에서만 간단히 사용할 때 |
Target에 Self 명시 | Self를 명확히 전달 | 가독성 향상, 명시적 | 협업, 외부 참조가 많을 때 |
주의: 컴파일 오류 관련
- 처음 사례처럼 “uses an invalid target” 오류가 발생하는 이유는, 해당 노드가 실행 체인(execution chain)에 연결되지 않아 참조가 무효화(purged) 되었기 때문입니다.
- 멤버 함수 안에서는
Self
기반 참조가 더 안정적으로 작동합니다.
필요하다면 멤버 함수 내부의 StaticMeshComponent 접근을 Get StaticMeshComponent(Self)
식으로 항상 명시해도 무방합니다.
같은 방식으로 옮겼는데, 왜 Get StaticMeshComponent
는 오류가 날까?
Get Actor Forward Vector
는 함수(Function) 노드GetActorForwardVector
는 AActor 클래스의 멤버 함수입니다.- 호출할 때 내부적으로
Self
를 Target으로 간주하여 처리합니다. - 함수 노드는 실행 체인에 연결되지 않더라도 최적화 대상이 되지 않고 살아남습니다.
즉, 컴파일러가 이 함수를 제거하지 않습니다.
Get StaticMeshComponent
는 변수(Get Variable) 노드- 이는 함수가 아니라 BP 내부에 선언된 UStaticMeshComponent 변수를 참조하는 노드입니다.
- 이 노드는 실행 체인(execution chain) 또는 다른 노드와 연결되지 않으면, 언리얼이 “사용되지 않는 변수”로 간주하고 제거(purged) 해버립니다.
- 그 결과, 해당 노드가 의존하고 있던 Target도 사라지고, “Invalid target” 오류가 발생하게 됩니다.
→ 즉, 연결이 끊기면 컴파일 시 제거되기 때문에 오류가 납니다.
구분 | GetActorForwardVector | GetStaticMeshComponent |
---|---|---|
정체 | AActor의 멤버 함수 | 변수 (UStaticMeshComponent*) |
연결 여부 | Execution chain과 무관 | 연결 안 되면 Purged 대상 |
연결 없이도 오류 없음? | ✅ 예 | ❌ 아니요 |
해결 방법 | 없음 (기본 OK) | Self 연결 또는 실행 체인 연결 필요 |
실전 팁
- 변수 노드(Get StaticMeshComponent)는 함수 내에서 Self를 명시적으로 연결하거나 다른 실행 노드와 함께 묶어서 생존시키는 방식으로 안정적으로 사용하세요.
- 함수 노드(GetActorForwardVector)는 상대적으로 안전하지만, 협업 시에도 Target을 명시하는 습관이 도움이 됩니다.
GetActorForwardVector
vs GetStaticMeshComponent
구조 이해 📖
GetActorForwardVector
는 Target오류가 나지 않았는데 GetStaticMeshComponent
는 Target 오류가 난 차이에 대해 궁금증이 생겼다.
GetActorForwardVector
- BP_Projectile이 직접 상속받은 AActor의 멤버 함수입니다.
- 즉, BP_Projectile(Self) 자체가 이 함수를 갖고 있습니다.
- 그래서 함수 호출 시
Self
(자기 자신)를 기준으로 자동 호출 가능합니다.
1
BP_Projectile → AActor → GetActorForwardVector()
GetStaticMeshComponent
- 이건 BP_Projectile이 소유한 컴포넌트 변수를 참조하는 것입니다.
- 즉, BP_Projectile이 가진 StaticMeshComponent라는 “변수”에 먼저 접근한 뒤, 해당 컴포넌트에 대해 작업(GetWorldLocation, AddImpulse 등)을 해야 합니다.
1
BP_Projectile → StaticMeshComponent 변수 → (그 이후 멤버 접근 가능)
- 따라서, StaticMeshComponent 자체가 참조되지 않거나 Target이 유효하지 않으면 오류가 납니다.
항목 | GetActorForwardVector | GetStaticMeshComponent |
---|---|---|
정의 위치 | AActor의 멤버 함수 | BP 내부의 변수 |
소유자 | BP_Projectile (Self) | BP_Projectile이 가진 컴포넌트 |
연결 없이 사용 | 가능 (Self 자동 처리) | 불가능 (연결 없으면 purge) |
대표 사례 | 방향 벡터 얻기 | 메시 위치/물리 적용 등 |
나의 정리
GetActorForwardVector
는 BP_Projectile이 기본적으로 가지는 멤버 함수이고 GetStaticMeshComponent
는 BP_Projectile의 Static Mesh Component 변수가 가지는 내부의 함수인 것! 따라서 Self가 무엇 인지를 알려야 했던 것이다.
레벨을 재시작 시키기 🔃
ammo를 다쓰면 레벨을 다시 실행시켜보자!
- Delay → Get Current Level Name → Open Level(by Name)
- 현재 레벨 이름을 가져와서 → 레벨을 열게함(현재 레벨이 진행 되도 현재 상태가 저장되어 있는게 아니니까!)
Section 2를 마치며… 🏁
- 블루 프린트 기초: 노드, 핀…
- 프로그래밍 기초: 변수, 스트링, 함수, 참조, 분기 → 모든 블루프린트는 C++로 변환이 가능하다
- 언리얼 기초: 맵, 액터, 컴포넌트, 변환, 벡터 → 이 또한 C++에서 어떻게 사용되는지 배울 것이다
- 객체 지향 프로그래밍 기초: 객체와 구조체, 클래스, 멤버 함수, self… C++을 이해하는데 중요하다.
요약 및 느낀점 📝
- 블루프린트, 언리얼 상의 함수의 기초를 전반적으로 다루었다.
- 이를 배우면서 살짝 이해가 부족했던 액터의 구조도 조금은 알 수 있었다.
- 또한 레벨을 다시 시작하는 방법도 배웠다.
느낀점 💡
강의의 두번째 섹션이지만 사실상 첫번째 섹션이자 프로젝트가 끝난 느낌이다. 간단한 블루프린트의 사용법에 대해서 배웠는데 어서 익숙해지고 후에는 C++을 이용해서 언리언 개발을 하는 실력까지 기르고 싶다.
마무리 스크린샷 📷
[ 조금 초라한 최종 모습… 앞으로 열심히 하자! ]