포스트

UE5 C++ | Warehouse Wreckage, 함수와 섹션 마무리 (유데미)

언리얼 강의 중 Section 2를 정리한 마지막 글입니다.

UE5 C++ | Warehouse Wreckage, 함수와 섹션 마무리 (유데미)

강의 정보 🎓


Level 블루프린트 기초 (UE 5.3.2 기준) 📘

Level 블루프린트에서 My Bluepriont창 열기

  • WindowMy 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)를 수정 ]

[ BP_Projectile 멤버 함수 Launch (Static Mesh Component)를 수정 ]

  • 일단 Target이 존재 하지 않는다.
  • 이것 자체로 Static Mesh Componet Object Reference를 전달하는 듯 하다.
  • 또는 Self를 통해서 기존 Get Static Mesh Component에 연결해도 작동한다.
  • 위의 두 방식의 차이는?

컴파일 오류 파헤치기 With GPT ⚠️

StaticMeshComponent 접근 방식의 차이

  1. Get StaticMeshComponent 노드를 직접 호출하는 방식
    • 이 방식은 BP_Projectile 블루프린트 내부에 선언된 StaticMeshComponent 변수를 직접 참조합니다.
    • 노드 생성 시, 타겟(Target)이 자동으로 Self로 설정되어 있어 따로 지정하지 않아도 작동합니다.
    • 컴파일 시점에 블루프린트의 소유 객체(Self)를 기준으로 참조되기 때문에 정적이고 안전한 방식입니다.
  2. 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는 오류가 날까?

  1. Get Actor Forward Vector함수(Function) 노드
    • GetActorForwardVectorAActor 클래스의 멤버 함수입니다.
    • 호출할 때 내부적으로 Self를 Target으로 간주하여 처리합니다.
    • 함수 노드는 실행 체인에 연결되지 않더라도 최적화 대상이 되지 않고 살아남습니다.

즉, 컴파일러가 이 함수를 제거하지 않습니다.

  1. Get StaticMeshComponent변수(Get Variable) 노드
    • 이는 함수가 아니라 BP 내부에 선언된 UStaticMeshComponent 변수를 참조하는 노드입니다.
    • 이 노드는 실행 체인(execution chain) 또는 다른 노드와 연결되지 않으면, 언리얼이 “사용되지 않는 변수”로 간주하고 제거(purged) 해버립니다.
    • 그 결과, 해당 노드가 의존하고 있던 Target도 사라지고, “Invalid target” 오류가 발생하게 됩니다.

즉, 연결이 끊기면 컴파일 시 제거되기 때문에 오류가 납니다.

구분GetActorForwardVectorGetStaticMeshComponent
정체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이 유효하지 않으면 오류가 납니다.
항목GetActorForwardVectorGetStaticMeshComponent
정의 위치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++을 이용해서 언리언 개발을 하는 실력까지 기르고 싶다.

마무리 스크린샷 📷

[ 조금 초라한 최종 모습... 앞으로 열심히 하자! ]

[ 조금 초라한 최종 모습… 앞으로 열심히 하자! ]

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