함수

다른 그래프에서 실행, 호출할 수 있는 노드 그래프입니다.

Windows
MacOS
Linux

Function (함수)는 Blueprint 내 다른 그래프에서 실행 또는 호출 가능한 특정 Blueprint 에 속하는 노드 그래프입니다. 함수에는 하나의 입력부가 있는데, 실행 출력 핀이 하나 있는 함수 이름으로 된 노드로 표시됩니다. 이 함수가 다른 그래프에서 호출되면, 그 출력 실행 핀을 활성화시켜 연결된 네트워크가 실행되도록 합니다.

레퍼런스 및 사용법 정보는 델리게이트 문서를 참고하세요.

접근 지정자

함수를 만들 때, 다른 오브젝트가 해당 함수에 접근할 수 있을지 없을지 지정할 수가 있습니다. 함수를 선택하고 디테일 패널에서 설정할 수 있는 Access Specifier (접근 지정자) 프로퍼티를 통해 가능합니다.

AccessSpecifier.png

이 프로퍼티에는 다음과 같은 세팅이 들어있습니다:

세팅

설명

Public

다른 모든 오브젝트가 이 함수를 호출할 수 있습니다. 기본 세팅입니다.

Protected

이 함수는 현재 블루프린트와 여기서 파생된 블루프린트에서만 호출 가능합니다.

Private

이 함수는 현재 블루프린트에서만 호출 가능합니다.

Pure vs. Impure

함수는 Pure (순수하)거나 Impure (비순수) 중 하나입니다. 주요 차이점이라면 순수 함수는 어떤 식으로든 클래스의 멤버나 상태를 변경하지 않기로 약속한 반면, 비순수 함수는 자유롭게 상태를 변경할 수 있습니다. 순수 함수는 일반적으로 값을 구해오거나 데이터 값을 출력하기만 하는 작업에 사용됩니다.

비순수 함수는 EventGraph 에서 실행 핀을 Function Call 노드 에 연결하여 명시적으로 실행해야 합니다. 비순수 함수는 다음 방법 중 하나를 사용하도록 디자인되었습니다:

  • 코드에 정의된 UFUNCTION 에 대한 UFUNCTION 선언에서 BlueprintCallable 키워드를 지정합니다.

  • 블루프린트 에디터 를 통해 추가된 함수의 경우 Pure 박스의 체크를 해제시켜 둡니다.

순수 함수는 데이터 핀으로 연결되며, 그에 관련된 데이터가 필요할 때 컴파일러가 자동으로 실행해 줍니다. 즉 순수 함수는 연결된 노드마다 한 번씩 호출된다 는 뜻입니다. 순수 함수는 다음 방법 중 하나를 사용하도록 디자인되었습니다:

  • 코드에 정의된 함수들에 대한 함수 선언에서 BlueprintPure 키워드를 지정합니다.

  • 블루프린트 에디터 를 통해 추가된 함수의 경우 Pure 박스를 체크합니다.

함수 만들기

블루프린트 안에서

블루프린트 클래스 또는 레벨 블루프린트 안에서 함수를 만들려면:

  1. 내 블루프린트 탭에서 myblueprint_function.png 함수 목록 제목줄의 plus_Button.png 추가 버튼 을 클릭하여 새 함수를 만들 수 있습니다.

  2. 새 함수의 이름을 지어줍니다.

    name_function_blueprint.png

새 함수가 블루프린트 에디터의 그래프 에디터 탭에 있는 새 탭에 열립니다.

내 블루프린트 탭에서 우클릭한 다음 함수 를 선택하여 만들 수도 있습니다.

add_function_rtclick.png

블루프린트 인터페이스에서

블루프린트 인터페이스 에서 생성된 함수블루프린트 클래스레벨 블루프린트 에서 함수 를 생성할 때와 같은 방법으로 생성되나, 구현이 매우 다릅니다.

블루프린트 인터페이스 안에서 함수를 만들려면:

  1. 내 블루프린트 탭에서 myblueprint_function.png 함수 목록 제목줄의 plus_Button.png 추가 버튼 을 클릭하여 새 함수를 만들 수 있습니다.

  2. 새 함수의 이름을 지어줍니다.

    name_function_interface.png

