PaperSloth’s diary

Unity(C#)、UE4(Blueprint/C++)についての記事を書いたり日常のことをつぶやきます。

UE4 ProjectのCopyrightの変更方法

目次

・Copyrightの変更方法

環境

・Unreal Engine4.17.2

Copyrightの変更方法

UE4C++コードを追加した際に最初の行にCopyrightを記載してくださいという旨が表示されます。

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "ClassName.generated.h"

文章のままなんですが、Project Settingsから変更を行います。
下図のようにProject Settings → Project - Description内にあります。
f:id:PaperSloth:20171115231358p:plain

あとはここを書き換えるだけで、新規C++クラスを作成した際にCopyrightが追加されます。

また、以前から改善の要望はでているのですが、複数行のCopyrightを記述することができません。
エンジンを直接書き換えれば実現は可能なのですが、このためだけに改造するのは避けたいですね。

該当箇所は下記になります。
/Engine/Source/Runtime/EngineSettings/Classes/GeneralProjectSettings.h

修正前

	/** The project's copyright and/or trademark notices. */
	UPROPERTY(config, EditAnywhere, Category=Legal)
	FString CopyrightNotice;

修正後

	/** The project's copyright and/or trademark notices. */
	UPROPERTY(config, EditAnywhere, Category=Legal, meta = (MultiLine = "true"))
	FString CopyrightNotice;

おそらくこれで正しく動作すると思います。
このためだけにカスタムビルドを作成するのは手間なので、動作は未確認です・・・

UE4 ゲーム内で動画を再生する方法

目次

・動画再生可能なフォーマット
・動画再生を行うには
・まとめ

環境

・Unreal Engine4.17.2
・Windows10

Mac, Linux, iOS, Android等の確認は行っていません。

動画再生可能なフォーマット

Platformごとに使用可能なフォーマットは公式ドキュメントに記載があります。
Unreal Engine | メディア フレームワークの技術リファレンス

サポート対象のファイル、URL、キャプチャ デバイスより2017/10/30段階での対応画像も貼っておきます。
f:id:PaperSloth:20171030234044j:plain

Windowsで.aviと.mp4が対応されていることが確認できました。
今回はこの2つの動画フォーマットについて書きます。
他のフォーマットでもプラットフォームで対応されているものであれば、再生可能だと思います。

動画再生を行うには

Windowsで再生するためには
 Windowsで再生をするためには下記プラグインを有効にする必要があります。
 基本的には有効になっているかと思いますが、パッケージ容量削減のために無効にしている場合は注意が必要です。
 f:id:PaperSloth:20171030235522p:plain
WMFとはWindows Media Foundationの略称です。
Microsoft Media Foundation (Windows)

調べてみると難しそうな用語が並んでいますが、ざっくりいってしまうと
「マルチメディアを扱うためのMicrosoftAPI群」です。


②動画をインポートする
先ず、動画の保存先には注意が必要です。

Content/Movies以下に動画ファイルを保存する必要があります。

続いて.aviと.mp4で違いがあります。

先ずはaviについて。
こちらは凛さんがブログにまとめてくださっています。
UE4 UMGでムービー(動画)を再生する 凛(kagring)のUE4とUnityとQt勉強中ブログ

直接Media Playerが生成されれば、そこからMedia Textureを生成してマテリアルに適用する等で直ぐに再生が可能ですね。


続いてmp4の場合について。
mp4をインポートしてみると下図のようにFile Media Sourceが生成されると思います。
f:id:PaperSloth:20171031001221p:plain


Windowsで再生するために設定を変更する
先程インポートして生成されたFile Media Playerの
Windowsの欄をWMFに変更します。
この際に①で挙げたプラグインのWMF Media Playerが無効だと選択できません。
f:id:PaperSloth:20171031001835p:plain


④Media Playerを作成する
MediaからMedia Playerを作成します。
f:id:PaperSloth:20171031002505p:plain

すると下記のWindowが表示されます。
今回は動画ですので、下のVideoにチェックを入れましょう。
f:id:PaperSloth:20171031003232p:plain

作成すると下記のように
Media PlayerとMedia Textureが作成されます。
f:id:PaperSloth:20171031003429p:plain


Media Playerを開いてみると下図のようなUIが表示されると思います。
そこで、Playを押下して動画が正しく再生されることを確認しておきましょう。
今回はテスト用にContentExampleのMediaExampleを使用してみました。
f:id:PaperSloth:20171031002800p:plain


⑤再生する
再生するためにはマテリアルを作成する必要があります。
今回はStaticMeshに貼り付けてみました。
UIで表示したい場合は先程の凛さんのブログが参考になります。
基本的にはマテリアルがSurfaceかUserInterfaceかくらいの違いしかありません。
f:id:PaperSloth:20171031004537p:plain


f:id:PaperSloth:20171031004621p:plain


このマテリアルをStaticMeshに貼り付けただけでは再生されません。
Media Playerの設定を確認してましょう。
確認すべき箇所はDetailsのPlaybackの項目です。
f:id:PaperSloth:20171031004904p:plain

- Play on Open
Open Source等のノードが呼び出された際に自動で再生するか
- Shuffle
Play Listを設定した場合にシャッフル再生を行うか(動作未確認)
- Loop
動画再生終了時にループ再生を行うか


今回はPlay on Openだけチェックが入っていることを確認しましょう。


最後に再生したいタイミングで(今回はレベル開始時)Open Sourceを呼び出します。
Media Playerの変数を作成して、そこに再生したいMedia Sourceを登録するだけです。
f:id:PaperSloth:20171031011434p:plain

もしも、Play on Openにチェックを入れていない場合は下記のようにPlayノードを呼び出します。
f:id:PaperSloth:20171031005511p:plain


しかし、これでは動作しないことがあります。
その場合はDelayを入れるか別のタイミングでPlayを呼び出してみましょう。

f:id:PaperSloth:20171031005639p:plain


Planeに貼り付けてみるとこんな感じになりました!
f:id:PaperSloth:20171031010048p:plain

まとめ

説明が長いせいで複雑な印象を与えてしまったかもしれません。
簡単におさらいします。
①動画インポート
 File Media Sourceの設定を変更
②Media Player作成(同時にMedia Textureも作成される)
③Media Textureを使用したMaterial作成
 UIの場合はUserInterfaceに変更しておく
④MediaPlayerの変数を作成
⑤OpenSource, Playノードを呼び出す
Media Playerで再生しようとした時にエラーが出た場合は動画の保存場所を疑ってみましょう。
Content/Movies以下に保存する必要があります。


・使用例
VRと組み合わせることで映画館が作れそうですね。
インゲームではPVを流したり、チュートリアルの説明に活かせそうです。


・プラットフォーム対応について
今回は説明が長いため、省略しましたがプラットフォームごとに別の解像度、別のフォーマット、別の動画を再生したい場合
Media/Platform Media Sourceを使用しましょう。
すると、プラットフォームごとのFile Media Sourceの設定が可能になります。

UE4 検証で使用する際のBlueprint運用

目次

デバッグ用、無効なノードを設定する
・検証用のノードを用意する
・まとめ

環境

・Unreal Engine4.17.2

デバッグ用、無効なノードを設定する

Unreal C++で開発を行っている際はプリプロセッサの定義済みマクロを使用してDebug用のコードや検証用のコードを記述すると思います。
Blueprintではプリプロセッサ命令ほど便利ではありませんが、Compile Optionという便利な機能が用意されています。


Compile Optionを使用するにはエディターの環境設定を変更する必要があります。
Editor Preferences → ContentEditors → Blueprint Editorの中に設定項目があります。
Experimental → Allow Explicit Impure Node Disablingを有効にしましょう。
言葉で説明すると複雑ですが、図の項目を有効にするだけで使用可能になります。
f:id:PaperSloth:20171008002135p:plain


ノード上で右クリックするとCompileOptionsが選択できます。
f:id:PaperSloth:20171008001340p:plain

選択できるオプションは3つ用意されています。
 1.Disable(無効化)
 2.Enable Always(有効化)
 3.Enable Development Only(DevelopmentBuildで有効化)

Disableにすると上記画像のようにノードが半透明の状態になります。
EnableはAlways, Development Onlyのどちらにしても見た目上の違いがなさそうなので運用に注意が必要です。


検証用のノードを用意する

※ここで紹介する手法は個人的にこういうやり方をしているというだけの事例紹介です。

先ず、Blueprintで開発を行っているとプロジェクトが進むにつれてBlueprintが複雑になっていくと思います。
特にプレイヤー関連は大凡どのジャンルのゲームでもBlueprintが肥大化してしまうと思います。
下記はRoboRecallのプレイヤー関連のノードです。
f:id:PaperSloth:20171008005032p:plain

特別複雑でもないので追えなくはないですが、もう少し整理できそうな感じですね。

では、複雑にならないようにするために。
検証でどかっと書いた部分を分けることが出来れば整理する時にも楽そうだなと感じます。


それでは私が使用している手順を紹介します。

①BeginPlay, Tickをメイン開発用と検証用で分ける。
下図のような感じで複雑に組まれたプレイヤーがあると仮定します。
図ではノード一つですが、ごちゃごちゃしていると想像してください...
f:id:PaperSloth:20171008011009p:plain

そこに下図のような感じで検証用の初期化関数と更新関数を追加します。
今回はCustom Eventで追加しました。
f:id:PaperSloth:20171008011417p:plain

検証用のノードは先程紹介したCompile Optionを設定して開発専用にしたり無効にしたりします。
こうすることで大きなPlayerのBlueprintを複製せずとも検証用の要素を気軽に追加できます。


②検証用ノードを明確に分かるようにする。
単純にCustom Eventを追加しただけでは、管理の複雑さは変わりません。

そこで、検証用は全てEvent Graphを分けます。
Event Graphの追加はMy Blueprint WindowのGraphsから行えます。
f:id:PaperSloth:20171008012106p:plain

今回は下図のように追加しました。
f:id:PaperSloth:20171008012430p:plain

これで準備は整いました。
あとは検証用のノードグラフに好きなように色々と記述してください。
f:id:PaperSloth:20171008012957p:plain

Custom EventのCompile Optionsを変更して不要な検証用の要素は手軽に無効にできそうですね。
こんな感じで思い切ってEvent Graphを分けてみるのもいいかもしれません。

・まとめ

- BlueprintのCompile Optionsを活用しよう
 ただし、この機能は4.17.2時点でもまだ実験的機能なので注意。

- Event Graphを分けよう
 今回の使い方に限らず、Blueprintの管理がもっと簡単になるはず。
 ただし、何事もほどほどに。増やし過ぎると管理できなくなってもっと複雑になります。

- 今回検証していないこと
 Development Only, Disableにしていた場合に呼び出し先で
他のActorとの依存関係があった場合はパッケージングした際に未使用にも関わらずパッケージ内に含まれたりしないか。

UE4 Blueprintの親クラス変更方法

目次

・親クラスの確認方法
・Blueprintの親クラスの変更方法

環境

・Unreal Engine4.17.1

親クラスの確認方法

Blueprintを開くと右上にParent class: xxの記載があります。
ここのxxが親クラスにあたります。
クラス名をクリックした場合に親クラスがC++クラスの場合はVisual Studioでそのクラスが定義されているファイルが開かれます。
f:id:PaperSloth:20171003212100p:plain


Blueprintを継承したBlueprintの場合は下記のような表示になります。
名前をクリックしても特に何も起こりません。
右の虫眼鏡をクリックするとContent Browserでの親Blueprintの位置を示してくれます。
さらに右のマークをクリックすると親Blueprintを開きます。
f:id:PaperSloth:20171003212251p:plain


Blueprintの親クラスの変更方法

先ずはClass Settingsタブを選択します。
選択すると下図のようにDetailsウィンドウで親クラスが何を指しているかを確認することができます。
f:id:PaperSloth:20171003213107p:plain

この状態でParent Classをクリックすると
下図のようにドロップダウンリストが展開されます。
あとは変更したいクラスを選べば親クラスが変更されます。
f:id:PaperSloth:20171003213339p:plain

ただし、クラスによってはC++側で追加されているComponent等もあるため
大きなBlueprintの親クラスを変更するのはあまりオススメしません。
その際に参照しているComponentがあった場合はエラーになってしまいます。

Tips

親クラスを選択する際に白と青色でクラス名が表示されているのには気付いたでしょうか?

で表示されたクラス:Level上に直接配置できない
 例:GameMode, PlayerController ...etc
で表示されたクラス:Level上に直接配置できる
 例:Actor, Character ...etc

といった違いがあります。
以上!知ってるとちょっとだけお得な情報でした。

UE4 Widgetで小数点の任意桁数の表示

目次

Widgetで小数点を表示

環境

・Unreal Engine4.17.0 Preview2

Widgetで小数点を表示

今回はToTextを使用しています。
ここで小数点第何位までの表示を行うかの任意の桁数を指定することができます。
f:id:PaperSloth:20170724215523p:plain


・RoundingMode
 四捨五入する際の式のタイプ(説明文はカーソルを合わせた際の説明文を引用)

- Half to Even    :最も近い値に丸めます。
  例:1.5 -> 2 0.5 -> 0
- Half from Zero   :最も近い値に丸めます。
  例: -0.5 -> -1.0 0.5 -> 1.0
- Half to Zero    :最も近い値に丸めます。
  例: -0.5 -> 0 0.5 -> 0
- From Zero      :ゼロから遠い値へ端数処理を行います。
  例: -0.1 -> 1 0.1 -> 1
- To Zero       :ゼロから近い値へ端数処理を行います。
  例: 0.1 -> 0 -0.1 -> 0
- To Negative Infinity:より大きな負の値へ端数処理を行います。
  例: 0.1 -> 0 -0.1 -> -1
- To Positive Infinity:より大きな正の値へ端数処理を行います。
  例: 0.1 -> 1 -0.1 -> 0

・UseGrouping
 ","での桁数区切りを行うかのフラグ

 例:1000000
使用した場合  -> 1,000,000
使用しない場合 -> 1000000

・Minimal Integral Digits 整数部の最小表示桁数
・Maximum Integral Digits 整数部の最大表示桁数
・Minimal Fractional Digits 小数部の最小表示桁数
・Maximum Fractional Digits 小数部の最大表示桁数


すごく雑なリファレンスになってしまいましたが、以上です。
桁数の指定で複雑な計算をしている方がいたので、そういった方の役に立てばいいと思いメモ程度に残しておくことにしました。

UE4 2の累乗か否かを判定する関数

目次

・2の累乗かを判定
・BPとUnreal C++での違い
・まとめ

環境

Visual Studio Community 2015
・Unreal Engine4.16


2の累乗かを判定

以前にBP MacroLibraryで2の累乗か否かを判定するマクロを制作しました。
その際は0, 0以下でエラーになることを指摘いただいた方々ありがとうございました。

・使用用途
 Textureのサイズが正しく2の累乗になっているか等で使用します。
 ゲーム中に使うよりはツール制作でのTextureの検索等で使うことが多いと思います。

今回は2の累乗の計算をビット演算を使って行っています。
ビットごとの AND 演算子 (&)

UObjectを親としたBlueprintMacroLibraryに追加しました。
下記はUObjectを継承したクラスから呼び出すことができるものです。
f:id:PaperSloth:20170708002659p:plain

呼び出し
f:id:PaperSloth:20170708002706p:plain

・計算
本当に2の累乗になっているかを見てみましょう。
value = 2のケース
(value & (value - 1)) == 0)

