【UE5】C++ を用いたオリジナルプラグインの作成方法

# 手順
## プラグインの作成
### 手順1
「**Edit** ＞ **Plugins**」を開き、左上の「**Add**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/4ca7c235-9535-d6bb-916d-378905a0bd82.png">

### 手順2
「**Blueprint Library**」を選択してプラグインのパスや名前、作成者、説明などの情報を入力し、右下の「**Create Plugin**」を押す。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/5ccaaf3a-3884-75bc-14d4-ea39148adab5.png">

## コーディング
### 手順3
**Visual Studio** が開いたら「{プロジェクト名} \Plugins\ {プラグイン名} \Source\ {プラグイン名} \Public\ **{プラグイン名}BPLibrary.h**」と「{プロジェクト名} \Plugins\ {プラグイン名} \Source\ {プラグイン名} \Private\ **{プラグイン名}BPLibrary.cpp**」にそれぞれ処理を記述する。
（以下は例）

```SampleBPLibrary.h
#pragma once

#include "Kismet/BlueprintFunctionLibrary.h"
#include "SampleLibraryBPLibrary.generated.h"

UCLASS()
class USampleLibraryBPLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_UCLASS_BODY()

public:
	UFUNCTION(BlueprintCallable, meta = (KeyWords = "display text"), Category = "SampleLibrary|Log")
	static void DisplayText(FString Text);
};
```

```SampleBPLibrary.cpp
#include "SampleLibraryBPLibrary.h"
#include "SampleLibrary.h"
#include "Kismet/KismetSystemLibrary.h"

USampleLibraryBPLibrary::USampleLibraryBPLibrary(const FObjectInitializer& ObjectInitializer) : Super(ObjectInitializer)
{

}

void USampleLibraryBPLibrary::DisplayText(FString Text)
{
	UKismetSystemLibrary::PrintString(nullptr, Text);
}
```
### 手順4
処理を記述し終えたら UE エディタに戻り、右下のボタンを押してコンパイルする。
（「**Ctrl** + **Alt** + **F11**」でも可能）

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/32537677-40f5-6361-5f44-789d1916e437.png">

## デバッグ
### 手順5
コンパイルに成功したらブループリントのイベントグラフを開き、C++ で記述した関数がノードとして呼び出せる事を確認する。

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/c743c320-d628-730c-aa30-839b4d5594e7.png">

# 備考
## プラグインのサムネイル
「{プロジェクト名} \Plugins\ {プラグイン名} \Resources\ **Icon128.png**」を任意の PNG ファイルに置き換える事でプラグインのサムネイルを変更する事が出来る。
（画像サイズは **128 x 128**）

<img width="500" alt="TSUBASAMUSU.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2670397/f7b5e59b-341a-1ea8-a938-0f3de188ab58.png">

（引用元：[UE5 EA プラグイン作成～プラグイン作成と公開する準備まで～](https://note.com/posi_ta/n/n6d48fcf836e)）
## 「UFUNCTION()」について
### [Unreal Engine の UFunction](https://dev.epicgames.com/documentation/ja-jp/unreal-engine/ufunctions-in-unreal-engine?application_version=5.1) より
> UFunction は Unreal Engine リフレクション システムが認識する C++ 関数です。UObject またはブループリント関数ライブラリは、ヘッダ ファイルの関数宣言の上の行に UFUNCTION マクロを入れることで、メンバ関数を Ufunction として宣言することができます。このマクロは Unreal Engine の関数の解釈と使用方法を変更するために 関数指定子 をサポートします。
### 代表的な関数指定子
#### BlueprintCallable
C++ で作成した関数をブループリントからノードとして呼び出せるようにする。
```cpp
UFUNCTION(BlueprintCallable)
```
#### Category
C++ で作成した関数をブループリントから検索する際に表示されるカテゴリーを設定する。
```cpp
UFUNCTION(Category = "大分類|小分類")
```
### 代表的なメタデータ指定子
#### DisplayName
C++ で作成した関数をブループリントエディタから見た際に何というノード名で表示するかを設定する。
```cpp
UFUNCTION(meta = (DisplayName = "関数の表示名"))
```
#### KeyWords
C++ で作成した関数をブループリントから検索する際に何というキーワードで検索したら結果に表示されるかを設定する。
キーワード同士の間は半角スペースで空ける。
```cpp
UFUNCTION(meta = (KeyWords = "キーワード1 キーワード2 キーワード3"))
```
# その他
## 参考記事

https://note.com/posi_ta/n/n6d48fcf836e2

https://dev.epicgames.com/documentation/ja-jp/unreal-engine/ufunctions-in-unreal-engine?application_version=5.1

# 最後に
## 株式会社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/