fc2ブログ

凛(kagring)のUE5/UE4とゲーム制作と雑記ブログ

2016 年から UE4 / 2021年から UE5 を触り始めました。勉強したもののメモ用ブログです。ゲーム制作に関するメモや雑記とか色々あります。C++ での Qt、Unity もほんの少しあります。

2022年04月 | ARCHIVE-SELECT | 2022年06月

| PAGE-SELECT |

≫ EDIT

UE5 C++でのPROPERTY変数のポインタの扱いについて(TObjectPtr)

C++でのPROPERTY変数のポインタの扱いについてのメモです。

公式ドキュメントはこちら。

・Unreal Engine 5 への移行ガイド
https://docs.unrealengine.com/5.0/ja/unreal-engine-5-migration-guide/

上記ドキュメントにあるこの記述になります。

・C++ オブジェクト ポインタのプロパティ

UE5 では、エディタ ビルドでの生オブジェクト ポインタのオプションの代わりとして、
テンプレートベースの 64 ビット ポインタ システムである TObjectPtr が導入
されています。
このシステムは、エディタ ビルドでは動的解決とアクセス トラッキングを追加し、
非エディタ ビルドでは生ポインタと同じ操作を実行します。
TObjectPtr 変数も、関数に渡されるとき、またはローカル変数に格納されるときに、自動的に生ポインタに変換されます。
これまで UPROPERTY 変数の生ポインタを使用していたエンジン クラスの多くは、TObjectPtr を使用するようになります。
TObjectPtr 型とのインタラクションのほとんどは暗黙的に生のポインタに変換されますが、
エンジン クラスのメンバー変数との直接のインタラクションは稀なケースとして
生のポインタのセマンティクスから TObjectPtr のセマンティクスに変更する必要があります。
たとえば、AActor の RootComponent プロパティは
UE4 では USceneComponent* でしたが、UE5 では TObjectPtr です。
USceneComponent* 戻り値型を持つ GetRootComponent への呼び出しは常にそのままにしておくことができますが、
RootComponent との直接の対話については更新が必要な場合があります。

UPROPERTY 変数のポインタ変数「TObjectPtr」を使用することが推奨されているということのようです。

オプションとして、 UCLASS 型と USTRUCT 型にある UObject ポインタのプロパティや
コンテナクラスには T* よりも TObjectPtr の使用をお勧めします。
TObjectPtr は非エディタ ビルドの生ポインタに変換するため、
出荷された製品の動作やパフォーマンスには影響しませんが、
エディタ ビルドでの開発時のエクスペリエンスが向上する
可能性があります。
以下の方法で、プログラミング スタイルをこの新しいポインタ システムに適応させることができます。

・コンテナ関数の「Find」ファミリーを呼び出す場合は、T** ではなく TObjectPtr* を使用して戻り値を取得します。

・生ポインタ コンテナによる範囲ベースのイテレーション処理は、
イテレータ変数の型として auto* を使用している可能性があります。これらを auto& に変更します。
また、TObjectPtr は解決されたオブジェクト アドレスをキャッシュできるため、
将来のアクセス試行時間の節約になるため、新しいコードでは auto& または const auto& の使用をお勧めします。

・生ポインタが必要で、暗黙の変換ができない場合は、TObjectPtr で ToRawPtr または Get を呼び出します。
一般的なケースとしては、三項演算や const_cast の内部などがあります。
関数デリゲートにパラメータを渡す場合は、パラレル デリゲート関数をパススルーとして宣言し、
生ポインタを TObjectPtr パラメータで置き換えます。以下は、パススルー デリゲート関数の例です。

非エディタ ビルドでは生ポインタと同じ動作をするので速度的にも問題ないよ。ということのようですね。

// Original function signature, using raw pointers, which we will use in most cases:
// オリジナルの生ポインタで引数を扱う関数
static bool MyFunction(UObject* FirstParameter);

// In rare cases where implicit conversion is not available, use this pass-through function.
// Pass-through function signature, using TObjectPtr:
// TObjectPtr を使った引数の記述
static bool MyFunction(TObjectPtr FirstParameter);

// Pass-through function body (in the source file):
// TObjectPtr から生ポインタの取得
bool UMyClass::MyFunction(TObjectPtr FirstParameter)
{
return ShouldShowResetToDefault(FirstParameter.Get());
}

基本的には「TObjectPtr」を使うということで問題なさそうですね。

| UE5 | 10:00 | comments:0 | trackbacks:0 | TOP↑

| PAGE-SELECT |