takomk2
(takomk2)
1
UE5での質問になります
処理としては、SphereTraceで検出した周辺の敵アクタにWidgetを重ねて表示する処理を実現したいと考えています
以下画像が完成イメージになります(緑の枠が重ねたいWidgetです)
Widgetを敵アクタの子として実装すれば実現できるのは承知しているのですが、今後追加したい処理の関係上、
PlayerController内で表示処理を完結させたいと考えています
試しに以下のようなBPを組んでみたました
1.Tick+MultisphereTraceで周辺アクタを配列に格納(動作確認済みのため画像略)
2.検出したアクタの数だけWidgetを作成しViewportに追加
作成した各Widgetを配列変数に追加
3.各WidgetをSetPositioninViewportで検出したアクタの2D座標に移動
実行した結果として、Widgetがどこにも表示されず、以下の様なエラーが発生します
Widget配列から参照ではなくコピーしか取得できないからでしょうか…
表示されない原因や改善案について、お力をお貸しいただきたいです
オブジェクト参照の配列からコピーするのは参照なので、そこは全く関係ありません
コピーであるか参照であるかが関係するのは、構造体の配列を使用するときのみです
エラーから考えるに、Widgetの生成タイミングと検知Actorの生成タイミングがずれているようです
参照の配列から存在しないインデックスで要素を取得しようとするとNoneが返ります
エラーの直接的な原因はこれです
IsValidIndex
やIsValid
などでエラーチェックをしましょう
もう一点気になるところは、Widgetそのものの作りです
Widgetの原点はどこにありますか?
もしCanvasPanel等を使っていて、デフォルト通り左上にアンカーがあるのであれば、表示はされているものの、位置合わせをすると必要な部分が画面外に出てしまっている、という状況になっているように思います
takomk2
(takomk2)
3
T_Sumisaki様
ご回答ありがとうございます
仕事が忙しく返信遅れてしまい申し訳ありません
オブジェクト参照の配列からコピーするのは参照なので、そこは全く関係ありません
コピーであるか参照であるかが関係するのは、構造体の配列を使用するときのみです
ありがとうございます、大変勉強になります
冷静に考えると、アクタ配列の参照がうまくいっている時点で気づくべきでした…
エラーから考えるに、Widgetの生成タイミングと検知Actorの生成タイミングがずれているようです
参照の配列から存在しないインデックスで要素を取得しようとするとNoneが返ります
エラーの直接的な原因はこれです
IsValidIndex
やIsValid
などでエラーチェックをしましょう
ご指摘の通り、Isvalidでのエラーチェックを追加しました
Widgetの原点はどこにありますか?
もしCanvasPanel等を使っていて、デフォルト通り左上にアンカーがあるのであれば、表示はされているものの、位置合わせをすると必要な部分が画面外に出てしまっている、という状況になっているように思います
ご指摘ありがとうございます
ご指摘の通りアンカーが左上になっていたので中央に移動させました
また、その対処だけだと依然としてズレが発生していたのですが、以下の対処を追加で行ったところ無事解決できました
・AddtoViewportの後にSetAlignmentinViewportを追加しました(Alignmentは0.5)
・SetPositioninVIewportのRemoveDPIScaleにチェックを入れました
理屈は正直理解できていませんが、いったん解決できたため解決済みにしておきます