【Git/UE5】Git を用いた Unreal Engine のバージョン管理の始め方

# はじめに
## 前提条件
- [GitHub](https://github.com/) アカウントを作成してある事
-  [Git](https://git-scm.com/) をダウンロードしてある事
-  [Git LFS](https://git-lfs.com/) をダウンロードしてある事
- [Sourcetree](https://www.sourcetreeapp.com/) をダウンロードして GitHub アカウントの認証などの初期設定を行ってある事
## テスト環境
- UE 5.1.1
- Visual Studio 2022
- [UEGitPlugin](https://github.com/ProjectBorealis/UEGitPlugin/) 3.15
# 手順
## GitHub でのリポジトリの作成
### 手順1
[GitHub](https://github.com/) に行き、右上の「**＋**」から「**New repository**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/39b15594-7981-ccb6-9b37-d96125be47a4.png">

### 手順2
「**Repository name**」や公開範囲などを設定して右下の「**Create repository**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/eaa309d2-b947-e035-9ba3-20d19c9944a9.png">

## Sourcetree でのリポジトリの作成
### 手順3
通信プロトコルが「**HTTPS**」になっている事を確認してリポジトリの URL をコピーする。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/35de52f7-0de5-4631-b5b5-34a9334da36b.png">

### 手順4
Sourcetree を開いて上の「**Create**」を押し、対象の UE プロジェクトのルートフォルダのパスを指定してリポジトリ名を設定し、種類が「**Git**」になっている事を確認してから左下の「**作成**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/cd954cc6-d376-df5f-a38f-2249a52a5818.png">

### 手順5
以下のように「**出力先ディレクトリのエラー**」が表示された場合は「**はい**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/a4a56344-ab7c-37d1-40a5-569e2a493203.png">

### 手順6
右上の「**設定**」を押して「**リモート**」を選択し、左下の「**追加**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/9761dfe1-2988-2269-15cd-db06d971ea76.png">

### 手順7
「**デフォルトリモート**」にチェックを入れて「**URL/パス**」に先程コピーした URL を貼り付け、「**Remote Account**」を選択し、右下の「**OK**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/30f00540-bd4e-2ce7-9b79-e699334fe046.png">

### 手順8
「**OK**」を押して「**リポジトリ設定**」を閉じた後、左上の「**リポジトリ**」から「**Git LFS** ＞**リポジトリを初期化...**」を選択する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/885f29b4-29fc-a2b2-0317-4bfb4497c251.png">

### 手順9
右下の「**Git LFSを利用する**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/eca390b1-78fc-ec31-e44c-8b507b6153a9.png">

### 手順10
右下の「**トラックファイル**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/59ad80a0-8a8e-62fe-85d2-ab9898575a9e.png">

## UEGitPlugin の導入
### 手順11
[GitHub（UEGitPlugin）](https://github.com/ProjectBorealis/UEGitPlugin/)に行き、右の「**Releases**」の中の緑色の「**Latest**」の文字が表示されているバージョンを押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/1d49cfc8-fff3-0bce-6cff-1b277cb365f6.png">

### 手順12
「**Assets**」内の「**Source code (zip)**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/a7f6b53c-5853-5d3f-a24e-4920cf48bb8d.png">

### 手順13
ダウンロードした ZIP ファイルを展開して UE エディタを閉じている状態で UE プロジェクトのルートフォルダにある「**Plugins**」フォルダ内に移動する。
（まだ「**Plugins**」フォルダが無い場合は自分で作成する）

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/dd863b8d-097f-d3b4-8fd8-66bfd7e5147f.png">

### 手順14
「**{プロジェクト名}.uproject**」ファイル上で右クリックして「**Generate Visual Studio project files**」した後、UE プロジェクトを開き、右下の「**Source Control**」から「**Connect to Source Control...**」を選択する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/148071fe-9134-c2ab-1f74-ab3995a4bdf8.png">

### 手順15
「**Provider**」で「**Git LFS 2**」を選択し、「**Git Path**」と「**Use Git LFS**」のチェックボックスにチェックが付いている事、「**User Name**」、「**E-mail**」等を確認して下の「**Accept Settings**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/5a56b9af-732d-71bb-c8db-3a1040866e98.png">

### 手順16
Sourcetree に戻り、右上の「**設定**」から「**詳細**＞**リポジトリ固有の無視リスト**＞**編集**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/2477c0aa-a16f-97ed-e439-79601f010ad9.png">

### 手順17
メモ帳などのテキストエディタが開いたら[こちら](https://github.com/ProjectBorealis/PBCore/blob/main/.gitignore)のコードをコピペして保存する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/badcf35a-1ae3-2279-9c21-aa5c205150b1.png">

### 手順18
UE プロジェクトのルートディレクトリに「**.gitattributes**」ファイルを作成して[こちら](https://github.com/ProjectBorealis/PBCore/blob/main/.gitattributes)のコードをコピペして保存する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/7c5371e5-d9c6-a903-94bc-8697398cae1b.png">

### 手順19
UE プロジェクトのルートディレクトリにある「**Config**」フォルダ内に「**DefaultEditorPerProjectUserSettings.ini**」ファイルを作成して以下のコードをコピペする。
```DefaultEditorPerProjectUserSettings.ini
[/Script/UnrealEd.EditorLoadingSavingSettings]
bSCCAutoAddNewFiles=False
bAutomaticallyCheckoutOnAssetModification=False
bPromptForCheckoutOnAssetModification=True

[/Script/UnrealEd.EditorPerProjectUserSettings]
bAutoloadCheckedOutPackages=True
```
### 手順20
作成した「**DefaultEditorPerProjectUserSettings.ini**」ファイルと同じ階層にある「**DefaultEngine.ini**」ファイルに以下のコードをコピペする。
```DefaultEngine.ini
[SystemSettingsEditor]
r.Editor.SkipSourceControlCheckForEditablePackages=1
```
## エディタ専用モジュールの作成
### 手順21
UE プロジェクトのルートディレクトリにある「**Source**」フォルダ内に新たにフォルダを作成し、その中に「**{モジュール名}.Build.cs**」と「**{モジュール名}.cpp**」、「**{モジュール名}.h**」を作成する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/6df549a1-b105-6836-540c-ad70584ff57d.png">

### 手順22
作成した3つファイルにそれぞれ以下のコードをコピペする。
```YourModuleName.Build.cs
using UnrealBuildTool;

public class YourModuleName : ModuleRules
{
    public YourModuleName(ReadOnlyTargetRules Target) : base(Target)
    {
        PCHUsage = PCHUsageMode.UseExplicitOrSharedPCHs;

        PublicDependencyModuleNames.AddRange(new string[] { "Core", "CoreUObject", "Engine", "Slate", "SlateCore", "UnrealEd" });
    }
}
```
```YourModuleName.h
#pragma once

#include "CoreMinimal.h"
#include "Modules/ModuleInterface.h"
#include "Modules/ModuleManager.h"
#include "Editor/UnrealEdEngine.h"

class YOURMODULENAME_API FYourModuleName : public IModuleInterface
{
    
};
```
```YourModuleName.cpp
#include "YourModuleName.h"
#include "ISourceControlModule.h"
#include "ISourceControlProvider.h"

IMPLEMENT_MODULE(FYourModuleName, YourModuleName);
```
### 手順23
UE プロジェクトのルートディレクトリにある「**Source**」フォルダ内の「**{プロジェクト名}Editor.Target.cs**」に ``ExtraModuleNames.Add("作成したエディタ専用モジュールの名前");`` を追加する。
```YourProjectNameEditor.Target.cs
// Copyright Epic Games, Inc. All Rights Reserved.

using UnrealBuildTool;
using System.Collections.Generic;

public class YourProjectNameEditorTarget : TargetRules
{
	public YourProjectNameEditorTarget( TargetInfo Target) : base(Target)
	{
		Type = TargetType.Editor;
		DefaultBuildSettings = BuildSettingsVersion.V2;
		IncludeOrderVersion = EngineIncludeOrderVersion.Unreal5_1;
		ExtraModuleNames.Add("YourProjectName");
        ExtraModuleNames.Add("YourModuleName");//追加
    }
}
```
### 手順24
UE プロジェクトのルートディレクトリにある「**{プロジェクト名}.uproject**」ファイルに、作成したモジュールを以下のように追加する。
```json:YourProjectName.uproject
{
	"FileVersion": 3,
	"EngineAssociation": "5.1",
	"Category": "",
	"Description": "",
	"Modules": [
		{
			"Name": "YourProjectName",
			"Type": "Runtime",
			"LoadingPhase": "Default"
		},
		{
			"Name": "YourModuleName",
			"Type": "Editor",
			"LoadingPhase": "Default"
		}
	],
	"Plugins": [
		{
			"Name": "ModelingToolsEditorMode",
			"Enabled": true,
			"TargetAllowList": [
				"Editor"
			]
		}
	]
}
```
## ステータスブランチの設定
### 手順25
全ての変更を保存して「**{プロジェクト名}.uproject**」ファイル上で右クリックし、「**Generate Visual Studio project files**」した後、UE プロジェクトを開き、「**Tools** ＞ **New C++ Class...**」を選択する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/f9c3f033-eec1-808c-b4d0-60b8e4cabb27.png">

### 手順26
親クラスに「**All Classes** ＞ **UnrealEdEngine**」を選択して右下の「**Next**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/86638e25-4c53-28c1-438a-bc7b816ba8ea.png">

### 手順27
「**Class Type**」を「**Public**」に、作成場所を「**{作成したエディタ専用モジュールの名前}(Editor)**」に設定して右下の「**Create Class**」を押す。


<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/d6ff5429-3545-772d-2360-9930c284ba2d.png">

### 手順28
Visual Studio が開いたら作成された各ファイルに以下のコードをコピペする。
（``Branches`` の要素は[こちら](https://github.com/ProjectBorealis/UEGitPlugin/?tab=readme-ov-file#status-branches---required-code-changes)を参考にして適宜修正する）
```MyUnrealEdEngine.h
#pragma once

#include "CoreMinimal.h"
#include "Editor/UnrealEdEngine.h"
#include "MyUnrealEdEngine.generated.h"

UCLASS()
class YOURMODULENAME_API UMyUnrealEdEngine : public UUnrealEdEngine
{
	GENERATED_BODY()

public:
	void Init(IEngineLoop* InEngineLoop) override;
};
```
```MyUnrealEdEngine.cpp
#include "MyUnrealEdEngine.h"
#include "ISourceControlModule.h"

void UMyUnrealEdEngine::Init(IEngineLoop* InEngineLoop)
{
	Super::Init(InEngineLoop);

	const ISourceControlModule& SourceControlModule = ISourceControlModule::Get();
	{
		ISourceControlProvider& SourceControlProvider = SourceControlModule.GetProvider();
		
		const TArray<FString> Branches{ "origin/main", "origin/develop" };

		SourceControlProvider.RegisterStateBranches(Branches, TEXT("Content"));
	}
}
```
### 手順29
UE エディタに戻り、右下のボタンからコンパイルする。
（「**Ctrl** + **Alt** + **F11**」でも可能）

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/421d661b-f01f-55d8-3c24-bc91c327c1ca.png">

## 作成したエディタ専用モジュールの登録とデバッグ
### 手順30
コンパイルが完了したら UE エディタと Visual Studio を閉じて UE プロジェクトのルートディレクトリにある「**Config**」フォルダ内の「**DefaultEngine.ini**」に以下のコードを追加する。
（既に ``[/Script/Engine.Engine]`` がある場合はその欄の最後に以下のコードを追加する）
```DefaultEngine.ini
[/Script/Engine.Engine]
UnrealEdEngine=/Script/YourModuleName.MyUnrealEdEngine
```
### 手順31
UE エディタを再び開き、任意のアセットを右クリックして「**Source Control**」を選択した際に「Check In」や「Refresh」、「Revert」等の選択肢が表示される事を確認する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/28a1a3e5-88fc-f04e-5695-8737ae928c15.png">

# その他
## 参考
### 記事
https://historia.co.jp/archives/3097/

https://kazuhiro77unreal.hatenablog.com/entry/2018/01/28/083209

https://qiita.com/herorinusu/items/478371c51c99418ab6c8

https://zenn.dev/hakuto_gamedev/articles/a546a185dc02f6

https://docs.unrealengine.com/5.0/ja/how-to-make-a-gameplay-module-in-unreal-engine/

https://unrealcommunity.wiki/creating-cpp-module-oshdsg2t

https://docs.unrealengine.com/4.27/ja/ProgrammingAndScripting/ProgrammingWithCPP/Modules/

### GitHub
https://github.com/GSAero/Creating-an-Editor-Module

https://github.com/ProjectBorealis/UEGitPlugin/

https://github.com/github/gitignore

# 最後に
## 株式会社ModelingXについて
<img width="200" alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/4261f1c0-a380-01a9-9c69-08a836c6f02f.jpeg">

富山県を拠点とするスタートアップ企業、ModelingXは、2022年4月に創業し、「テクノロジーで感動体験を提供する」というミッションを掲げています。当社が開発中の暮らし体験メタバース「MELIFE（ミライフ）」は、バーチャル住宅展示場や銀行相談、家具購入、婚活などができる「地域単位の新たな経済圏」を目指しています。

↓サービスサイトはこちらから↓

https://melife.io/

ModelingXはリモートワーク＆フレックスタイム制を完備。
UnityやUEを共に探求する仲間を全国から募集しています。

↓企業詳細はこちら↓

https://modelingx.jp/