↓ 値を入れて2進数として見てみます。

(0010 & (0010 - 0001)) == 0)

0010 (value)
AND 0001 (value - 1)
----
0000 (結果)
結果が0なのでこれは2の累乗となります。

value = 7のケース
0111 & 0111 - 0001

0111 (value)
AND 0110 (value - 1)
----
0001 (結果)
結果が1なのでこれは2の累乗ではありません。

また、0の場合にもこの判定では2の累乗であるという結果が返ってきてしまいます。
しかし、0は2の累乗ではないため、最初の判定でfalseを返すようにしています。


少し話が逸れますがMath Expressionは非常に便利なので積極的に使っていきましょう
下記は

(value > 0) && ((value & (value - 1)) == 0)

の中身です。
f:id:PaperSloth:20170708002937p:plain


MathExpressionは数式を入力することで計算結果を得られます。
BPで計算を長々と行うとノードが肥大化して可読性が下がるため、必要に応じて使いましょう。
公式ドキュメントで使用可能な演算子などが載っています。
Unreal Engine | Math Expression ノード

BPとUnreal C++での違い

さて、先程のマクロを見て疑問を感じた方もいると思います。

value > 0

という判定部分です。
unsignedにすれば良いのではないかと思った方もいるかもしれません。
unsignedを雑に説明するとマイナスの数値を扱うか否かの指定です。
通常はsignedでマイナスの数値が扱えるようになっています。

