2021년 6월 9일 수요일

심심할때 따라해보는 언리얼엔진 게임 개발하기

이 글은 심심할때 따라해보는 언리얼엔진 게임 개발 방법에 대한 이야기이다. 최근 유행하는 메타버스는 언리얼엔진, 유니티와 같은 게임엔진으로 손쉽게 개발할 수 있다.

머리말
Unreal Engine 5는 2D모바일 게임에서 콘솔 타이틀까지 모든 것을 제작할 수 있다. 

언리얼 엔진 5로 개발하는 것은 초보자에게 매우 간단한다. 블루 프린트 비주얼 스크립팅 시스템을 사용하면 한 줄의 코드를 작성하지 않고도 게임을 만들 수 있다. 

언리얼 엔진는 설치를 위해 Epic Games Launcher를 사용한다. 런처를 다운로드하려면 먼저 계정을 만들어야한다. 계정을 만든 후 운영 체제에 맞는 런처를 다운로드하라.
기본 선택 항목은 시작용 콘텐츠, 템플릿, 기능팩 및 엔진 소스이다. 체크된 상태로 두는 것이 좋다. 

프로젝트 시작
시작 버튼 중 하나를 클릭하여 프로젝트 브라우저를 연다. C++ 유형을 선택하고 빈 템플릿을 선택한다. 프로젝트를 생성하면 편집기가 열린다. 편집기는 여러 패널로 분할된다.

콘텐츠 브라우저: 이 패널은 모든 프로젝트 파일을 표시한다. 이를 사용하여 폴더를 만들고 파일을 구성한다. 검색 창이나 필터를 사용하여 파일을 검색 할 수 있다.
  • 모드: 이 패널을 사용하면 Landscape Tool 및 Foliage Tool 과 같은 도구를 선택할 수 있다. 
  • 배치 도구: 조명 및 카메라와 같은 다양한 유형의 오브젝트를 레벨에 배치 할 수 있다.
  • 월드 아웃라이너(World Outliner): 현재 수준의 모든 개체를 표시한다. 관련 항목을 폴더에 넣어 목록을 구성할 수 있다. 유형별로 검색하고 필터링하는 기능이 있다.
  • 디테일: 선택한 개체 속성이 여기에 표시된다. 이 패널을 사용하여 개체의 설정을 편집한다. 변경 사항은 개체의 해당 인스턴스에만 영향을 준다. 예를 들어, 두 개의 구가 있고 하나의 크기를 변경하면 선택한 오브젝트에만 영향을 준다.
  • 도구 모음: 다양한 기능이 포함되어 있다. 가장 많이 사용하는 것은 Play 이다.
  • 뷰포트: 마우스 오른쪽 버튼을 클릭 하고 마우스를 움직여 주변을 둘러 볼 수 있다. 이동하려면 마우스 오른쪽 버튼을 누른 상태 에서 WASD 키를 사용한다.
컨텐츠 만들기
미리 무료 3차원 모델 파일 제공해 주는 웹사이트에서 파일을 다운로드 받아 놓는다. 이 예제에서는 아래 웹사이트를 사용했다. 
언리얼에서 파일을 사용하려면 먼저 임포트해야한다. 콘텐츠 브라우저로 이동하여 가져 오기를 클릭한다. 파일 브라우저를 사용하여 다운로드한 파일이 있는 폴더를 찾는다. 두 파일을 모두 드래그하여 선택 하고 열기를 클릭 한다. Unreal은 .fbx 파일에 대한 몇 가지 가져 오기 옵션을 제공한다. 
모델 임포트 옵션

참고로, 파일을 가져올 때 명시적으로 수행할 때까지 실제로 프로젝트에 저장되지 않는다. 다음과 같은 방법으로 파일을 저장할 수 있다 마우스 오른쪽 단추로 클릭 해당 파일을 선택하고 저장을 File>Save All을 선택하여 모든 파일을 한 번에 저장할 수 있다.

Unreal에서는 모델을 메시라고 한다. 메시를 만들었으니 레벨에 배치 할 차례이다.

레벨에 메시를 추가하려면 콘텐츠 브라우저에서 모델을 왼쪽클릭하고 뷰포트로 드래그 한다. 왼쪽 클릭을 해제 하면 메시가 배치된다. 레벨의 개체는 이동 , 회전 및 크기 조정이 가능 한다. 이들의 키보드 단축키는 W , E 및 R 이다. 

재질 만들기
모델을 자세히 살펴보면 전혀 노란색이 아님을 알 수 있다. 모델에 약간의 색상과 디테일을 부여하려면 재질을 만들어야한다 .