새 함수가 블루프린트 에디터의 그래프 에디터 탭 내 새 탭에 열립니다.

내 블루프린트 탭에 우클릭한 다음 함수 를 선택하여 함수를 만들 수도 있습니다.

interface_function_rtclick.png

레퍼런스 및 사용법 정보는 게임플레이 타이머 문서를 참고하세요.

함수 편집하기

함수가 생성되고 나면 그 함수성을 정의해 줄 필요가 있습니다. 그 과정은 두 단계로 이루어집니다:

  • 필요한 입력과 출력 파라미터 생성.

  • 입력과 출력 사이에 노드 네트워크를 만들어 함수 행위 정의.

디테일 탭에서는 설명, 카테고리, 접근 지정자, 함수가 Pure 인지 아닌지를 설정할 수 있습니다.

함수의 디테일 탭을 여는 방법은:

  • 내 블루프린트 탭에서 함수를 선택하거나,

  • 함수가 호출되고 있는 그래프에서 함수 노드를 선택하거나,

  • 함수의 그래프에서 함수 입구 (또는 출구) 노드를 선택하면 됩니다.

selected_function_myblueprint.png

입력과 출력 파라미터

함수의 디테일 탭에서는 입출력 파라미터도 설정할 수 있습니다.

입출력 파라미터를 추가하려면:

  1. 디테일 탭의 입력 또는 출력 섹션 중 하나에서 버튼을 클릭합니다.

  2. 새 파라미터의 이름을 짓고 드롭다운 메뉴를 사용해서 유형을 설정합니다. 이 예제에서는 두 개의 벡터 데이터 입력 VectorAVectorB, 그리고 플로트 데이터 출력 Distance 가 있습니다.

    function_details.png

    블루프린트 매크로 라이브러리 와는 달리, 함수에는 데이터 입력과 출력만 추가할 수 있습니다.

    함수 그래프의 입구와 출구 노드가 올바른 핀으로 자동 업데이트됩니다. 다른 펑션 콜 노드와 마찬가지입니다.

    function_tunnel_with_pins.png

    function_call_with_pins.png

  3. 파라미터에 대한 항목을 펼쳐 기본값을 설정할 수도 있고, 값을 참조 전달할 것인지도 선택할 수 있습니다.

    function_details_expanded.png

노드 양단에서 이 파라미터에 대한 핀의 위치를 변경하려면, 펼친 디테일 탭 항목에서 위아래 화살표를 사용하면 됩니다.

이제 함수에 함수성을 정의할 준비가 다 됐습니다. 입구와 출구 노드 사이에 노드 망을 만들어 주면 됩니다.

함수성 정의하기

함수의 정의는 입력과 출력 노드 사이를 잇는 블루프린트 그래프를 만드는 것으로 가능합니다. 이번 예제에서는 3D 공간의 두 점 사이 거리를 반환하는 (아래 그림의) 3D 버전 피타고라스의 정리를 적용하는 데 필요한 네트워크를 만들어 보겠습니다.

dx = (x2-x1)^2
dy = (y2-y1)^2
dz = (z2-z1)^2

D = sqrt(dx+dy+dz)

블루프린트의 노드 망으로 변환했습니다...

이미지를 클릭하면 원래 크기로 보입니다.

함수 호출하기

함수를 생성 및 정의하고난 후, 이벤트 그래프에서 호출할 차례입니다. 함수를 호출하는 노드를 만들려면:

  • 내 블루프린트 탭에서 함수를 끌어 이벤트 그래프 내 빈 곳에 놓습니다.

  • 이벤트 그래프에 우클릭하거나 적합한 실행 / 데이터 핀에 끌어 놓아 컨텍스트 메뉴를 엽니다. 컨텍스트 메뉴에서 우리 함수를 검색한 다음 선택하여 Function Call 노드를 추가합니다.

