BLOGブログ

2024.02.07UE5UE/ C++

[UE5] C++を使ってCurveアセットで動くドアをつくろう!

執筆バージョン: Unreal Engine 5.3

あいさつ

皆様こんにちは。

ゲーム開発の中盤~終盤で、「CPU処理が重いから最適化してほしい」「BPのTickは重いからC++にしよう!」
なんてことよくありますよね?
実際にはBPの処理負荷が増える原因はループ処理や配列処理の書き方によるものですが、
「C++で書けるならそれに越したことはない!」ということで、書き方を学んでいきましょう!

要件

まずは今回の要件はこちらになります

①レベルに配置するアセットはBlueprint
②回転開始のイベントはBlueprintから呼び出す
③回転動作の処理はC++に記述
④ドアの動き方をCurveAssetでいじれるようにする

プロジェクトの用意

今回はC++を使いますので、C++が有効になったプロジェクトを用意していきます。
テンプレートに関してはFirst Personを使っていきます。

 

ドアクラスの作成

「Tools」のメニューから「New C++ Class…」を選択します。

今回は親クラスにはActorを指定します。

追加するクラス名を「MyDoor」として、ヘッダーファイルとcppファイルを作成します。

C++側でドアの実装

作成したADoorクラスに以下の定義と処理を記述します。
ポイントは「UPROPERTY(EditDefaultsOnly)」を指定することで
開いたときの角度と開閉時の動き方をBPクラス側から指定できることと、
「 UFUNCTION(BlueprintImplementableEvent)」を指定した関数を使って、
BPクラス側で用意した回転の支点となるコンポーネントを取得できることです。

BlueprintImplementableEventを使うと、C++のヘッダーで宣言をしたうえで
BPクラス側でオーバーライドして実装を記述できるため、C++から呼び出せるBPイベントを作ることができます。

カーブアセットの用意

ここからはエディタでの作業です。
ContentDrawer(またはContentBrowser)からAdd→Miscellaneous→Curveと選択し、CurveFloatを選択します。
アセット名はCV_Doorとしておきます。

ドアの開き方はこんな感じにしてあります。
 

BP側でドアの実装

以下の画像のようにコンポーネントを追加します。
それぞれ追加する際のクラスはこちらです。
RotationRoot:SceneComponent
Cube:StaticMeshComponent
Box:Box Collision

CubeはMeshにはBasicShapesのCubeを指定したうえで、2枚目の画像のように大きさと位置を調節してください。
Boxコリジョンの大きさと位置に関してはドア(Cube)の周りになるように適切と思う位置に配置してください。

コンポーネントの追加等が終わったら、EventGraphに処理を書きます。

 

BlueprintImplementableEventでBPクラス側で実装するようにした「GetRotationRoot」を実装します。
FUNCTIONSのOverrideから「GetRotationRoot」を選び、関数定義を作成します。
作成できたら2枚目の画像のように「RotationRoot」をReturnValueに繋ぎましょう。

 

ここまでの設定が終わったらEditDefaultsOnlyでBPクラス側から指定可能にした変数を変更していきます。
ClassDefaultsを押した後、DetailsタブからOpenAngleとMovementCurveを指定します。

動作チェック

カーブアセットの用意で作成したCV_Doorを使用した際の挙動です。クリックすると再生されます。
完成したドアの挙動はこちらのgifです。
無事ドアに近づくと開き、離れると閉じていますね。

ここでもう一つカーブアセットを用意してみます。
先ほどよりも早く動作し、最後に揺れるようにしています。

BP_DoorのMovementCurveを差し替えた挙動はこちらのgifです。クリックすると再生されます。
ちゃんと挙動が変わりましたね。

 

さいごに

Curveアセットはこだわりの挙動を作る際にとても便利な調整方法ですが、
C++で使っている記事が少なかったので今回のブログを執筆いたしました。
今回使用したUCurveFloat以外にもVectorならUCurveVector、
リニアカラーならUCurveLinearColorなど対応したものがあります。

Curveアセットをはじめ、UEにはエディタで調整する便利なアセットが多数あります。
用意や調整はエディタでしかできませんが、値の取得などはC++でも可能なので、
今回紹介した方法等でC++側から参照して活用できるといいですね!