재질은 표면이 어떻게 보이는지 결정한다. 기본 수준에서 재료는 다음 네 가지를 정의한다.
  • 기본 색상: 표면의 색상 또는 질감이다. 
  • 금속성: 표면이 얼마나 "금속과 같은지"를 설정한다. 순수한 금속은 최대 금속 값을 가지며 직물은 0 값을 갖는다.
  • 반사광: 비금속 표면의 광택을 제어한다. 예를 들어 세라믹은 Specular 값이 높지만 점토는 그렇지 않다.
  • 거칠기: 최대 거칠기를 가진 표면은 광택이 없다. 바위와 나무와 같은 표면에 사용된다.
머티리얼을 생성하려면 콘텐츠 브라우저로 이동하여 녹색 새로 추가 버튼을 클릭한다. 

생성 할 수 있는 자산 목록 메뉴가 나타난다. 재료를 클릭한다. 재질 이름을 Bulb_Material 로 지정한 다음 파일을 두 번 클릭하여 재질 편집기에서 연다.

재료 편집기는 5개 주요 패널로 구성된다.
  • 그래프: 이 패널는 모든 노드와 결과 노드가 포함된다. 
  • 세부 정보: 선택한 모든 노드의 속성이 여기에 표시된다. 
  • 뷰포트: 머티리얼을 표시할 미리보기 메시가 포함되어 있다. 
  • 팔레트: 재료에 사용할 수 있는 모든 노드 목록이다.
노드는 재료 대부분을 구성한다. 다양한 유형의 노드를 사용할 수 있으며 다양한 기능을 제공한다. 노드는 화살표가있는 원으로 표시되는 입력 및 출력을 가질 수 있다. 입력은 왼쪽에 있고 출력은 오른쪽에 있다.

모델에 색상과 디테일을 추가하려면 텍스처가 필요한다. 텍스처는 2D이미지이다. 일반적으로 3D모델에 투영되어 색상과 세부 정보를 제공한다.

텍스처링하려면 앞서 미리 다운로드한 텍스쳐 jpg 파일을 사용한다. TextureSample과의 노드는 물질 내에서 텍스처를 사용할 수 있다.

Palette 패널로 이동하여 TextureSample을 검색한다. 왼쪽 클릭을 누른 상태에서 그래프로 드래그하여 노드를 추가한다. 


디테일 패널로 이동하여 Texture 오른쪽에 있는 드롭 다운을 클릭한다. Texture를 선택 한다. 미리보기 메시에서 텍스처를 보려면 Result 노드에 연결해야 한다. 도구 모음에서 적용을 클릭 하여 재료를 업데이트하고 재료 편집기를 닫는다. 

블루 프린트로 사물 객체 만들기
블루 프린트를 사용하면 개체에 대한 사용자 지정 동작을 만들 수 있다. 물체는 물리적인 것 이거나 시스템과 같은 추상적인 것 일 수 있다. 머티리얼과 마찬가지로 블루 프린트는 노드 기반 시스템을 사용한다. 즉, 노드를 만들고 연결하기만 하면 된다. 코딩이 필요하지 않다. 코드 작성을 선호하는 경우 대신 C ++를 사용할 수 있다.

블루 프린트는 사용하기 쉽지만 C ++ 코드만큼 빠르지는 않다. 따라서 복잡한 알고리즘과 같이 계산량이 많은 것을 사용해야하는 경우 C ++ 사용을 고려해야 한다.

콘텐츠 브라우저로 이동하여 새로 추가를 클릭 한다. 목록에서 Blueprint Class를 선택한다. 부모 클래스를 선택하라는 창이 나타난다. 블루 프린트는 선택한 부모 클래스의 모든 변수, 함수 및 구성 요소를 상속한다. 액터를 선택하고 새 파일 이름을 Bulb_Blueprint로 지정 한다. 

더블 클릭하여 Bulb_Blueprint 연다. 블루 프린트 편집기 열기를 클릭한다. 블루 프린트 에디터에는 4개 메인 패널이 있다.
  • My Blueprint : 이 섹션은 주로 그래프, 함수 및 변수를 관리하는 데 사용된다.
  • 세부 정보: 현재 선택한 항목 속성을 표시한다.
  • 그래프: 모든 노드와 로직이 여기에 입력된다.
  • 뷰포트: 메인 에디터 뷰포트와 동일한 컨트롤을 사용하여 이동하고 둘러 볼 수 있다.
  • 컴포넌트: 블루 프린트가 자동차라면 컴포넌트는 자동차를 구성하는 빌딩 블록이다. 구성 요소는 물리적 개체에 국한되지 않는다. 예를 들어 자동차를 움직이기 위해 이동 구성 요소를 추가 할 수 있다. 비행 부품을 추가하여 자동차를 날릴 수도 있다.