아래 망은 벡터 변수 둘을 받은 다음, 매 틱마다 그 사이의 거리를 계산하여 화면에 출력합니다.

EventGraph.png

이 예제에서는 퍼블릭 벡터 변수를 두 개 만들었습니다. 각각에 대한 세팅에서 Show 3D Widget (3D 위젯 표시)를 True 로 설정했습니다. 이제 블루프린트 를 레벨에 추가하고 나면 Point A 와 Point B 로 정의된 위치에 3D 위젯이 나타날 것입니다. 3D 위젯으로 Point APoint B 를 뷰포트에서 움직여 그 값을 쉽게 바꿀 수 있습니다.

Points1And2Viewport.png

이제 맵을 테스트해 보면, 두 점 사이의 거리가 매 틱마다 출력되어, 함수가 정상 작동중임을 알 수 있습니다.

WithBPEditorClosed.png

외부 블루프린트에서 함수 호출하기

한 블루프린트 안에서 다른 블루프린트의 함수 를 호출할 수도 있는데, 호출하고자 하는 함수가 들어있는 블루프린트로의 레퍼런스가 있어야 합니다.

아래의 경우를 예로 들면, (MyCharacter 라는) 캐릭터 블루프린트에 Take Damage 라는 함수가 있어, 호출할 때마다 PlayerHealth 라는 변수를 10 씩 깎습니다.

PlayerHealthFunction.png

MyCharacter 블루프린트에서 플레이어가 무기를 발사하면 스폰되는 프로젝타일인 다른 블루프린트에, 프로젝타일이 무언가에 맞으면 어떤 일이 벌어지는지에 대한 스크립트가 있습니다.

DefaultProjectile.png

블루프린트 일인칭 템플릿 프로젝트 에 포함된 기본 MyProjectile 블루프린트 스크립트는 이미 무언가에 맞으면 물리 시뮬레이션을 하고 맞은 위치에 충격을 가하는 등 무언가를 하고 있습니다. 맞은 것이 플레이어인지 검사해서 그렇다면, Take Damage 함수를 호출하고 싶다 칩시다.

Event HitOther 핀을 끌어 놓은 다음 MyCharacter 블루프린트로 Cast To 하면 그렇게 할 수 있습니다.

CastToMyCharacter.png

그렇게 하고 나면, 플레이어 캐릭터로의 레퍼런스가 생기므로 As My Character 핀을 끌어 놓은 다음 그 블루프린트에 있는 Take Damage 함수를 호출할 수 있습니다.

CallFunction.png

플레이어에 맞은 이후 프로젝타일을 소멸시키는 나머지 스크립트는 다음과 같이 연결해 주면 됩니다:

FullProjectileScript.png

그리고 에디터에서 플레이해 보면, 아래와 같은 것을 볼 수 있습니다.

PlayerHealth 변수를 PrintString 노드에 연결하여 현재 값을 표시할 수 있도록 했습니다. 기본적으로 100 으로 설정되어 있으며, 플레이어가 벽에 쏜 것이 튕겨 플레이어에 맞을 때마다 Take Damage 함수가 호출되어 PlayerHealth 변수가 10 씩 감소되는 것을 볼 수 있습니다.

함수 문제해결

펑션 콜 노드 위에 "[함수명]으로 된 함수를 찾을 수 없습니다" 라는 메시지와 함께 경고! 바가 표시되면, 블루프린트컴파일 하세요.

function_warning.png

함수의 입력 및 출력 파라미터 수를 바꾸는 경우에도 블루프린트컴파일 해 줘야 합니다.

태그
Select Skin
Light
Dark

새로운 언리얼 엔진 4 문서 사이트에 오신 것을 환영합니다!

문서 사이트에 대한 의견을 모을 수 있는 피드백 시스템을 포함해서 여러가지 새로운 기능을 준비하고 있습니다. 아래 Documentation Feedback 포럼(영문) 또는 언리얼 엔진 네이버 공식 카페(한글) 중 편하신 곳에 의견이나 문제점을 알려 주세요.

새 시스템이 준비되면 알려 드리겠습니다.

네이버 카페
공식 포럼