개발단에 가입하여 베르의 게임 개발 유튜브를 후원해주세요! https://www.youtube.com/channel/UC9j37A2ACL9ooSbsT4mtGww/join

 

안녕하세요! 여러분들과 함께 게임 개발을 공부하는 베르입니다!

이번에는 언리얼 프로그래밍에 입문하기 위해 기본적인 내용과 C++ 클래스 생성 방법, 그리고 언리얼 액터의 가장 기본이 되는 이벤트에 대해서 알아보겠습니다.

 

사용 엔진 버전 : 5.0.1

 

타임라인

0:00 인트로

0:29 개요

1:37 언리얼 C++ 프로젝트 생성

2:35 C++ 클래스 생성

3:53 생성한 C++ 클래스 살펴보기

5:59 기본 이벤트 함수 호출 확인

7:59 아웃트로

 

[투네이션 후원]

https://toon.at/donate/637735212761460238

 

[디스코드 채널]

https://discord.gg/tqmRTy4pgk

 

스크립트

인트로

안녕하세요. 여러분들과 함께 게임 개발을 공부하는 베르입니다.

이번 영상에서는 언리얼 엔진 5에서 프로그래밍 하는 방법에 대한 기초를 배워보겠습니다.

이번 영상의 내용은 전반적으로 지난 언리얼 엔진 4 프로그래밍 입문 영상과 대부분 같은 내용입니다.

그럼에도 언리얼 엔진 5 버전으로 다시 만드는 이유는 언리얼 엔진 5에 입문하는데 언리얼 엔진 4 강좌를 보면서 하기에는 세부적인 부분에서는 조금씩 달라진 부분이 있기 때문입니다.

그럼 이제 언리얼 엔진 5 프로그래밍을 배워보도록 하겠습니다.

개요

먼저 언리얼 엔진에서의 프로그래밍은 게임의 기능을 만드는 것을 의미합니다.

캐릭터가 어떻게 조작되어 움직이고, 어떤 규칙으로 목적을 달성해야 게임에서 승리하게 되는지 등 이런 전반적인 것을 프로그래밍 언어나 다른 여러 가지 방법으로 만드는 것입니다.

먼저 언리얼 엔진에서 게임 기능을 만드는 방법은 C++와 블루프린트, 이렇게 두 가지가 있습니다.

C++는 프로그래머가 직접 타이핑으로 코드를 작성해서 프로그래밍을 하는 방법이고, 블루프린트는 눈에 보이는 노드와 노드를 이어 기능의 흐름을 눈으로 보면서 만들어내는 비주얼 스크립팅입니다.

C++ 클래스로만 게임을 제작하거나 블루프린트 클래스만을 이용해서 게임을 제작하는 것도 충분히 가능하지만, 이 두 방법을 완전히 따로 사용하는 것보다는 프로그래머가 C++로 베이스가 되는 게임 기능을 만들고, 디자이너가 블루프린트를 이용해서 그 기본 게임 기능을 가지고 게임의 재미를 위한 기능들을 제작하는 방식으로 함께 사용할 때 시너지 효과를 발휘합니다.

앞으로 C++ 클래스와 블루프린트 클래스를 넘나들면서 언리얼 엔진에서 게임 기능을 만드는 방법을 배우게 될 겁니다.

참고로 언리얼 C++ 프로그래밍을 배우기 위해서는 먼저 C++나 다른 프로그래밍 언어를 어느 정도 익숙한 수준으로 다룰 줄 아는 편이 좋지만 이런 부분까지 포함해서 하나씩 배워나가 봅시다.

C++ 프로젝트 생성

그럼 제일 먼저 언리얼 엔진에서 C++ 프로젝트를 만드는 방법을 배워봅시다.

우선 언리얼 엔진을 실행하겠습니다.

그리고 새 프로젝트의 카테고리를 게임으로 선택합니다.

그 다음 템플릿에서는 여러 가지 게임 장르의 기반이 되는 다양한 템플릿을 볼 수 있는데 지금은 완전히 빈 프로젝트를 생성하는 기본 템플릿을 선택하겠습니다.

프로젝트 디폴트 세팅에서는 프로젝트 타입과 퀄리티, 타깃 플랫폼, 시작용 콘텐츠 포함 여부 등을 선택할 수 있는데 여기서 중요한 부분은 프로젝트 타입입니다.

기본으로 블루프린트가 선택되어 있는데 우리는 여기서 C++를 선택해야 합니다.