여기서 테이블을 만들것이다. 테이블은 두 가지 구성 요소를 사용한다.
  • 원통: 단순한 흰색 원통이다. 이것은 모델이 앉는 기초가 될 것이다.
  • 스태틱 메시: 이 컴포넌트는 모델 메시를 표시한다.
컴포넌트 패널에서 빈 영역을 마우스 왼쪽 버튼으로 클릭하여 Cylinder 구성 요소를 선택한다. 다음으로 Add Component를 클릭하고 목록에서 Static Mesh를 선택한다.

전구 모델을 표시하려면 스태틱 메시 컴포넌트를 선택한 다음 디테일 탭을 클릭한다. Static Mesh 오른쪽에 있는 드롭 다운을 클릭하고 전구 Model을 선택한다.

블루 프린트 노드에는 실행핀이라는 특수 핀이 있다. 왼쪽의 핀은 입력이고 오른쪽의 핀은 출력이다. 예를 들어, 노드 A 와 노드 B 는 입력 핀이 연결되어 있기 때문에 실행된다. 스크립팅을 시작하려면 이벤트 그래프 탭으로 다시 전환한다.

그래프의 빈 공간을 마우스 오른쪽 버튼으로 클릭 하여 사용 가능한 노드 메뉴를 표시한다. AddLocalRotation을 검색한다 . 베이스와 바나나를 회전해야하므로 루트 구성 요소만 회전하면된다. AddLocalRotation (DefaultSceneRoot)을 선택하라. 회전 값을 설정하려면 Delta Rotation 입력으로 이동 하여 Z 값을 1.0으로 변경한다. 그러면 블루 프린트가 Z 축을 중심으로 회전한다. 값이 클수록 턴테이블이 더 빨리 회전한다.

턴테이블을 계속 회전하려면 매 프레임마다 AddLocalRotation 을 호출해야한다. 매 프레임마다 노드를 실행하려면 Event Tick 노드를 사용하라. Event Tick 노드 의 출력 핀을 AddLocalRotation 노드 의 입력 핀으로 드래그한다.

다음과 같이 해당 모델을 선택해, 디테일에서 Movable 옵션을 설정한다. 

마지막으로 툴바로 이동하여 컴파일(F7)을 클릭 하여 블루 프린트를 업데이트한 다음, 블루 프린트 편집기를 닫는다. 그럼 회전하는 모델을 확인할 수 있다.

키보드 등 입력 이벤트 처리
3차원 객체와 상호반응하기 위해 이벤트를 처리한다. 언리얼은 모든 입력처리를 UInputComponent에서 처리한다. 모든 액터는 입력 컴포넌트를 가진다. 이 컴포넌트가 있으면 입력 이벤트와 바인딩하는 방법은 동일하다. 

언리얼은 다양한 입력과 호환성을 고려해 입력 바인딩 과정을 먼저 거쳐야 입력 이벤트를 액터에 전달할 수 있다.

편집>프로젝트 세팅 메뉴>입력 메뉴를 선택하여 다음과 같이 입력 이벤트 이름과 해당 입력 조합을 설정한다. 아래 경우는 키보드 B를 맵핑하였다.

다음과 같이 앞서 만든 액터 중 하나를 선택해 블루프린트를 편집한다. 우선 액터의 입력을 활성화하고, 입력 이벤트 발생할 때마다 화면에 메시지를 출력한 후 정해진 축으로 이동하도록 하였다.

실행 결과는 다음과 같다.

블루프린트로도 작업할 수 있지만, 내부 동작을 이해하기 위해 C++의 코드를 확인해 보겠다. 예를 들어, Pawn을 기본 클래스로 하는 C++ 클래스인 경우, 다음과 같이 입력이 발생할 경우 특정 함수를 호출해 액터 등을 동작을 시킬 수 있다.
UCLASS()
class AMovePawn : public APawn 
{
GENERATED_BODY()

public:
    // ~Overrides: APawn
virtual void SetupPlayerInputComponent(UInputComponent* InputComponent) override;

    // Declare your callbacks here
    // MoveForward(); 
};
void AUnrealisticPawn::SetupPlayerInputComponent(UInputComponent* InputComponent)
{
    // Always call this.
    Super::SetupPlayerInputComponent(InputComponent);

    // This component belongs to the possessing Player Controller
    InputComponent->BindAxis("Go", this, &AMovePawn::MoveForward);
}


레퍼런스

2021년 6월 8일 화요일

리눅스에서 VSCode, CMake와 GDB 개발환경 만들기

