mishimatsu
(mishimatsu)
1
親クラスがObjectのBlueprintクラスの実体化の方法がかわりません。
親クラスがActorの場合には、SpawnActorで実体化できますが、それに当たるBlueprintのコマンドは何になるのでしょうか?
他の言語でいうとnewに当たるものです。
親クラスがObjectの独自BlueprintクラスをActorなどの別のクラスのメンバ変数として持っておき、利用したいのですが、実体化されていないので(noneになっている)、そのBlueprintのメンバー関数にアクセスすることができない状態です。
よろしくお願いいたします。
sgkz
(sgkz)
2
ビルトインのコマンドとしては存在しないようなので、ネイティブでカスタムノードを作成するしかなさそうです。
英語ですが以下の記事が参考になると思います。
UE3ではスクリプトからobjectの派生クラス(非actor)もnewできたので、UE4でもそのうち純正のコマンドが用意されるのでは、と思っているのですが…
参考になれば幸いです。
mishimatsu
(mishimatsu)
3
回答ありがとうございます。
現状できないことがわかったのは、本当にありがたいです。
教えていただいた情報をもとに作ってみたいと思います。
ありがとうございました。
mishimatsu
(mishimatsu)
4
無事にカスタムノードを作成することができました。
情報有り難うございました。
sgkz
(sgkz)
5
解決できたようでよかったです。
ただ今こちらでも試してみたのですが、記事のコードのままだとactorを継承したクラスを指定するとゲーム終了時にクラッシュしてしまいますね。。それに第一引数も使っていないようなので整理すると以下のような感じになりそうですね。
UObject* UCreateNewObject::NewObjectFromBlueprint(TSubclassOf<UObject> UC)
{
if ( UC->IsChildOf( AActor::StaticClass() ) ) return NULL;
return StaticConstructObject(UC);
}
またメンバ変数の値を取得するのが目的であれば、newする代わりにデフォルト値を取得するカスタムノードを作成するという手もあります。
//.h
UCLASS()
class TESTAPP_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
GENERATED_UCLASS_BODY()
UFUNCTION(BlueprintPure, Category = "Class|DefaultProperty")
static bool GetClassDefaultPropertyEnumAsByte(UBlueprint* inBPClass, const FString& inProperty, uint8& outResult);
};
//.cpp
bool UMyBlueprintFunctionLibrary::GetClassDefaultPropertyEnumAsByte(UBlueprint* inBPClass, const FString& inProperty, uint8& outResult)
{
if ( !(inBPClass && inBPClass->GeneratedClass) ) return false;
UByteProperty* byte_prop = FindField<UByteProperty>( inBPClass->GeneratedClass, FName(*inProperty) );
if ( !(byte_prop && byte_prop->Enum) ) return false;
outResult = byte_prop->GetPropertyValue_InContainer( inBPClass->GeneratedClass->GetDefaultObject() );
return true;
}
上記は指定したブループリントクラスの指定したメンバ変数(enum)のデフォルト値を取得するカスタムノードの例です。引数のuint8の部分とUBytePropertyの部分を変更すれば、他の型でも動作すると思います。
アクタをスポーンさせる前にデフォルト値によって条件判定をしたい場合に便利です。
こちらも何かの参考になれば幸いです。
mishimatsu
(mishimatsu)
6
ご丁寧に、追加の情報有り難うございます。
今後の参考にさせていただいきます。
今までは、画面に表示しないような制御系のものもActorから派生させて、使っていたので、今回は、別の方法でやってみようと思い、このインスタンス化の問題がでてきました。
今回の情報で、かなりスッキリBlueprintも書けるようになりました。
本当にありがとうございました。
Blueprintのロードマップを確認してみたところ、まだ、非Actorのインスタンス化については、対応がなさそうなので、現状の方法使いつつ、拡張していくことになりそうです。
UE4側で対応してもらえるとマルチプラットフォームに展開した時に、安心して使えるので、ぜひ対応してもらいたいですね。