検証UE4: 4.27.1
変数の UPROPERTY の BlueprintSetter での関数指定、UFUNCTION での BlueprintSetter 設定の話になります。
それを LevelSequence(シーケンサー) から使用したときの挙動の注意点です。
まちがってたらごめんなさい。
・BlueprintSetterの参考
[UE4] UE4.17リリースノートピックアップ - 花繁吹き
http://unwitherer.blogspot.com/2017/08/ue4-ue417.html
まとめ
- LevelSequence で変数UPROPERTYの BlueprintSetter は動作しない
- LevelSequence からは関数名を「Set+<変数名>」にする事でフックできる
- BPから、LevelSequenceから、両方取りたい場合はBlueprintSetter指定して、関数名を「Set+<変数名>」と合わせることで出来る
処理方法 | BPから値設定 | LevelSequenceから値設定 |
---|---|---|
BlueprintSetter使用 | ○ | × |
関数名「Set+<変数名>」 | × | ○ |
BlueprintSetter使用+関数名「Set+<変数名>」 | ○ | ○ |
ちなみに、
どれも関数はC++のアクセス権を private にしてても呼ばれます。
「Set+<変数名>」にする際、bool型の prefix の "b" は無くて大丈夫です。(変数bool bValue -> 関数SetValue)
BPからのBlueprintSetter
標準的な BlueprintSetter の設定の下記コード
UFUNCTION(BlueprintSetter)
void SetBPSetterHogeHogeF(float Val);
UPROPERTY(interp, VisibleAnywhere, BlueprintSetter=SetBPSetterHogeHogeF)
float BPSetterValF = 0.0f;
void ASetterTestActor::SetBPSetterHogeHogeF(float Val)
{
UE_LOG(LogTemp, Log, TEXT("%u %s: SetBPSetterHogeHogeF"), GFrameNumber, *GetName());
}
LevelSequenceからのBlueprintSetter
上記を LevelSequence から値を設定するようにしてみます。
しかし、ログには何も出てきません。
LevelSequence でのトラックからは BlueprintSetter が動作してくれません。
LevelSequenceからの値設定をフックする方法
フックする方法はあります。
UFUNCTIONでかつ、関数名を Set+<変数名> で用意します。
下記のように記述します。UPROPERTY、UFUNCTIONに BlueprintSetter指定は必要ありません 。
変数 FuncNameValF に対して、PrefixにSetを付けた SetFuncNameValF 関数
UFUNCTION()
void SetFuncNameValF(float Val);
UPROPERTY(interp, VisibleAnywhere)
float FuncNameValF = 0.0f;
void ASetterTestActor::SetFuncNameValF(float Val)
{
UE_LOG(LogTemp, Log, TEXT("%u %s: SetFuncNameValF"), GFrameNumber, *GetName());
}
上記を LevelSequence から値を設定するようにしてみます。
無事ログが出力されました。
この場合、Blueprintから設定しても
呼び出されません。
BPからLevelSequenceから両方から呼ばれるようにする
どちらの場合でも処理を挟みたい場合は、BlueprintSetterを使用しつつ、関数名をSet+<変数名>で用意します 。
UFUNCTION(BlueprintSetter)
void SetAllOKValF(float Val);
UPROPERTY(interp, VisibleAnywhere, BlueprintSetter=SetAllOKValF)
float AllOKValF = 0.0f;
void ASetterTestActor::SetAllOKValF(float Val)
{
UE_LOG(LogTemp, Log, TEXT("%u %s: SetAllOKValF"), GFrameNumber, *GetName());
}