UE C++ Battery Collector02 v5.5

ThirdPersonBatteryCollector
〇今回は、ピックアップ(拾い上げる)する物の親クラスである「Pickup」クラスを作成していきます。
※下図の赤枠部分が該当します。
〇「Pickup」クラスを作る
・下図のフォルダ先(C++クラス>BatteryCollector)で、コンテンツブラウザを右クリック>「新規C++クラス」を選択
※C++クラスウィザードによって、自動的にUE独自のテンプレートが作られる。
〇「C++クラスを追加」ウィザードが表示される
・「親クラス」で「Actor」を選択し、「次へ」をクリック。
※キャラクターが、ピックアップとインタラクトするために、親クラスをActorとする。
・ファイル名を「Pickup」にして、「クラスを作成」をクリック。
※ヘッダファイルとソースファイルが作成される>プロジェクトにコードが追加される。
・念のため、VisualStudioでビルドを行い、エラーが無いことを確認する。
〇クラス作成後にVisual Studioが起動されるので、確認作業
・Gamesフォルダの下に「BatteryCollector」があります。
・「BatteryCollector」を展開すると、「Configファイル」や「GameMode」のためのソースファイル、プロジェクト固有のヘッダなどが入っていることが確認出来ます。
※先程作成した、「Pickup」クラスも作成されていることが確認出来ます。
〇Pickup.cppを開いて、コードを確認
・4行目:ヘッダーファイルのインクルード
・コンストラクタの10行目では、Tickが有効化されている。
・ピックアップでは、Tickは不要なので、falseを設定して、無効にしておきます。
【変更作業】PrimaryActorTick.bCanEverTick = false;
・Tickを無効化したので、定義自体を削除してもよいです。
※呼ばれないので、残しおいてもよいです。
〇Pickupクラスの作成
・Pickpup.h・・・①②をコーティングしてください
①変数宣言
private:
class UStaticMeshComponent* PickupMesh;
【解説】
・可視化するためにスタティックメッシュを追加>privateにして、このクラスでのみ設定・変更可とする。
・これで、他のクラスやブループリントから、直接この「StaticMeshComponent」にはアクセスできなくなる。
・classは前方宣言
(このヘッダファイル内に「StaticMeshComponent」のヘッダファイルのインクルードもできるが、単にUStaticMeshComponentへのポインタが必要なだけなので、ここでは前方宣言として、ソースファイル(.cpp)の方でヘッダのインクルードを行うことにする)
②UPROPERTY設定
UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = "Pickup", meta = (AllowPrivateAccess = "true"))
【解説】
・コンポーネントは基本的に変数とみなされる。
・VisibleAnywhere:どこでも可視化。
・BlueprintReadOnly:BP上からは読み取りのみが可能。
・Category:詳細パネルで、Pickupカテゴリの下に、メッシュが表示されることになる。
・meta = (AllowPrivateAccess = "true"):privateのアクセスを可能にする。
※privateで変数宣言(class UStaticMeshComponent* PickupMesh;)している点では、コンポーネントに特有のものであるが、メッシュのプロパティをブループリントやレベル内から変更できるようにしたい場合がある。例えば、どのスタティックメッシュを適用するか、どのようなサイズにするかなどのプロパティを変更したい場合に指定する。
※このようなキーワードの書き方は、多くのテンプレートコードでよく見かける形式で、特にコンポーネントでは多い。(C++のテンプレートプロジェクトを作ることで確認出来る)
〇ここまでの完成形です。
・「Ctrl + Shift + B」で、ビルドエラーが無いことを確認しておきましょう。
〇privateのPickupMesh変数のアクセサ関数を作成
Pickpup.h
public:
FORCEINLINE class UStaticMeshComponent* GetMesh() const { return PickupMesh; }
【解説】
・この関数は、ピックアップアクタのメッシュのアドレスを返します。
・FORCEINLINE:C++ キーワードの inline ではなくて、コンパイラーの独自拡張によるより強制力の高い inline 関数を指示するキーワードへ置換される UE定義のマクロ
(参考サイト https://usagi.hatenablog.jp/entry/2017/06/14/152825)
・class:前方宣言
・const:変更不可(ここでは、メンバ関数の後ろに書かれているので、関数内でメンバ変数の値は変更できない)
〇ここまでの完成形です。
・「Ctrl + Shift + B」で、ビルドエラーが無いことを確認しておきましょう。
〇コンストラクタでの設定
Pickup.cpp
PickupMesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("PickupMesh"));
RootComponent = PickupMesh;
【解説】
・CreateDefaultSubobject:コンストラクタ内でコンポーネントを作成するための関数(ヘルパー関数)
※CreateDefaultSubobject<型>(表示用テキスト);

・RootComponent:ルートコンポーネントの設定
※PickupMeshをルートにすることで、サイズや位置はこれが基準になる

・#include "Components/StaticMeshComponent.h"が必要
※Googleなどで「ue UstaticMeshComponent」と検索して、仕様を調べる。

https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Engine/Components/UStaticMeshComponent?application_version=5.2
・リファレンスのIncludeをコピーします。
〇ここまでの完成形
・コピーしたインクルードファイルのパスを、「Pickup.cpp」の5行目に貼り付けます。
・VisualStudioで「Ctrl + Shift + B」でビルド>エラーが無ければOKです。
【UEエディタで、ここまでのPickupを確認】
・C++クラスの「Pickアクタ」をレベルに配置する(後で削除するので場所はどこでもOKです)
・「アウトライナー」で配置した「Pickup」を選択>「詳細」タブに「PickupMesh」コンポーネントがあることを確認します。
・「PickupMesh」コンポーネントをマウスオーバーすると、
PickupMeshと名付けられたStaticMeshComponentが生成されていることが分かります。
・確認が出来たら、「アウトライナー」から「Pickup」アクタを削除しておきます。
・今回はここまでです。
・以上、お疲れ様でした。

タイトルとURLをコピーしました