UnrealEngine 공부 (Blueprint)

초보 게임개발자·2024년 12월 14일

UnrealEngine

목록 보기
4/19
    1. 14

UnrealEngine Blueprint란?

블루프린트는 언리얼에서 제공하는 비주얼 스크립팅 시스텝으로 코드 대신 블록형태로 생긴 노드 와 라인 을 연결하여 구조를 표현하고있으며 직관적인 인터페이스로 사용하기 쉽게 되어있고 프로그래밍 언어 없이도 여러 노드들을 서로 연결하고 관계를 정의 함으로써 게임을 프로그래밍 할 수 있게해주는 인터페이스 입니다.

블루프린트를 사용을 하려면

메인 툴바에 있는 블루프린트를 목록을 열어서 레벨 블루프린트 열기를 누르게 되면 아래 이미지와 같은 화면이 보이게 되는데요

왼쪽의 내 블루프린트 창에서는 다양한 변수, 함수에 접근 및 생성이 가능하고 디테일 패널에서는 현재 레벨 블루프린트의 상태를 확인 할 수 있습니다.

간단하게 알아보자면

* 그래프

일종의 구조도로 어떠한 상황이 벌어졌을 때, 어떠한 행동을 할지 구조로 표현한 것

EventGraph

어떠한 상황이 발생했을 때 어떠한 행동양식을 취할 것인지 정해주는 구조 (실질적으로
블루프린트 노드가 동작하는 구조는 이벤트 그래프 내에서 벌어진다고 생각하면 된다.)

Event BeginPlay : 이 레벨이 시작될 때 실행되는 블루프린트 노드의 상황

Beginplay는 레벨에 있다면, 레벨이 시작될 시 실행되는 상황입니다. 여기에 여러가지 노드를 연결해 실행할 수 있는데요, 노드의 생성은 오른쪽 클릭을 하면 생성할수 있고 기존 노드의 구멍에서 드래그앤 드롭을 통해 생성할 수도 있습니다.

Event Tick : 매 프레임 이벤트를 발생하며 프레임이 갱신될 때마다 실행되는 상황

* 함수

여러가지 행동을 하나의 행동으로 묶어주는 역할을 합니다.

* 매크로

어떠한 값이 들어왔을 때 그 값에 여러가지 처리를 해 다른 값으로 바꿔주는 역할을 수행합니다.

* 변수

프로그램에서 사용되는 저장 공간의 일종으로 우리가 새로운 값을 할당해 사용할수 있습니다. 게임에서는 다양한 데이터를 담기 위해 사용되며 스탯, 아이템의 이름과 개수 등에 사용이 된다.

변수 안을 살펴 보면 여러가지 자료형들을 볼 수 있으며 간단하게 설명을 하면

  • 부울(Bool) : 참과 거짓 두가지를 판별하는 데 사용
  • 인티저(int) : 정수이며 정수란 자연수 1,2 -1,0 등을 포함하는 개념
  • 플로트(Float) : 인티저 처럼 정수를 포함 할 수 있는데 소수로 표현이 되는 친구
  • 스트링(String) : 문자열열 뜻하며 문자는 가, 나, 다 처럼 한 글자씩을 의미하는데 이러한 문자가 1개 이상의 문자가 있는것을 문자열이라고 생각하면 됩니다.
  • 백터(Vector) : 백터를 저장하는 자료형 (블루프린트에서는 Float 3개로 구성되어
    X, Y, Z에 하나하나 넣어줄 수 있는 자료형이라 생각하면 됩니다.)

* 이벤트 디스패쳐

우리가 만들어준 상황에 따른 행동을 연결해 주는 것


실습

이번에는 직접 블루프린터를 사용해서 프로그래밍을 연습해 보겠습니다.

Event BeginPlay


Event BeginPlay에서 노드를 끌어다 놓으면 필요한 노드창을 꺼내 쓸 수가 있으며 빈 창에 우클릭를 해도 됩니다.

문자열을 내보내주는 Print String 노드를 꺼내서 원하는 문구를 적어준뒤 Event BeginPlay 에 노드를 연결하고

컴파일(컴퓨터가 이해할 수 있도록 노드를 해석해주는 버튼)을 눌러 변환을 해준뒤 저장을 눌러 저장을 해준뒤 레벨 창으로 나가서 실행 버튼을 누르게 되면

