
UE5-3 C++ <새 프로젝트 생성/저장/불러오기>에서 말했듯이 언리얼 엔진에서 게임 기능을 만드는 방법은 C++와 BLUEPRINT 이렇게 두 가지가 존재한다
C++는 프로그래머가 직접 타이핑으로 코드를 작성해서 프로그래밍을 하는 방법이고,
블루프린트는 눈에 보이는 노드와 노드를 이어 기능의 흐름을 눈으로 보면서 만들어내는 비주얼 스크립팅이다
C++ 프로젝트를 위해서 생성 시 프로젝트 세팅을 C++를 선택한다 (필요가 없기에 시작용 콘텐츠는 해제한다)
프로젝트의 생성이 끝나고나면 제일 먼저 C++클래스를 생성해 보자
C++ 클래스를 생성하기 위해서는 상단 메뉴 바에서 [Tools > New C++ Class...]를 선택하면 된다
그러면 추가할 클래스의 부모 클래스를 선택할 수 있는 창이 뜨는데,
여기서 부모 클래스를 선택하면 우리가 만드는 클래스는 선택한 부모 클래스의 변수와 함수를 상속받아 사용할 수 있게 된다
여러 가지 클래스 중에서 먼저 Actor 클래스를 선택해보자 (액터 클래스란 레벨에 배치할 수 있는 오브젝트에 관한 클래스를 의미한다)
보통 레벨에 배치되어 동작할 오브젝트를 만들 때는 액터에 액터 클래스를 상속받아서 구현하면 된다
다음을 클릭하고 새 액터의 이름을 정한 뒤 클래스 생성버튼을 클릭한다
[여기서는 기본 클래스 이름인 MyActor로 진행을 해보자]
C++클래스를 생성하고 정상적으로 컴파일이 되었다면 콘텐츠 브라우저에서 자동으로 C++ Classes 폴더가 만들어진다
[참고로 C++클래스를 생성하고 언리얼엔진을 종료 후 다시 들어오면 C++ Classes 폴더가 보이지 않을 수 있는데, 그럴때는 컴파일을 한번 해 주면 폴더가 생기고 파일들을 볼 수 있다]
그리고 생성된 MyActor클래스에 대한 스크립트 에디터가 자동으로 열리는데, 여기서 헤더 파일(. h)과 소스 파일(. cpp)이 생겨난 것을 확인할 수 있다
이제 각각의 파일에 대해서 간단하게 설명해 보자면,
- 헤더파일(.h): 클래스를 선언하고, 클래스에 속하는 변수와 함수의 원형을 선언하는 용도의 파일. 함수의 내용은 없고, 세미콜론으로 함수가 끝남
- 소스파일(.cpp): 함수의 몸체를 구체적으로 구현하는 파일
그리고 액터 클래스를 처음 생성하고 헤더 파일에 보이는 C++ 클래스 공개범위에 대해서 알아보자
C++ 클래스 공개범위 (접근지정자)
- public: 이 클래스에 속한 변수를 클래스 외부에서 접근할 수 있게 모두에게 보여준다
- protected: 이 클래스를 상속받은 자식클래스에만 보여준다
- private: 이 클래스 내부에게만 보여준다
이 공개범위는 변수들 뿐만 아니라 함수에서도 똑같이 작용하고, 접근 지정자를 적어주면 콜론부터 다음 지정자가 등장할 때까지 해당 지정자의 공개범위를 가지게 된다
[변수나 함수를 public으로 지정하는 것만으로는 언리얼 에디터에서 공개되지 않기 때문에 에디터에서 수정할 수 없다]
그리고 액터 클래스에 기본으로 선언되어 있는 함수에 대해서도 알아보자
소스파일을 보면 생성자 함수(AMyActor), BeginPlay함수, Tick함수가 생성되어 있다
[상단의 탭에서 소스파일과 헤더파일을 전환할 수 있다]
- 생성자 함수: 클래스이름과 같은 이름을 가짐 -> 클래스의 객체가 생성될 때 한번 호출되는 함수 (앞으로 생성할 객체의 기본값을 설정해주는데 사용한다)
- BeginPlay 함수: 액터가 배치된 월드에서 게임이 시작되거나, 액터가 월드에 스폰되었들 때 한번 호출되는 함수 (게임플레이 로직을 초기화 시키는데 사용)
- Tick 함수: 액터가 활성화 되어있는 동안 매 프레임마다 한번 호출되는 함수 -> 매 프레임마다 액터의 위치를 옮겨서 마치 이동하는 것처럼 보이게 하거나, Tick과 Tick사이의 경과한 시간인 DeltaTime(매개변수)를 이용하여 다양한 기능을 제작할 수 있음[Tick함수가 필요하지 않다면 제거하여 게임의 퍼포먼스를 상승시킬 수도 있다]
이제 언리얼 C++클래스의 생성자와 기본 이벤트 함수들이 언제 호출되는지 확인하기 위해 간단한 로그를 남겨보자
언리얼에서 로그를 남기기 위해서는 'UE_LOG( )'라는 매크로 함수를 사용한다
첫 번째 매개변수에는 LogTemp, 두 번째 매개변수에는 Log, 세 번째 매개변수에는 출력할 문자열을 넣어주면 된다
[형태: UE_LOG(LogTemp, Log, TEXT(<출력할 문자열>));]
생성자에서는 "Constructor"라는 문자열을 출력하게 만들고, BeginPlay함수에서는 "BeginPlay"를, Tick함수에는 "Tick"을 출력하도록 작성한다
로그 출력 코드를 모두 작성하면 코드를 저장하고 변경한 코드의 내용이 언리얼 에디터에 적용될 수 있게 컴파일을 진행해야 한다
[주의: 꼭 Ctrl+Shift+'S' 단축키를 눌러 모두 저장을 한 후 컴파일을 진행해야 정상적으로 진행된다]
이때 컴파일하는 방법은 3가지가 존재한다
첫 번째: 콘솔 명령창에서 livecoding.compile 명령어를 입력
두 번째: 오른쪽 아래에 있는 컴파일 버튼
세 번째: [Ctrl + Alt + F11] 단축키 사용 (Visual Studio에서 이 단축키를 사용하면 자동으로 언리얼엔진이 열리며 컴파일된다)
컴파일이 정상적으로 진행되면 이렇게 라이브 코딩 창이 뜨면서 초록색으로 진행상황을 알려준다
변경된 코드의 내용이 에디터에 적용되고 나면 출력되는 로그를 보기 위해서 C++ Classes폴더에 본인이 생성했던 MyActor하나를 끌어 뷰포트 윈도우에 배치하고 플레이한다
(C++ 액터를 뷰포트에 끌어다 놓으면 형태를 지정하지 않아서 보이지는 않지만 Outliner에서는 배치되어 있는 것을 볼 수 있다)
그러면 게임이 시작하자마자 하단에 출력 로그 창에 빠르게 Tick로그가 출력되는 것을 볼 수 있는데 , 게임을 정지시키고 로그를 거슬러 올라가면
Play In Editor모드가 초기화될 때 MyActor의 생성자가 실행되어서 Constructor로그가 출력되고 PIE모드가 시작되면서 BeginPlay로그가 출력되고, 그 아래에는 매 프레임마다 Tick로그가 출력된 것을 확인할 수 있다
VR게임 개발을 위한 언리얼엔진/C++ 공부한 내용 끄적이기...
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!