アクターのテーブル情報にあわせて動的に矢印を生成するためにOnConstructionで
UArrowComponent* Arrow = NewObject(this);
Arrow->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepRelativeTransform);
Arrow->SetRelativeTransform(SetTransform);
Arrows.Emplace(Arrow);
のように複数のUArrowComponentを動的生成しているのですが、矢印が表示されたりされなかったり挙動が不安定な状態です。
現状、パラメータの編集でOnConstructionが呼ばれたときには期待通り表示されるのですが、アクターを移動させたことでOnConstructionが呼ばれると非表示になってしまうようです。
なにかわかりますでしょうか
お世話になります。アクセルです。
「移動させた」というのは、具体的にどういうことでしょうか?
OnConstructionはスポーンの前に呼ばれているので、
例えば、PIEのワールドでアクターのインスタンスが作られたら、そのアクターを移動しても、OnConstructionがもう一回呼ばれてないことが仕様通りだと思います。
もしかしたら、OnConstructionではなく、OnActorSpawnedを使うのはいいかもしれません。
試していただいてもいいですか?
よれしくお願いします。
お世話になります。アクセルです。
待たせてすみませんでした。やっと解決できました。
気づいていませんでしたが、OnConstructionのSuperが呼ばれていなかったようです…
OnConstructionを使いたかったら、
ファンクションの最初にそのラインを追加して下さい。
Super::OnConstruction(Transform);
PostEditChangePropertyの場合は、
Super::PostEditChangeProperty(e);
を追加して、PostLoad()もoverrideして、Super呼んで、ArrowComponentのSetRelativeLocationなどでTransformを更新できます。
OnConstruction()の方は楽な気がしますが、両方試して、問題なしで更新されています。
問題があれば、教えて下さい!
よろしくお願いします!
お世話になります。
やっと解決しました。
親のアクターのスポーンの前にComponentが使用されているので、
登録されていないままになっています。
なので、自分で登録しないと駄目です。
OnConstructionの
Arrow->AttachToComponent(RootComponent, FAttachmentTransformRules::KeepWorldTransform);
の後で、
Arrow->RegisterComponentWithWorld(GetWorld());
を呼んでください。WITH_EDITORのチェックもそうするのはおすすめです。
ただその作業はループ内なので、毎回GetWorldするのは重くなります。
ループ前、Worldをキャッシュして下さい。
なお、OnConstructionで大きい作業することは、非推奨です。
エディター上の作業に関しては、Editor Scriptingなどを確認してください。
PIEのWorldを直接編集したい場合は、
C++のコードで、WITH_EDITORのチェックを必ず入れて下さい。
よろしくお願いします。
説明がまずくて申し訳ありません
エディター上でアクターをつまんで移動させたケースで、OnConstructionが呼び出されてArrowComponentが生成されていることも確認しています
link text
再現するプロジェクトを添付しました。
MyActorをエディター上においてMoveTransformに複数の点を置くとそれぞれ点に向かってArrowComponentを生成しています
矢印が表示された状態でMyActorをつまんで動かすとArrowComponentが非表示になります
この状態で点を追加したり数値を変更するとArrowComponentは表示されます
そうしたら、逆にどんなタイミングで非表示になっていますか?
エディター上でアクターをつまんで移動させると、OnConstructionが呼び出されてその際に新たにArrowComponentが生成されているのですが、このArrowComponentが表示されません
サンプルプロジェクトで再現してみみましたが、
問題なく毎回表示されています。
再現できるプロジェクトを送っていただいてもいいですか?
お世話になります。アクセルです。
再現できました。ありがとうございます!
OnConstructionではなく、
PostInitializeComponentsか、
PostEditChangePropertyを
使うのはどうでしょう?
OnConstructionではComponentsをinitすると今みたいなサイドエフェクトが出る場合があります。あくまでも、メンバーなどをinitするためのファンクションではなく、エディター内のためにあるファンクションです。
よろしくお願いします。
やりたいこととしてはむしろエディター内での処理ですので PostInitializeComponents は不適切なようです。
MyProject の OnConstruction を PostEditChangeProperty に置き換えてみたのですが、 PostEditChangeProperty の呼び出しとArrowComponentsが生成されていることは確認できたのですがやはり表示が行われません
なにかわかりますでしょうか
すみません、Super::OnConstruction(Transform);についてはサンプルプロジェクトの切り出しの際に付け忘れたようです。
Super::OnConstruction(Transform);
を追加してみてもこちらでは症状に改善はみられず、やはりMyActorをエディタ上でつかんで動かすとArrowComponentが非表示に変化します。
PostEditChangePropertyを使用した場合はまったく表示されない状態です。
ありがとうございます、無事に解決しました!
実装のアドバイスもありがとうございます
チーム内で共有いたします