만약 여기서 블루프린트를 선택하고 프로젝트를 생성하면 해당 프로젝트에서는 C++ 클래스를 생성하지 못하고 블루프린트만을 이용해서 게임을 제작해야 합니다.

우리는 언리얼 C++ 프로그래밍을 배우면서 블루프린트를 함께 다룰 계획이기 때문에 C++를 선택하겠습니다.

그리고 프로젝트 이름을 입력하고 프로젝트를 생성합니다.

C++ 클래스 생성

프로젝트의 생성이 끝나고 나면 제일 먼저 C++ 클래스를 생성하는 방법을 배워보겠습니다.

새로운 C++ 클래스를 생성하는 방법은 여러 가지가 있습니다.

첫 번째 방법은 상단 메뉴 바에서 [툴 > 새로운 C++ 클래스] 항목을 선택하는 것이고 두 번째 방법은 콘텐츠 브라우저에서 C++ 클래스 폴더를 선택하고 추가 버튼을 누르거나 콘텐츠 브라우저의 빈 영역에 우클릭해서 새 C++ 클래스 항목을 선택하는 것입니다.

그렇게하면 추가할 클래스의 부모 클래스를 선택할 수 있는 창이 뜹니다.

여기서 부모 클래스를 선택하면 우리가 만드는 클래스는 선택한 부모 클래스의 변수와 함수를 상속받아 사용할 수 있게 됩니다.

언리얼 엔진에서 미리 구현해둔 여러 클래스들이 보이는데 일단 이중에서 Actor를 선택하도록 하겠습니다.

액터 클래스는 레벨에 배치할 수 있는 오브젝트를 의미합니다.

보통 레벨에 배치되어 동작할 오브젝트를 만들 때는 이 액터 클래스를 상속받아서 클래스를 구현하면 됩니다.

다음을 클릭하고 새 액터의 이름을 정한 뒤 클래스 생성 버튼을 클릭해주면 됩니다.

지금은 그냥 MyActor라는 이름 그대로 클래스를 생성하겠습니다.

생성한 C++ 클래스 살펴보기

C++ 클래스의 생성이 끝나고 나면 콘텐츠 브라우저의 소스 패널을 열고 [C++ 클래스 > (프로젝트 이름)]의 폴더를 열어보면 방금 생성한 MyActor 클래스가 보입니다.

그리고 이 MyActor 클래스를 스크립트 에디터에서 보면 MyActor 클래스에 대한 헤더 파일(.h)과 소스 파일(.cpp)이 생겨난 것을 확인할 수 있습니다.

이미 C++에 대해서 공부한 분들이라면 알고 있겠지만 모르는 분들을 위해서 설명하자면 헤더 파일은 클래스를 선언하고, 클래스에 속하는 변수와 함수의 원형을 선언하는 용도의 파일입니다.

헤더 파일의 클래스에서는 함수의 원래 형태만 알려주는 것이기 때문에 이렇게 함수의 내용은 없고 세미콜론으로 함수가 끝나는 것을 볼 수 있습니다.

이 함수의 몸체는 이렇게 소스 파일에서 구현됩니다.

처음 만들어진 액터 클래스에는 이렇게 클래스 이름과 같은 이름을 가진 생성자, BeginPlay 함수, Tick 함수가 생성되어 있습니다.

우선 클래스 이름과 같은 이름을 가진 생성자는 클래스의 객체가 생성될 때 한 번 호출되는 함수이며 주로 생성된 액터의 프로퍼티, 즉 변수의 기본 값을 설정해주는데 사용됩니다.

BeginPlay 함수는 액터가 배치된 월드에서 게임이 시작되거나 액터가 월드에 스폰되었을 때 한 번 호출되는 함수로 게임플레이 로직을 초기화시키는 데 사용됩니다.

그리고 Tick 함수는 매 프레임마다 한 번씩 호출되는 함수입니다.

이 Tick 함수에서는 매개변수인 DeltaTime을 통해서 Tick 함수가 지난 번에 호출된 이 후로 얼마의 시간이 경과한 뒤에 다시 Tick 함수가 호출되었는지에 대한 시간을 전달받을 수 있습니다.

그리고 이 Tick 함수는 Actor가 활성화되어 있는 동안 계속해서 호출되기 때문에 주로 게임의 로직을 처리하는 기능을 구현하는데 사용됩니다.

