C.K
(C.K)
1
お世話になります。
C++でブループリントクラスを取得したい際にコンストラクタ内であれば ConstructorHelpers::FClassFinderで可能なのですが コンストラクタ以外で記述するとハングアップしてしまいます。 コンストラクタ以外でブループリントクラスを取得する方法はありませんでしょうか。
具体的にやりたいこととしましては複数のプレイアブルキャラクタをゲームの進行状況に合わせて差し替えると いうものです。 ブループリントが以下のように分かれているときに
"/Game/ThirdPersonCPP/Blueprints/Chara001" キャラ1番
"/Game/ThirdPersonCPP/Blueprints/Chara002" キャラ2番
"/Game/ThirdPersonCPP/Blueprints/Chara003" キャラ3番
:
:
ゲームスタート時はキャラ1番で操作していたがメニューで操作キャラを2番に切り替えたので キャラ1番を破棄してキャラ2番をスポーンさせるという流れにしたいです。
コンストラクタで全キャラのブループリントクラスを配列に格納すれば出来そうなのですが 出来れば変数はキャラ番号だけで管理し、必要に応じて生成したブループリントパスからクラスを取得したいです。
ご存じの方がいらっしゃいましたらよろしくお願い致します。
下記のような感じでできると思います。
(Chara001-003がAActorを継承しているBlueprintと仮定しています。)
TSoftClassPtr は UE4.17 までは TAssetSubclassOf と呼ばれているもので UE4.18 で今の名前になっています。
FSoftObjectPath も同じく UE4.17 までは FStringAssetReference と別名なのでご注意下さい。
/* Header */
UPROPERTY()
TSubclassOf<class AActor> Chara001Class;
/* Source */
// クラスを取得
Chara001Class = TSoftClassPtr<AActor>(FSoftObjectPath (TEXT("/Game/ThirdPersonCPP/Blueprints/Chara001"))).LoadSynchronous();
.....
// 後に取得したクラスを用いてアクタを生成する。
ActorSpawnParameters SpawnInfo;
AActor* Chara001Instance = GetWorld()->SpawnActor<AActor>(Chara001Class , SpawnInfo);
C.K
(C.K)
3
ご返信ありがとうございます。
頂いたコードを早速試して見たのですが
LoadSynchronousの戻り値がnullで戻ってきます。
関数リファレンスを確認するとアセットが見つからない場合にnullptrを返すとありました。
引数として渡すアセットのパスはリファレンスビューアで表示されているパスでは適切でないのでしょうか?
ThirdPersoneテンプレートでこの挙動のテストをする為にゲームモードのStartPlayに以下のような記述をしてみたのですが
それでもLoadSynchronousの戻り値がnullになってしまいます。
初歩的な問題で恐縮ですがご確認頂けないでしょうか。
// コンストラクタ
AAssetChangeTestGameMode::AAssetChangeTestGameMode()
{
DefaultPawnClass = APawn::StaticClass();
}
// StartPlay
void AAssetChangeTestGameMode::StartPlay()
{
Super::StartPlay();
UWorld* const pWorld = GetWorld();
if (pWorld != nullptr)
{
Chara001Class = TAssetSubclassOf<AActor>(FStringAssetReference(TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter"))).LoadSynchronous();
FVector location(0.0f, 0.0f, 0.0f);
AAssetChangeTestCharacter* pawn = Cast<AAssetChangeTestCharacter>(pWorld->SpawnActor(Chara001Class, &location));
pWorld->GetFirstPlayerController()->ClientRestart(pawn);
}
}
C.K
(C.K)
4
リファレンスビューアで確認していた下記ではなく
“/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter”
ブループリントでのSpawnノードに設定するBlueprintGeneratedClassで確認出来る下記に変更することで
問題無く動作しました。
“/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter.ThirdPersonCharacter_C”
問題は解決しました。ありがとうございました。