【UE4】 C++で作ったヘッダーファイルの説明【UnrealEngine】【C++】

UE4のBlueprintはとても便利ですけど、Blueprintだけでは補えない処理が出てくることもあります。。
その際にC++を使って解決する必要が出てきます。
今回は、UE4でのC++のヘッダーファイルについて詳しく説明します。

作り方
------------------------
![C.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/ea6655be-23a8-3a45-f6c3-dceb9268b96b.gif)

右クリックして新規C++クラス作成を選択

![oyakurasu.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/497331/8e742c86-1bd9-4a62-5cd6-ee9e242fb2b3.png)

親クラスの選択を選択してUE4がテンプレートでソースコードを作成します。今回はアクターを選択。名前をMyActorに

生成されたクラスのヘッダーファイルを確認する
-------------------------------------

何かクラスを作った際にヘッダーファイル(.h)に下記のコードが記述されています。
UE4では独自の拡張により作法があるようなのでそれを一つずつ解説していきます。

※普段DirectXを使用してゲームを使る際に使うC++とは別物

	#pragma once

	#include "Engine.h"
	#include "CoreMinimal.h"
	#include "GameFramework/Actor.h"
	#include "MyActor.generated.h"
	
	UCLASS()
	class MYPROJECT_API AMyActor : public AActor
	{
		GENERATED_BODY()	
	public:	
		AMyActor();
	
	protected:
		virtual void BeginPlay() override;
	
	public:	
		virtual void Tick(float DeltaTime) override;
	
		UPROPERTY()
			int param;
	
		UFUNCTION()
			void Function();
	
	};

##include "Engine.h" 
UE4の機能がまとめられたライブラリを使用する為に必要なヘッダーです。

##CoreMinimal.h
UE4で作られている VectorやFloat32などを利用するために必要なヘッダーをまとめたヘッダーファイルです

##GameFramework/〇〇.h
継承元のヘッダーファイルです。Actorを継承していたらActor。Pawnを継承していればPawnになっていると思います。

##〇〇/generated.h
後から説明するマクロに基づいて、UHTが自動的に作成された結果が格納されていて。
全てのアクタークラスは絶対にIncludeする必要があります。
また初心者が陥りやすいエラーとしてこのIncludeは
#####必ず一番最後にインクルードする必要があります

具体的な理由が
↓
[Unreal C++で、５分ぐらい詰まったコンパイルエラーの話](https://blog.i-fromjapan.com/entry/2016/10/19/202750)

UCLASS()とUPROPERTY()とUFUNCTION()
-------------------
マクロをクラス・変数・関数の上に記述するとUE4側に公開し認識できるようになり、管理してくれるようになります、
(ガーベジコレクションの対象になったり、シリアライズ、ブループリントで使用できたり、関数がエンジン側のインプット処理との連携が出来るようにする等)
最初はとにかく何か作る上には必ずマクロを記述しておくでいいかと。


各マクロの指定子一覧
-----------------------------------------
マクロは()の中に指定子を追記し、性能を変えることができます。(,)で複数指定子を入れることもできます。

##UCLASS(クラス)
 （）の中       |      内容　　 |   
|:-----------------|------------------:|
| BlueprintType           |            ブループリントの変数に使用できるタイプに変更する| 


[全クラス指定子一覧](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/Reference/Classes/Specifiers/index.html)

## UPROPERTY (変数)　
 （）の中      |       内容         |
|:-----------------|------------------:|
| EditAnywhere             |     エディタのプロパティウィンドウで編集を可能にする (Unityで言うSerializeField)       |
| BlueprintReadWrite           |      変数をBlueprintで実行でき表示され読み書きできるように設定する       |
| Category="カテゴリ名"          |           BluePrintで表示される際のカテゴリを指定　|

[全変数指定子一覧](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/Reference/Properties/Specifiers/index.html)

##UFUNCTION (関数)

 （）の中      |       内容         |
|:-----------------|------------------:|
| BlueprintCallable           |        Blueprintで実行でき表示されるように設定する       |
| Category="カテゴリ名"          |           BluePrintで表示される際のカテゴリを指定　|


[全関数指定子一覧](https://docs.unrealengine.com/ja/Programming/UnrealArchitecture/Reference/Functions/Specifiers/index.html)


GENERATED_BODY()
-----------------
UE4との連携に必要。
コンパイルの前にUnrealビルドツール(UBT)によって、オブジェクトの本体内にコードが挿入されるようにするマクロでクラスの始まりに必ず書く必要があります


その他エラーになる行為
---------------
1.ヘッダーで作った関数はソースファイルに作成しないままにするとエラーが出る。


まとめ
-----------
基本的なUE4のヘッダーファイルの説明でした。特殊な記述のルールは慣れていくしかなさそうです。
次は関数の説明する予定。他にも何か分かり次第追記していきます。

-------------------
参考にさせて頂いたサイト
[UE4 よく使うUPROPERTYメモ](https://qiita.com/bigengelt/items/b17545fffe7b8d69e5e8)