하지만 지금 만드는 클래스에 매 프레임 호출되는 Tick 함수가 필요하지 않다면 Tick 함수를 제거해서 게임의 퍼포먼스를 상승시킬 수도 있습니다.

Actor의 틱 함수를 비활성화하기 위해서는 헤더 파일과 소스 파일에서 Tick 함수를 제거하고 소스 파일의 생성자에서 PrimaryActorTick.bCanEverTick = true 코드를 제거해주면 됩니다.

이 코드는 이 Actor가 Tick 함수를 매 프레임 호출하도록 설정하는 코드입니다.

처음 생성한 C++ 클래스는 이렇게 생성자, BeginPlay 이벤트 함수, Tick 이벤트 함수를 가진 채로 생성됩니다.

이제 여기서 어떤 변수와 함수를 만들어 나가느냐에 따라서 클래스의 기능이 결정될 겁니다.

이벤트 함수 호출 확인

그럼 마지막으로 언리얼 C++ 클래스의 생성자와 기본 이벤트 함수들이 언제 호출되는지 확인해보기 위해서 간단한 로그를 남겨봅시다.

언리얼에서 로그를 남기기 위해서는 UE_LOG라는 매크로 함수를 사용합니다.

첫 번째 매개변수에는 LogTemp, 두 번째 매개변수에는 Log, 세 번째 매개변수에는 출력할 문자열을 넣어주면 됩니다.

생성자에서는 "Constructor"라는 문자열을 출력하게 만들고 BeginPlay 이벤트 함수에서는 "BeginPlay"를, Tick 이벤트 함수에서는 "Tick"이라는 문자열을 출력하게 코드를 작성합니다.

로그 출력 코드를 모두 작성하면 코드를 저장하고 변경한 코드의 내용이 언리얼 에디터에 적용될 수 있게 컴파일을 진행해야 합니다.

언리얼 엔진 4에서는 메인 툴바에 컴파일 버튼이 있었지만 언리얼 엔진 5부터는 컴파일 버튼이 사라지게 되었습니다.

언리얼 에디터를 종료하지 않고 컴파일 하기 위해서는 콘솔 명령창에서 LiveCoding.Compile 명령어를 입력하거나 [Ctrl + Alt + F11] 단축키를 눌러 라이브 코딩 기능을 사용해야 합니다.

라이브 코딩 기능으로 컴파일을 진행하면 이렇게 라이브 코딩 창이 뜨면서 진행상황을 알려줍니다.

가끔 컴파일 후에도 바로 변경사항이 적용되지 않을 때가 있는데 그럴 때는 언리얼 에디터를 종료하고 비주얼 스튜디오의 상단 메뉴 바에서 [Build > Rebuild Solution] 항목을 선택해서 프로젝트를 다시 빌드하고 실행하면 됩니다.

변경된 코드의 내용이 에디터에 적용되고 나면 출력되는 로그를 보기 위해서 하단 툴바의 출력 로그 버튼을 눌러 출력 로그 패널을 열고 [레이아웃에 고정] 버튼을 눌러 줍니다.

그 다음에는 MyActor 하나를 씬에 배치하고 게임을 플레이 시킵니다.

그러면 게임이 시작되자마자 빠르게 Tick로그가 출력되는 것을 볼 수 있는데 게임을 일시정지시키고 로그를 거슬러 올라가면 Play In Editor 모드가 초기화될 때 MyActor의 생성자가 실행되어서 Constructor 로그가 출력되고 PIE 모드가 시작되면서 BeginPlay 로그가 출력된 것을 볼 수 있습니다.

그리고 그 아래로는 매 프레임 Tick 로그가 출력된 것을 확인할 수 있습니다.

아웃트로

이렇게 이번 영상에서는 언리얼 엔진 5 C++ 프로그래밍에 입문하기 위한 대략적인 내용과 C++ 클래스를 생성하는 방법 그리고 C++ 클래스의 생성자와 언리얼 엔진의 기본 이벤트 함수인 BeginPlay와 Tick의 동작에 대해서 알아보았습니다.

이제 이 다음 영상에서는 C++ 클래스의 변수와 함수 등 좀 더 깊은 내용에 대해서 배우게 될 겁니다.

이 강좌는 시청자 여러분들의 시청과 후원으로 제작되었습니다.

이상 베르의 게임 개발 유튜브였습니다. 감사합니다.

 

반응형

+ Recent posts