UEMemo
(UEMemo)
1
Lyra Starter Gameを参考にして「GetMainAnimBPThreadSafe」を作ってみましたがエラーが出ます。
エラー内容
Get Main Anim BPThread Safe Accessing an object reference is not thread-safe
原因がわかる方はいますでしょうか?
実行環境:
作業環境:
Uploading: スクリーンショット 2022-04-21 21.28.16.png…
1 Like
Pureノード(関数)はThreadSafeではないからです
Lyraの実装をよく見てもらえればわかりますが、 GetMainAnimBPThreadSafe
は PropertyAccess
ノードを通して使用しています
AnimBPのAnimGraphの実行はマルチスレッドで行われるため、関数やプロパティへのアクセスはThreadSafeである必要があります
PropertyAccess
ノードはその参照先を解決し、ThreadSafeであることを確認し保証する機能を持つようです
UEMemo
(UEMemo)
3
ご連絡ありがとうございます!
ただThreadSafeにしようとしてもエラーが出てしまいます。
やり方が違うのでしょうか?もしくはC++が必要なのでしょうか?
どうも使い方が違うように見えますね
Pureノードは元の形でよく、それを使って値(もとの画像で言うWorldVelocity2D)を PropertyAccess で取得するのが良いのでは?と思います
調べてみましたが、ThreadSafe扱いにしたければ、関数側を明示的にThreadSafeとして宣言する必要があるようです
このオプションでThreadSafe宣言はできますが、実際にThreadSafeであるかどうかは自身で保証する必要があります
UEMemo
(UEMemo)
6
お返事ありがとうございます!
ThreadSafeのチェックは入れているのですが、できないですね。Cast以外は問題なくできるのですが、CastのThreadSafeがどうも無理なんですね。でもLyraではそれが可能なんですね。不思議ですが…。やはりC++の設定が必要な気もします…
もしかしてCastに使う GetOwningComponent.GetAnimInstance
をThreadSafeにしたいということです?
それはできないです
ThreadSafeで取れるのは値型の変数か、ThreadSafeなPure関数の戻り値、あるいはそこから取る値型の変数です
Lyraでも GetMainAnimBPThreadSafe
の中で GetOwningComponent.GetAnimInstance
を取得しているところはAuto(表示はPre-Event Graph)になっていますよね
もしその部分をThreadSafeとして扱いたいとなるとエンジン側に手をいれることになります
おすすめはしません
1 Like
lezard1999
(lezard1999)
9
すいません、横から失礼します、
BlueprintThreadSafe関数にて、いくつかの関数は使用できないになってます、
例えばカーブから値を取得の
GetVectorValue
GetFloatValue
関数
それと、SceneComponentからの
GetSocketTransform
とか
これらの関数をBlueprintThreadSafeにて使用したい場合はどうすればいいですか?