やりたいこと
C++で作成したインターフェースを実装したBlueprintをGameModeにいくつか渡し、スポーンしたい。
MMashiroさんから、GameModeからアクターをスポーンさせるのはレベルに紐づくのでよくないと指摘をいただきました。その通りだと思うのですが、今回は初心者用のチュートリアルの拡張ですので、GameModeをスポーンのための便利屋として使っていました。以下GameModeはただ単にスポーン用のアクターとお考え下さい。
試したこと & 問題
今まではアクターをそのままGameModeに渡しスポーンしていたのですが、いくつか異なるアクターをスポーンしたいと考え、以下のようにスポーンさせるアクターに実装させるインターフェースクラスをつくりました。
C++
1#include "CoreMinimal.h" 2#include "UObject/Interface.h" 3#include "SpawnableItemInterface.generated.h" 4 5// This class does not need to be modified. 6UINTERFACE(MinimalAPI, Blueprintable) 7class USpawnableItemInterface : public UInterface 8{ 9 GENERATED_BODY() 10}; 11 12/** 13 * 14 */ 15class BATTERYMAN_API ISpawnableItemInterface 16{ 17 GENERATED_BODY() 18 19 // Add interface functions to this class. This is the class that will be inherited to implement this interface. 20public: 21 UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "SpawnableItemInterface") 22 float GetSpawnRate(); 23 24 UFUNCTION(BlueprintNativeEvent, BlueprintCallable, Category = "SpawnableItemInterface") 25 void SetSpawnRate(float Rate); 26}; 27
GameModeにこれを実装したアクターBlueprint(新しくアクターBlueprintを作成しclass settingsのところから実装するインターフェースを選択しています。)をわたし、GetSpawnRate()でスポーンの頻度をそれぞれ変えつつスポーンするような感じです。しかし、ここで問題となったのが以下の点です。
- いくつかアクターBlueprintをつくりISpawnableItemInterfaceを実装したものの、どうやってGameModeに渡したらいいかわからない。
- ISpawnableItemInterfaceのスポーンの仕方がわからない。
1について
GameModeのC++クラスの.hで以下のように宣言し、エディターからアクターを渡したかったのですができませんでした。
C++
1 2 3 UPROPERTY(EditAnywhere) 4 TSubclassOf<ISpawnableItemInterface> ISpawnableItem;
エラーはでないものの、エディターの詳細欄から渡すことができません。
またGameModeのBlueprintから新しくSpawnableItemの変数を作成し、配列にして外部に公開し、アクターを渡そうと思ったのですがこれもできませんでした。
2について
仮に渡せたとしてもinterfaceを実装したアクターのスポーンの仕方がわからないです。
以下のようにしてもエラーがでてしまいます。
C++
1GetWorld()->SpawnActor(SpawnableItem, &SpawnPosition, &SpawnRotation);
そもそもインターフェースを実装させようと思ったのは、1)いくつも同じ機能をもつアクターをつくる 2) 上位クラスであるGameMode側を下位クラスのアクターに依存させたくない といった理由なのですが、インターフェースにしたせいでうまくいかなくなってしまいました。
一応一つの解決策としてはGameModeでTArray<AActor>をUPROPERYにして公開し、GameModeがそれらをイテレートしてISpawnableItemInterfaceかどうか確認する、というやり方があると思うのですが、これはエディター側からどのアクターでも設定できてしまうのでよくなさそうです。
UE4はじめたばかりで初歩的なことがわからないのですが、解決したいです。よろしくお願いします。
追記
MMashiroさんのアドバイスの元、修正したらExecute_GetSpawnRate()関数でクラッシュするように。以下どこでエラーが起きているか。
回答1件
あなたの回答
tips
プレビュー