이 글은 리눅스에서 VSCode, CMake와 GDB 개발환경 만들기 방법을 간단히 정리한다.
리눅스에서 개발환경은 윈도우보다 좋지는 않다. 옛날에는 Eclipse 정도가 최신이었지만, 지금은 VSCode, PyCharm 등이 있어 비쥬얼한 개발환경 지원이 좋아졌다. 이 글은 우분투에서 VSCode에 대한 설치 및 사용 방법만 언급한다.

VS Code, CMake 및 GDB 설치 
VS Code 용 C ++ 확장을 설치한다. 확장보기 윈도우( Ctrl + Shift + X )에서 'c ++'를 검색하여 C / C ++ 확장을 설치할 수 있다.

g++ 컴파일러를 사용하여 Linux에서 소스 코드를 컴파일한다. GDB를 사용하여 디버깅한다. 이러한 도구는 Ubuntu에 기본적으로 설치되지 않으므로 설치해야한다. 터미널 창을 열고 다음 명령을 입력하라.
gcc -v
sudo apt-get update

다음 명령으로 GNU 컴파일러 도구와 GDB 디버거를 설치한다.
sudo apt-get install build-essential gdb

Hello World 만들기
다음과 같이 터미널 창에서 프로젝트 저장용 빈 폴더를 만든다. 
mkdir projects
cd projects
mkdir helloworld
cd helloworld
code .

이 code .명령은 "작업 공간"이 되는 현재 작업 폴더에서 VS Code를 실행한다. 작업 공간 의 폴더에 세 개의 파일을 만든다.

tasks.json (컴파일러 빌드 설정)
launch.json (디버거 설정)
c_cpp_properties.json (컴파일러 경로 및 IntelliSense 설정)
Hello World 소스 코드 파일

파일 탐색기 제목 표시 줄에서 새 파일을 선택하고 파일 이름을 helloworld.cpp로 한다. 다음 소스 코드를 붙여 넣는다.

#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string> msg {"Hello", "C++", "World", "from", "VS Code", "and the C++ extension!"};

    for (const string& word : msg)
    {
        cout << word << " ";
    }
    cout << endl;
}

이제 Ctrl + S 를 눌러 파일을 저장하라. 파일이 VS Code 사이드 바에 있는 파일 탐색기에 나열된다.

helloworld.cpp 빌드
주 메뉴에서 터미널 > 기본 빌드 작업 구성을 선택한다. g++ 빌드 환경을 설정한다. 그러면 폴더에 tasks.json파일이 생성된다. 새 tasks.json파일은 아래 JSON과 유사하다.
{
  "version": "2.0.0",
  "tasks": [
    {
      "type": "shell",
      "label": "g++ build active file",
      "command": "/usr/bin/g++",
      "args": ["-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}"],
      "options": {
        "cwd": "/usr/bin"
      },
      "problemMatcher": ["$gcc"],
      "group": {
        "kind": "build",
        "isDefault": true
      }
    }
  ]
}

빌드 실행
빌드 작업을 실행하려면, Ctrl + Shift + B를 누르거나 터미널 기본 메뉴에서 빌드 작업을 실행한다.

helloworld.cpp 디버그
F5키를 l눌러 프로그램을 디버깅한다. 주 메뉴에서 실행 > 구성 추가 ... 를 선택한 다음 C ++ (GDB / LLDB) 를 선택한다. 미리 정의된 디버깅 구성에 대한 드롭 다운이 표시된다. g++ 빌드 및 디버그 활성 파일을 선택한다.

VS Code는 launch.json파일을 만들고 편집기에서 열고 'helloworld'를 빌드하고 실행한다.
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "g++ build and debug active file",
      "type": "cppdbg",
      "request": "launch",
      "program": "${fileDirname}/${fileBasenameNoExtension}",
      "args": [],
      "stopAtEntry": false,
      "cwd": "${workspaceFolder}",
      "environment": [],
      "externalConsole": false,
      "MIMode": "gdb",
      "setupCommands": [
        {
          "description": "Enable pretty-printing for gdb",
          "text": "-enable-pretty-printing",
          "ignoreFailures": true
        }
      ],
      "preLaunchTask": "g++ build active file",
      "miDebuggerPath": "/usr/bin/gdb"
    }
  ]
}

디버깅 세션 시작
F5 키를 누르 거나 주 메뉴에서 실행> 디버깅 시작을 선택한다. 디버깅 제어판에서 Step over 아이콘을 클릭하거나 누른다. 통합 터미널의 디버그 콘솔 탭에서 GDB가 출력하는 진단 정보 출력을 볼 수 있다.

레퍼런스