これには理由があります。
あまり話題に上がらないのですが、

Blueprintではunsignedを指定できません。

Unreal C++では下記のような記述になると思います。

// header
bool IsPowerOfTwo(const uint32 value);

// cpp
bool ClassName::IsPowerOfTwo(const uint32 value)
{
    if (value == 0)
        return false;
    return !(value & (value - 1));
}

そこで、Unreal C++側でUBlueprintFunctionLibrary等を使用してuint32を指定したらどうか?と思うかもしれません。

UCLASS()
class PROJECTNAME_API UExampleBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
    GENERATED_BODY()
	
    UFUNCTION(BlueprintPure, Category = Math)
        static bool IsPowerOfTwo(const uint32 value);
};
bool UExampleBlueprintFunctionLibrary ::IsPowerOfTwo(const uint32 value)
{
    if (value == 0)
        return false;
    return !(value & (value - 1));
}

しかし、その場合は下記のようなエラーとなります。
"Error: Type 'uint32' is not supported by blueprint."
先も述べたようにBPではunsigendをサポートしていないからです。


よって、Unreal C++でBPに公開可能な同様の関数を定義したい場合は下記のようになります。

// header
UFUNCTION(BlueprintPure, Category = Math)
    static bool IsPowerOfTwo(const int32& value);

