関連ブログ
- [UE4][UE5]開発環境の容量を少しでも減らす 2024.08.14UE
- [UE5] PushModel型のReplicationを使い、ネットワーク最適化を図る 2024.05.29UE
- [UE5]マテリアルでメッシュをスケールする方法 2024.01.17UE
CATEGORY
2020.03.18UE4UE/ C++
執筆バージョン: Unreal Engine 4.24 |
皆さん、アクターのラベル名は活用していますか? レベルにアクターを配置すると、アウトライナ上にそのアクターが追加された事を確認できますが、同じアクターを更にもう一つ置くと、アクター名2といった感じで自動で別の名前になるように命名されると思います。
レベル上に無作為に置くアクターはとくにこの名前を気にする必要はないと思いますが、そうでないアクターにはきちんと名前をつけてあげるべきというのは、UE4ユーザーであれば既に承知の事かと思います。 ですがこの名前を付ける作業、なかなかに面倒だと思いませんか? とくにラベルの命名規則にアクターのパラメーターを使用している場合、パラメーター側を変更したら忘れずにラベル名を変更しないといけません。このワークフローには改善の余地がありそうですね。
そこで今回は、このラベル名を自動的に設定する方法をご紹介したいと思います。 (割と一般的なテクニックだと思ってましたが、いざ検索してみるとなかなか見当たらなかったので) まずラベル名を変更する関数は
1 |
void AActor::SetActorLabel( const FString& NewActorLabelDirty, bool bMarkDirty ) |
になります。 この関数ですが、実は注意が必要です。Actor.hを見るとBlueprintCallableになってるんですが、ヘッダー内をよく見るとWITH_EDITORのスコープ内に入ってしまってます。なのでブループリント内で呼べないんですよね… そして当然呼び出す側でもWITH_EDITORマクロで囲まないと、パッケージ時にエラーが出るのでそこも要注意です。 この注意点さえ気を付ければ後は簡単です。 まずはアクターを基底クラスにしてC++で新しくクラスを作成します。 ヘッダーを以下の通りにします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
UCLASS() class ACTORLABEL_API AMyGimmickBase : public AActor { GENERATED_BODY() public: // ラベル名のPrefix UPROPERTY(EditDefaultsOnly) FString PrefixName; // とりあえず何かしらのID、ラベル名はこれを参照して名付けたい UPROPERTY(EditAnywhere, BlueprintReadWrite) int GimmickID; public: // Sets default values for this actor's properties AMyGimmickBase(); protected: // 配置したアクターのパラメーターが更新された際に呼ばれる関数 void OnConstruction(const FTransform& amp; Transform); // Called when the game starts or when spawned virtual void BeginPlay() override; public: // Called every frame virtual void Tick(float DeltaTime) override; }; |
次にcpp側、今回の肝になる部分です。 OnConstruction関数はブループリントで言うところのConstructionScriptになります。 ここに処理を書くことで、パラメーターを編集した瞬間にラベル名も即変更されるという算段です。
1 2 3 4 5 6 7 8 9 10 11 12 |
void AMyGimmickBase::OnConstruction(const FTransform& amp; Transform) { Super::OnConstruction(Transform); #if WITH_EDITOR // ラベル名の作成 FString NewActorLabelName = PrefixName + FString::FromInt(GimmickID); SetActorLabel(NewActorLabelName); #endif } |
それでは早速このクラスを基底クラスにしたブループリントクラスを作ってみましょう。
作成したブループリントに、デフォルト値のPrefixNameに対して任意の名前を付けてあげます。
あとはこのアクターをレベルに配置してパラメーターを変更すれば、ラベル名が自動的に変更されるのが確認できるはずです。
これでいちいちアクターを配置するたびにラベ名を編集する手間も省けますし、間違った名前になることも防げます。 皆さんも是非活用してみて下さい。 ※昔話 実は昔のエンジンバージョンでこのSetActorLabelをOnConstruction内で呼ぶと、アクターのラベル名が変更された事で再度OnConstructionが再帰的に呼ばれてクラッシュするという現象が起きていました。 その際はSetActorLabelを呼ぶ際にラベル名の更新があったかどうかをチェックする必要がありましたが、今はもう大丈夫です。 昔のエンジンバージョンを使用してる方は下記の回避方法を取るなどしてご注意下さい。
1 2 3 4 |
if (GetActorLabel() != NewActorLabelName) { SetActorLabel(NewActorLabelName); } |