함수 정의 및 기본 호출 방법
함수의 입력·출력과 지역 변수를 설계하고 호출 노드로 값을 주고받으며 반복 로직을 재사용하는 법을 익힙니다.
변수가 데이터를 저장하는 상자라면, 함수(Function)는 특정 작업을 수행하는 미리 만들어진 작업 절차라고 할 수 있습니다.
게임 개발에서는 특정 동작이나 계산이 여러 곳에서 반복적으로 필요할 때가 많습니다.
예를 들어, 플레이어가 아이템을 획득할 때마다 점수를 추가하고, 효과음을 재생하며, 인벤토리에 아이템을 추가하는 일련의 과정이 있다고 가정해봅시다.
이 과정을 매번 새로 만들 필요 없이, 하나의 함수로 정의해두면 필요할 때마다 간단히 호출하여 재사용할 수 있습니다.
함수를 사용하는 것은 코드의 재사용성을 높이고, 블루프린트 그래프를 더욱 깔끔하고 관리하기 쉽게 만들어줍니다.
마치 복잡한 레시피의 한 부분을 소스 만들기라는 별도의 과정으로 분리하여 필요한 순간에 가져다 쓰는 것과 같습니다.
함수는 그래프를 짧게 만들고 같은 작업을 여러 곳에서 호출하게 해준다. 입력 핀은 필요한 값, 출력 핀은 처리 결과를 의미한다.
- Input
ScoreToAdd처럼 함수가 작업을 수행하기 위해 받는 값이다.
- Function Body
Get PlayerScore, 더하기, Set PlayerScore처럼 반복 로직을 한 그래프 안에 묶는다.
- Output
필요하면 계산 결과나 성공 여부를 다음 노드로 반환한다.
- 생성:
Functions 패널에서 이름을 붙이고 함수 그래프를 연다.
- 핀 설계:
입력과 출력의 이름, 타입, 의미를 먼저 정한다.
- 호출
벤트 그래프에서 함수 노드를 놓고 실행 핀을 연결한다.
- 검증:
컴파일 후 Print String이나 디버그로 값 흐름을 확인한다.
블루프린트 함수란 무엇인가?
함수는 그래프 일부를 이름 있는 동작으로 분리하고, input/output pin으로 호출부와 내부 로직의 경계를 만든다.
- Input pinsInput pins 호출자
넘겨야 하는 값
- Function bodyFunction body 반복 로직
검증을 내부에 숨김
- Output pinsOutput pins 호출자
받을 결과
| 기준 | 해석 |
|---|---|
| 좋은 함수 | 한 가지 동작을 이름으로 설명 |
| 주의 | 상태를 많이 바꾸는 함수는 실행선이 보이게 유지 |
| 핵심 | 함수는 그래프 정리가 아니라 호출 계약이다 |
함수는 특정 작업을 수행하기 위한 노드들의 묶음입니다.
함수는 입력(Inputs)을 받아 어떤 작업을 처리한 후 출력(Outputs)을 반환할 수 있습니다.
입력은 함수가 작업을 수행하는 데 필요한 정보이고, 출력은 함수가 작업을 마친 후 내놓는 결과물입니다.
블루프린트 함수는 주로 다음과 같은 경우에 사용됩니다.
- 반복적인 로직: 여러 곳에서 동일한 또는 유사한 로직이 반복될 때 함수로 묶어 재사용합니다.
- 복잡한 로직의 단순화: 복잡한 하나의 로직을 여러 개의 작은 함수로 분리하여 가독성을 높이고 관리하기 쉽게 만듭니다.
- 특정 기능의 캡슐화: 특정 기능(예: 대미지 계산, 아이템 사용)을 함수로 정의하여, 해당 기능을 호출하는 쪽에서는 내부 구현을 몰라도 되도록 만듭니다.
함수 정의 및 생성하기
블루프린트에서 함수를 정의하는 과정은 다음과 같습니다.
- 블루프린트 에디터의 좌측에 있는 변수 패널 아래의 함수(Functions) 패널로 이동합니다.
- 패널 상단의
+ 함수(+ Function)버튼을 클릭합니다. - 새로운 함수가 생성되면 이름을 입력합니다. (예:
AddScore) - 함수 이름 옆에 새로운 탭이 열리면서 해당 함수의 이벤트 그래프와 유사한 공간이 나타납니다. 이곳이 바로 함수를 정의하는 공간입니다.
- 함수 정의 그래프에서
입력(Inputs)노드와출력(Outputs)노드를 찾습니다. 이 노드들은 함수의 시작점과 끝점을 나타냅니다. - 디테일 패널에서 이 함수에 필요한 입력(매개변수)과 출력(반환 값)을 추가할 수 있습니다.
입력(Inputs)노드를 선택한 상태에서 디테일 패널의입력(Inputs)섹션에 있는+버튼을 클릭합니다.- 새로운 입력 매개변수의 이름을 지정하고(예:
ScoreToAdd) 원하는 변수 유형을 선택합니다(예:Integer). - 마찬가지로
출력(Outputs)노드를 선택하여 반환할 값을 추가할 수 있습니다.
- 함수 정의 그래프에서 입력 핀을 통해 전달받은 데이터를 사용하여 로직을 구성합니다.
- 예를 들어,
AddScore함수라면,ScoreToAdd입력 값을 기존PlayerScore변수에 더하고, 그 결과를 다시PlayerScore에 설정하는 로직을 만들 수 있습니다.입력노드의ScoreToAdd출력 핀을 가져옵니다.Get PlayerScore노드를 추가합니다.- 두 값을 더하기 위해
Integer + Integer노드를 추가하고 연결합니다. - 결과를
Set PlayerScore노드에 연결합니다. - 마지막으로
Set PlayerScore의 실행 핀을출력노드의 실행 핀에 연결합니다.
컴파일 및 저장: 함수를 정의한 후에는 반드시 컴파일하고 저장해야 변경 사항이 적용됩니다.
함수를 만들 때는 입력 핀, 내부 로직, 출력 핀, 컴파일/저장을 하나의 정의 단위로 보고, 그다음 이벤트 그래프에서 호출 위치를 정하면 흐름이 덜 헷갈립니다.
AddScore 예시는 함수 그래프 안의 계산 책임과 Event Graph의 호출 책임을 분리해서 읽어야 한다.
- Function Input
ScoreToAdd:Int Exec In 데이터 핀
- Function Body
PlayerScore + ScoreToAdd Get Set
- Function Output
NewScore:Int Exec Out 반환값
- Compile/Save
핀 타입과 그래프 오류 확인 Compile Save
- Event Graph Call
BeginPlay 뒤 AddScore(100) 호출 위치 테스트 출력
| 점검 | 기준 |
|---|---|
| 함수 안 | 반복되는 계산과 검증을 한 이름 아래 숨긴다. |
| 호출부 | 언제 실행할지와 어떤 값을 넘길지만 보이게 둔다. |
| A 기준 | 그래프 정리가 아니라 입력·출력 계약이 보여야 한다. |
위 점검표는 함수 내부에 책임을 숨기고, 호출하는 쪽에서는 필요한 값만 연결하는 관점을 요약합니다.
함수 호출(Call) 방법
정의된 함수는 다른 블루프린트 그래프(예: 이벤트 그래프)에서 호출하여 실행할 수 있습니다.
이벤트 그래프로 돌아가기: 블루프린트 에디터에서 이벤트 그래프 탭을 클릭하여 메인 그래프로 돌아옵니다.
- 이벤트 그래프의 빈 공간에서 마우스 오른쪽 버튼을 클릭하여 컨텍스트 메뉴를 엽니다.
- 검색창에 여러분이 정의한 함수 이름(예:
AddScore)을 입력하고 해당 함수를 선택합니다. - 또는, 좌측 함수(Functions) 패널에서 해당 함수를 찾아 그래프로 드래그 앤 드롭해도 됩니다.
- 함수 노드는 일반적인 노드와 마찬가지로 실행 핀과 데이터 핀을 가집니다.
- 이전 노드의 실행 핀을 함수 노드의 실행 핀에 연결하여 함수가 언제 실행될지 지정합니다.
- 함수의 입력 핀에 필요한 데이터를 연결합니다. 예를 들어,
AddScore함수의ScoreToAdd핀에50이라는 값을 연결할 수 있습니다. - 함수가 반환하는 출력 값을 다음 로직에 사용하려면, 함수 노드의 출력 핀을 다음 노드의 입력 핀에 연결합니다.
AddScore 함수 호출
이전 절에서 만든 BP_WelcomeMessage 블루프린트에서 AddScore 함수를 호출해봅시다.
BP_WelcomeMessage 블루프린트를 열고, PlayerScore 변수(Integer 타입)를 생성합니다.
좌측 함수 패널에서 + 함수를 클릭하여 AddScore라는 새 함수를 만듭니다.
AddScore 함수 그래프에서 입력(Inputs) 노드를 선택하고, 디테일 패널에서 ScoreToAdd (Integer 타입)이라는 입력 매개변수를 추가합니다.
함수 로직은 다음과 같이 구성합니다.
Get PlayerScore노드를 가져옵니다.ScoreToAdd입력 핀에서 드래그하여Integer + Integer노드를 추가하고,Get PlayerScore와ScoreToAdd를 연결합니다.Set PlayerScore노드를 추가하고,Integer + Integer의 결과를Set PlayerScore에 연결합니다.입력(Inputs)노드의 실행 핀을Set PlayerScore의 실행 핀에 연결하고,Set PlayerScore의 실행 핀을출력(Outputs)노드의 실행 핀에 연결합니다.
함수를 컴파일하고 저장합니다.
이벤트 그래프로 돌아와서 Event BeginPlay 노드 뒤에 AddScore 함수를 호출하는 노드를 배치합니다.
AddScore 노드의 ScoreToAdd 입력 핀에 100을 입력합니다.
AddScore 노드 뒤에 Print String 노드를 연결하고, Get PlayerScore 노드를 가져와 Print String의 In String 핀에 연결합니다.
블루프린트를 컴파일하고 저장한 후 게임을 실행하면, 100이라는 점수가 출력되는 것을 확인할 수 있을 것입니다.
이처럼 함수를 사용하면 복잡한 작업을 하나의 블록으로 묶어 재사용하고, 블루프린트의 가독성과 유지보수성을 크게 향상시킬 수 있습니다.
AddScore 함수처럼 작은 예제도 입력, 내부 처리, 호출 위치를 분리해 생각하면 그래프가 길어져도 어떤 값을 넣고 어떤 상태가 바뀌는지 놓치지 않습니다.
- 함수 책임 배치
Define 함수 이름은 내부 노드를 보지 않아도 의도가 보이게 짓습니다. 좋음 AddScore, ApplyDamage, OpenDoor 모호한 함수명 DoThing, Update, Process처럼 범위가 넓은 이름
- 필요한 값만 받기
Inputs ScoreToAdd처럼 호출자가 결정해야 하는 값은 입력 핀으로 받고, 함수 내부 상태는 변수에서 읽습니다. 입력 호출마다 달라지는 값 내부 함수가 소유한 변수와 계산 흐름
- 언제 실행할지 연결하기
Call Event BeginPlay, 입력 이벤트, 충돌 이벤트 중 함수가 실행될 순간을 실행 핀으로 명확히 연결합니다. 순서 호출 전 준비값, 호출 후 출력 확인을 나눕니다. 검증 Print String으로 호출 횟수와 결과를 확인합니다.
이번 절에서는 블루프린트 함수를 정의하고 호출하는 기본적인 방법을 알아보았습니다.
함수는 블루프린트 로직을 체계적으로 관리하는 데 있어 핵심적인 도구입니다.
다음 절에서는 함수와 유사하지만 다른 특성을 가진 이벤트에 대해 좀 더 깊이 있게 다루겠습니다.
블루프린트 함수화는 노드를 줄이는 목적이 아니라 입력·출력 핀 계약, 부작용, 재사용 단위를 명확히 하는 설계 작업입니다.
- 재사용할 묶음인가
같은 노드 묶음이 여러 그래프에서 반복될 때 함수로 분리합니다. 반복 로직
- 핀 계약이 분명한가
필요한 값은 Input Pin으로 받고, 결과는 Return Value나 Output Pin으로 돌려줍니다. 숨은 의존성 제거
- 상태를 바꾸는가
계산만 하면 Pure, 변수 변경이나 Spawn, Save가 있으면 Impure로 표시합니다. Pure vs Impure
- 호출부 가독성
함수 이름과 핀 이름만으로 무엇을 하는지 읽혀야 합니다.
- 숨은 참조
전역 변수나 외부 액터 참조에 몰래 의존하면 재사용성이 떨어집니다.
- 너무 큰 함수
한 함수 안에 여러 책임이 섞이면 그래프만 숨긴 것이 됩니다.
함수를 언제 분리할지 판단하는 루프를 덧붙입니다.
같은 노드 묶음이 보여도 입력과 반환값을 말할 수 없으면 아직 함수 경계가 아니다.
| 질문 | 판정 |
|---|---|
| 반복 위치가 둘 이상인가? | 함수 후보. 한 번만 쓰면 먼저 그래프 안에서 이름을 다듬는다. |
| 호출자가 넘겨야 할 값이 분명한가? | 입력 핀으로 올리고 내부에서 외부 변수를 직접 찾지 않는다. |
| 결과가 다음 분기에 쓰이는가? | 반환값이나 성공 여부 핀을 둔다. |
| Delay나 여러 실행 갈래가 필요한가? | 함수보다 매크로 또는 이벤트 분리를 검토한다. |
| 신호 | 해석 |
|---|---|
| 좋은 함수명 | CalculateDamage, AddScore처럼 동작과 결과가 떠오른다. |
| 나쁜 분리 | 긴 그래프를 숨기기만 하고 입력·출력 의미가 없다. |
| 검수 문장 | “무엇을 넣으면 무엇을 돌려준다”로 읽히면 함수다. |
함수는 노드를 숨기는 용도가 아니라 반복되는 책임에 이름을 붙이고 입력과 출력을 명확히 하는 단위입니다.
함수를 만들 때는 그래프를 짧게 만드는 것보다 호출자가 알아야 할 값과 기대 결과를 먼저 고정한다.
- 함수 내부
입력 검증 ScoreToAdd처럼 외부에서 달라지는 값만 받는다. 한 가지 책임 점수 계산, 대미지 계산처럼 동작을 좁힌다. 상태 변경 Set 노드는 함수 안에 둘 때 부작용을 이름으로 드러낸다.
- 호출 위치
실행 시점 BeginPlay, Input, Overlap 중 언제 부르는지 보인다. 값 연결 상수, 변수, 이벤트 입력 중 무엇을 넘기는지 보인다. 결과 사용 반환값이 다음 Branch나 Print로 이어진다.
| 검수 | 의미 |
|---|---|
| 핵심 | 함수 이름, 입력 핀, 출력 핀을 함께 봐야 재사용 가능성이 보인다. |
| 경계 | 호출부가 내부 변수를 몰라도 쓸 수 있어야 한다. |