// cpp
bool UExampleBlueprintFunctionLibrary ::IsPowerOfTwo(const int32& value)
{
    if (value <= 0)
        return false;
    return !(value & (value - 1));
}

値渡しで使うことも少なそうな関数だったため、参照渡しに変更しています。
f:id:PaperSloth:20170708010141p:plain

因みにBPからも参照渡しの指定は可能です。
Pass-by-Referenceにチェックを入れるだけです。
f:id:PaperSloth:20170708010623p:plain

まとめ

今回伝えたかったことは2点です。
・Blueprintからはunsigned(プラスのみの指定)が使用できない
・MathExpressionは便利。使いどころを見分けて複雑な計算を整理しよう。

UE4 C++とUnreal C++の列挙型の扱い

目次

・結果
enumの種類
・まとめ

環境

Visual Studio Community 2015
・Unreal Engine4.16

結果

まず最初に結果を述べます。
Unreal C++では下記のような書き方が良さそうです。

UENUM(BlueprintType)
enum class EMusicType : uint8
{
    MT_Alternative UMETA(DisplayName="Alternative"),
    MT_Classic     UMETA(DisplayName="Classic"),
    MT_Dance       UMETA(DisplayName="Dance"),
    MT_Pop         UMETA(DisplayName="Pop"),
    MT_Rock        UMETA(DisplayName="Rock"),
};

