UE5 パッケージ化後に Unlit 表示を可能にするプラグインの作成手順

![20231203_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f3e82e53-fadb-7304-ec47-35cb21fc369a.jpeg)

# はじめに
この記事では、プラグインを制作し、パッケージ化後にも機能する **「Unlit」** と **「Lit」** の切り替えノードを用意する工程を残します。プラグイン制作の練習用にもなるかなと思います。
この記事での **「Unlit」** とは、ビューポートのUnlit 表示を、パッケージ化後も機能させる事を指します。（ポストプロセス除外／テクスチャの色をそのまま表示）
「C++ で書けば、パッケージ化後にも Unlit 表示が可能」という話を、[**海神 航さんのツイート**](https://twitter.com/Blasthal/status/1487140457029435392)を参考に試してみたらできたので、[わーい](https://twitter.com/o_y_g/status/1696403312227291406)という感じでしたが、
時々、パッケージ化後に Unlit 表示したいなと思うことがあったので、
自分用のメモ的に、Unlit表示させるプラグインの用意の仕方を残しておきたいと思います。

# 前提
- この記事は[海神 航さんのコード](https://twitter.com/Blasthal/status/1487140457029435392)を参考に、ブループリントライブラリ化してプラグインとして動くように改変したものになります。
- プラグイン制作経験がない方は、ポジTAさんの [「UE5 EA プラグイン作成～プラグイン作成と公開する準備まで～」](https://note.com/posi_ta/n/n6d48fcf836e2) を一度こなしてから、この記事に触れるとより理解しやすくなると思います。
- UE4.27～5.3 で動作確認はしていますが、使う際は自己責任で。

解説環境：UE5.3.2 VisualStudio2022 Win10

# プラグイン制作手順
C++ プロジェクトを用意。

プラグインを開きます。（左上メニュー「編集」＞「プラグイン」）
左上 **「+追加」** ボタンをクリック。
![20231202_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/f375d3a8-c1f0-bdd9-ae8b-556663bac4ab.jpeg)



**「ブループリント ライブラリ」** を選択。
![20231202_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/20a799f2-3146-b7fb-7e32-498e8a93519e.jpeg)
- 「プラグイン名」を、入力します。今回はコードの差し替え部分がわかりやすいように「`xxxUnlitxxx`」にしました。
- 「Author」に、あなたの名前。
- 「Description」に、プラグインの説明を入れます。 `Packaging Viewmode Unlit Select.`
- 「Author URL」には、配布する場合は、連絡のつくアドレスを入れる。自分しか使わないなら書かなくていい。
- 「Is Beta Version」は、初心者のうちは、全部Betaなので、チェックを入れます。

入力が済んだら「プラグインを作成」。

Visual Studio が起動すると思います。

Visual Studio 自体が起動していない場合、「ツール」から「Visual Studio 2022を開く」で起動して、
「コンテンツブラウザ」のフォルダ「Plugins」の中の「xxxUnlitxxx C++ クラス」「xxxUnlitxxx」「Public」「xxxUnlitxxxBPLibrary」をダブルクリックで開き、

以下のように書き換えます。

```cpp:xxxUnlitxxxBPLibrary.h
#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "xxxUnlitxxxBPLibrary.generated.h"

UCLASS()
class XXXUNLITXXX_API UxxxUnlitxxxBPLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()

public:
    UFUNCTION(BlueprintCallable, meta = (DisplayName = "Apply Unlit View Mode", Keywords = "xxxUnlitxxx Apply Unlit View Mode"), Category = "Unlit")
    static void ApplyUnlitViewMode();

    UFUNCTION(BlueprintCallable, meta = (DisplayName = "Apply Lit View Mode", Keywords = "xxxUnlitxxx Apply Lit View Mode"), Category = "Unlit")
    static void ApplyLitViewMode();
};

```


```cpp:xxxUnlitxxxBPLibrary.cpp
#include "xxxUnlitxxxBPLibrary.h"
#include "GameFramework/PlayerController.h"
#include "Engine/Engine.h"
#include "Engine/GameViewportClient.h"

void UxxxUnlitxxxBPLibrary::ApplyUnlitViewMode()
{
    const EViewModeIndex DesiredViewMode = VMI_Unlit;
    UGameViewportClient* ViewportClient = GEngine->GameViewport;
    ViewportClient->ViewModeIndex = static_cast<int32>(DesiredViewMode);

    UE_LOG(LogTemp, Warning, TEXT("***************** ApplyView: %s ***********************"), *UEnum::GetValueAsString(DesiredViewMode));
}

void UxxxUnlitxxxBPLibrary::ApplyLitViewMode()
{
    const EViewModeIndex DesiredViewMode = VMI_Lit;
    UGameViewportClient* ViewportClient = GEngine->GameViewport;
    ViewportClient->ViewModeIndex = static_cast<int32>(DesiredViewMode);

    UE_LOG(LogTemp, Warning, TEXT("***************** ApplyView: %s ***********************"), *UEnum::GetValueAsString(DesiredViewMode));
}

```

`xxxUnlitxxx` がプラグイン名なので、別の名前のプラグイン名の場合は、差し替えます。
警告文の`UE_Log`は省略してもいい気がしますが、注目箇所として残しています。

C++コードの差し替えが済んだら、

左上メニュー「ツール」＞「デバッグ」＞「モジュール」
![20231202_05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/2702e5fb-6d48-a6d6-a11c-3d4aa46a973c.jpeg)

検索「unlit」でプラグインを見つけ、xxxUnlitxxx を「再コンパイル」
![20231202_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/5b56f7e4-90a7-2597-3c81-57e8e25c26a3.jpeg)

コンパイルが完了したら、プラグイン自体は完成です。

# 使う

ブループリント上で `unlit` と検索して、
「Apply Unlit View Mode」と、「Apply Lit View Mode」を呼び出します。
![20231202_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/d249372f-5950-1ca3-1e2b-8303adede6aa.jpeg)

これが、パッケージ化後にも機能しているのを確認できたら、ＯＫ。


# 別プロジェクトで使う

あとは、このプラグインを、別のプロジェクトにコピーして、ちゃんと機能するのを確認します。
![20231202_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906226/db040b1e-f719-ba3f-671a-0812140a5d74.jpeg)

プロジェクトをパッケージ化するには、C++プロジェクトである必要がありますが、おそらく問題なく動くと思います。

# リリース？
プラグインを、マーケットプレイス にリリースするには、
「プラグインのパッケージ化」をする必要がありますが、
自分で使う分には、「プラグインのパッケージ化」はしなくても使えます。

リリース設定に関しては、ayumaxさんの[「UE4マーケットプレイスにC++ Pluginを公開するためのTips」](https://zenn.dev/ayumax/articles/40c150616be3cccc400b)の参照をお勧めします。

「プラグインのパッケージ化」を行い、エンジンプラグイン `Plugins/Marketplace` に置くと、ブループリントプロジェクトで使ってもそのままプロジェクトのパッケージ化が可能になります。
「バージョン毎にプラグインをパッケージ化する必要」があり、「全てのプラットフォーム用にプラグインをパッケージ化するのはだいぶ面倒」なので、生データを共有した方が扱いやすそうだなと思った今日この頃。

一応 GitHub に参考用生データを置いておきます。

https://github.com/O-Y-G/xxxUnlitxxx

# 後記
方法論を検証公開していただいている、[海神 航さん](https://twitter.com/Blasthal/status/1487140457029435392)に感謝致します。
稀に欲しくなる機能な気がするので、この記事が何かの役に立ったらいいなと思います。
気になる点、改善箇所をご指摘いただけると非常に助かります。

https://twitter.com/o_y_g/status/1731334292310217011

Qiitaの↓コメントか、↑リプライでいただけると嬉しいです。

アドベントカレンダーの風習がよくわからないまま毎年参加していますが、
今年もたくさんの記事楽しみですね。

https://qiita.com/advent-calendar/2023/ue