화면 상단에 적어놓은 문구가 출력이 되는걸 볼 수 있습니다.

추가적으로 노드를 더 연결 시켜서 출력을 해봤는데 Event BeginPlay에 먼저 연결된 순으로 순차적으로 출력이 되는걸 확인 할 수 있었습니다.

그리고 PrintString 에서 계속 보여지는 개발 전용 이라는 문구는 실제 게임에서는 보여지지 않고 개발 할 때만 볼 수 있다는 뜻입니다.


변수

이번에는 변수를 한번 내보내 보도록 하겠습니다.

변수 창에서 인티저(정수) 를 꺼내 보면 다음과 같은 문구가 보이는데
Set Var1 은 Var1을 몇으로 바꿔주겠다 라는 의미이며
Get Var1 은 Var1을 가져다 쓰겠다 라는 뜻입니다.

정수를 5로 설정해두고 다음과 같이 연결해 주면 입력한 값이 출려기 되지 않는데 그 이유는 PrintString이 String자료형만 받기 때문에 출력이 되지 않아서 이 것을 해결하기 위해서 Var1의 형 변환이 필요합니다.

GetVar1에서 선을 끌어다 To String을 새로 만들어 PrintString에 연결해 주면
정수값이 문자열로 변해 그 문자열이 출력할수 있게 변환해주게 되면서 5라는 정수값이 출력이 됩니다.


함수

다음은 함수를 사용해서 실습을 해봤는데요

함수에 보면 오버라이드라는 항목이 보이는데 이는 기존에 정의되어있는 함수들이 있는데 그것을 덮어씌우거나 추가하는 역할을 수행합니다.
그렇기 때문에 오버라이드에는 다양한 여러가지 상황이 주어져있는걸 볼 수 가있습니다.

함수 추가 버튼을 눌러 함수를 추가해주고



PrintString를 꺼내서 노드를 연결해준뒤 EventGraph로 돌아가서 생성한 함수를 불러 노드를 연결 시키게되면 EventGraph에 있는 Event BeginPlay를 통해 NewFunction이 호출되고, 만들어놓은 함수 리스트에 있는 함수가 실행되게 됩니다.

이처럼 여러가지 행동약식을 하나로 묶어주는 것이 함수이고 함수는 긴히 지정될 수 있으며 덮어씌우거나 하는 것도 가능하다라는걸 알게되었습니다.


흐름제어

마지막으로 프로그래밍에서 가장 핵심적인 부분인 흐름제어 노드에대해서 실습해 보겠습니다.

    1. Sequence노드

      Sequence노드는 단순히 0번에 입력된 행동들이 끝나면 1,2등 다음 순번의 입력된 행동들을 실행하는 노드입니다.
      지금까지 위에서는 1,2,3을 순차적으로 실행하기위해 가로로 연결해줬지만 Sequence노드를 사용해 아래와같이 한눈에 보기 쉽게 설정이 가능합니다.

    1. While Loop 노드

      While Loop는 부울 변수가 필요하며 Condition이 참인 동안은 Loopbody를 실행시키고 거짓이 되면 Completed를 실행시킵니다. 이때 LoopBody에서 Condition을 변경 시켜도 해당 진행까지는 완료 된 후 Completed가 실행되니 참고 하시길 바랍니다.

      이렇게 연결했을 때 Loopbody에서 빠져 나올수가 없기 때문에 이를 제어해주는 Branch노드를 연결시켜 줍니다.

      예를 들어 정수가 3이되게 되면 3보다 작지 않기 때문에 False로 넘어가 루프를 끊어
      0일때 1번 1일때 1번 2일때 1번 씩 출력되고 3일때는 끝이라는 문구가 출력되는걸 확인 할 수 있었습니다.

    1. Branch 노드

      Condition에 들어 간 변수가 참이면 True를 거짓이면 False를 실행시키는 노드
    1. For Loop 노드

      ForLoop노드는 Firstindex의 숫자에서 Lastindex의 숫자까지 도달할 떄까지
      반복하는 반복문입니다.


      3에 도달 해서 Hello 라는 문구가 출력 되는 모습입니다.
    1. ForLoopWithBreak

      While,For,ForEach 루프들을 반복문 이라고 부르는데요. 이러한 반복문 노드 들을 중간에 멈추고 싶을 때 사용하는 것이 바로 ~WithBreak 노드인데
      WithBreak가 붙은 노드 들은 Break라는 핀이 있는데 이곳에 연결이 되면, 바로 Completed를 실행시킨다는 특징이 있습니다.


      브레이크를 활성화 안했을 때 는 0~3까지 반복을 하고 Hello라는 문구 까지 나오는 걸 볼 수 있는데요 중간에 브레이크를 걸게 되면


      index가 2가 되면 이 함수를 멈춰 달라고 했기 때문에 3까지 안나오고 멈춘거 볼 수 있습니다.
    1. For Each Loop 노드

      ForEachLoop노드는 배열에 입력을 받아, 그 배열의 내부 변수 개수만큼 실행하는 For문이라고 생각해주시면 됩니다.

      여기서 Index는 앞의 번호이며 Element는 체크한 값들입니다. 따라서 0, 2, 4 가 참이라는 값을 설정해 두고 참일 경우에만 출력을 하게 끔 노드를 구성했습니다.