DisplayNameを別途分けるか下記のような記述にするかは好みの問題だと思いますので、どちらでも。

UENUM(BlueprintType)
enum class EMusicType : uint8
{
    Alternative,
    Classic,
    Dance,
    Pop,
    Rock,
};

では長々と説明していきます。

enumの種類

先ずは通常のC++でのenumについてです。

enum Color
{
    Red,
    Green,
    Blue
};

最もよく見てきた宣言だと思います。

続いてUnreal C++でのenumについてです。
Unreal C++では"UENUM"を使用する必要があります
また、コーディング規約として接頭詞にEを付けます。

UENUM()
enum EColor
{
    Red,
    Green,
    Blue
};

これがUnreal C++での標準的な列挙型になります。
しかし、この場合は下記のようにプロパティ宣言するとエラーになります。
詳細は後ほど。

UENUM(BlueprintType)
enum EColor
{
    Red,
    Green,
    Blue
};

// ~省略~

UPROPERTY(BlueprintReadWrite, Category = Color)
    EColor ColorType;

続いてC++ではnamespaceを使用して宣言を行うようになりました。
理由としてはenumの名前をグローバルスコープにしないためです。

namespace Color
{
    enum Type
    {
        Red,
        Green,
        Blue
    };
}

上記の宣言はUnreal C++でも取り入れられました。
"KismetMathLibrary.h"で宣言されているものです。

UENUM(BlueprintType)
namespace EEasingFunc
{
    enum Type
    {
        Linear,
        Step,
        SinusoidalIn,
        SinusoidalOut,
        SinusoidalInOut,
        EaseIn,
        EaseOut,
        EaseInOut,
        ExpoIn,
        ExpoOut,
        ExpoInOut,
        CircularIn,
        CircularOut,
        CircularInOut,
    };
}

しかし、この記述ではローカルで宣言されたenumは、名前空間を使用出来ません。
この場合、ローカル構造体の中にenumを宣言します。

class FontColor
{
    struct Color
    {
        enum Type
        {
            Red,
            Green,
            Blue
        };
    };
}

これに関してはUE4でも同様のようです。
フラグとして使用している部分ですので、参考としてはイマイチですが
"UnrealClient.h"内で宣言されています。

class FViewportClient
{
public:
    struct ESoundShowFlags
    {
        enum Type
        {
            Disabled = 0x00,
            Debug = 0x01,
            Sort_Distance = 0x02,
            Sort_Class = 0x04,
            Sort_Name = 0x08,
            Sort_WavesNum = 0x10,
            Sort_Disabled = 0x20,
            Long_Names = 0x40,
        };
    };
// ~省略~
}


C++11からはenum classを使ってスコープを扱えるようになりました。

enum class Color
{
    Red,
    Green,
    Blue
};

Unreal C++もベースはモダンなC++11, 14のため、早速取り入れられています。
"ReflectionCaptureComponent.h"内で定義されています。

UENUM()
enum class EReflectionSourceType : uint8
{
    CapturedScene,
    SpecifiedCubemap,
};

また、UPROPERTYでBPに公開するenumを持たせたい場合は原則としてモダンな書き方にする必要があります。

UENUM(BlueprintType)
enum class EMusicType : uint8
{
    MT_Alternative UMETA(DisplayName = "Alternative"),
    MT_Classic     UMETA(DisplayName = "Classic"),
    MT_Dance       UMETA(DisplayName = "Dance"),
    MT_Pop         UMETA(DisplayName = "Pop"),
    MT_Rock        UMETA(DisplayName = "Rock"),
};

// ~省略~
UPROPERTY(BlueprintReadWrite, Category = Music)
    EMusicType MusicType;


下記の場合は全てUPROPERTYでBPに公開する事ができません。

enum EMusicType 

enum EMusicType : uint8

namespace EColorType {
    enum Type

namespace EColorType {
    enum Type : uint8

enum class EMusicType

無事にBPに公開できれば下記のようにGetして使うことが出来ます。
f:id:PaperSloth:20170707005116p:plain


まとめ

UE4でもエンジンコード内に旧形式のコードがあります。
徐々にモダンなC++に移行しています。
探せばnullptrでなくNULLも残っています。
理由としては変更に対する費用対効果が薄い。というもののようです。

エラーになる箇所やバグを生む危険性のある箇所はちゃんと修正してくれています。
おとなしく待ちましょう。
そして、見つけたら報告しましょう。
できればUDNで。
https://udn.unrealengine.com/users/login.html

無理ならAnswer Hubで。
Japanese - UE4 AnswerHub

日本語の誤植等はForumで。
日本語ドキュメント 誤植&誤訳 投稿所

そして、我々Engineを使う側の人間はモダンなC++を覚えましょう。