변수 비교 및 매크로

비교 노드에는 <, <=, >, >=, ==(같다), !=(같지않다)등을 입력해 비교해 참, 거짓을 판별하는 Bool형으로 나타낼 수 있습니다.


인티저 a,b를 비교해 봤습니다.

다음은 매크로를 알아봤는데요

매크로

매크로는 입력, 츨력을 설정하여 여럭 값들을 한번에 입력 받아 여러 값 으로 나타나게 하거나, 하나의 값을 입력 받아 여러 개 혹은 여러 개를 입력 받아 하나의 출력 값으로 나타나게 하는 노드를 생성할 수 있습니다.

다음과 같이 매크로를 하나 만들어준다음 Inputs, Outputs을 설정 해준뒤
a가b보다 크면 출력이 되는 거랑 b가c보다 크면 출력이 되면 출력이 되는 노드를 매크로로 만들어 줍니다.

그리고 EventGraph로 나와서 매크로를 끌어다 놓으면 다음과 같이 위에서 매크로로 만든 노드가 생성이 된걸 확인 할 수있습니다.

사칙연산 노드는 Add(+), Subtract(-), Multiply(X), Divide(%)로 네 종류가 있습니다.

다음으로는 정수를 문자열로 변환을 시킬 때 정수를 문자열로 변환하는 것은 toString 노드를 사용하여 변환을 시켜주는게 가능한데 Ex) 정수 300을 문자열 300으로 변환하면, 이는 3, 0, 0으로 구성된 문자들의 집합인 문자열이 되는데 이때, 정수 300과 문자열300은 다른것입니다. 정수 300은 그 수치 자체를 의미하고, 문자열 300은 문자들의 구성인 문자열이기 때문입니다. 그러나 블루프린트노트에서는 같은 것으로 인식이되만 권장하지는 않는다고 합니다. 문자열을 숫자로 변환하는 매크로 혹은 함수를 통해 비교하거나, 숫자를 문자열로 바꾸어 비교하는 방법을 추천합니다.


toString은 단순히 받은 입력값을 문자열로 변환시켜주는 역할을 합니다.


위에서 했던 말을 쉽게 설명하면 A가300이라고 할 때 위에 인티저는 그 값 자체인 300을 뜻하고 밑에 인티저는 정수를 문자열로 변환 시킨거라 3,0,0이 되면서 형태가 달라 둘은 다른것으로 생각하면되는데 블루프린트노트에서는 같은 형태로 인식을 한다라고만 생각하면 된다.

블루프린트를쓸때 지양해야 하는 점이 있는데 연속해서 toString을 쓰지 않는것 입니다. 결과 값은 같지만 구조를 한눈에 파악하기 어려워서 입니다.


위 처럼 노드를 설정하면 B가 50이 출력될지 40이 출력될지 알아보기 힘들다.


따라서 위에처럼 toString을 하나 더 달아줘서 좀더 바로 보기쉽게 짜주는걸 지향한다.

profile
기록은 기억을 지배한다!

0개의 댓글