x

Search in
Sort by:

Question Status:

Search help

  • Simple searches use one or more words. Separate the words with spaces (cat dog) to search cat,dog or both. Separate the words with plus signs (cat +dog) to search for items that may contain cat but must contain dog.
  • You can further refine your search on the search results page, where you can search by keywords, author, topic. These can be combined with each other. Examples
    • cat dog --matches anything with cat,dog or both
    • cat +dog --searches for cat +dog where dog is a mandatory term
    • cat -dog -- searches for cat excluding any result containing dog
    • [cats] —will restrict your search to results with topic named "cats"
    • [cats] [dogs] —will restrict your search to results with both topics, "cats", and "dogs"

ウィジェットブループリントが残ったままになってしまう

サードパーソンキャラクターのMaxWalkSpeedの値をボタンを、ゲームパッドのYボタン押す度に、スピードが1倍から5倍まで変わるように設定し、5倍までいくとまた1倍に戻り同じように循環していくという設定にしています。 この処理はサードパーソンキャラクターのブループリント内に作成しています。

スピードが1倍から5倍まで変わる度にSpeedUpという文字のウィジェットブループリントが表示されるようにし、5倍から1倍に戻るときにはSpeedDownという文字のウィジェットブループリントが表示されるようにしているのですが、連打せずにゆっくり間隔をあけてYボタンを押すとSpeedUpという文字は残らないのですが、 連打してスピードを変更したときに、SpeedUpという文字が残ってしまい消えない状態です。 ゆっくりボタンを押したときと、ボタンを連打で早く押したときに違いが生じており、原因が良く解りません。

ブループリントと文字が消えず重なっている状態のキャプチャを添付致します。 重なる文字が見えづらいかもしれませんが、黒の文字で表示されています。

alt text

alt text

Product Version: UE 4.20
Tags:
more ▼

asked Apr 18 '19 at 06:20 AM in Japanese

avatar image

kei_oka
23 1 1 2

(comments are locked)
10|2000 characters needed characters left
Viewable by all users

1 answer: sort voted first

Execピン(白)を持つ関数ノードは、最後に実行したときの結果を保持しています
そしてその参照を解決するタイミングは、別のノードから参照されたとき、となります
このあたりはなんとなく想像がつくかと思います
まずはこの仕様を認識してください

この点は同一フレームで処理している際にはほとんど問題になりませんが、Delay等のLatentノード(時計のマークが付いたノード)を併用した場合に問題になることがあります
Latentノードが入った場合、それ以降のノードは別のフレームにて処理されることになります
つまり、ひと続きの処理ではなくなったので、別の処理に割り込まれる可能性が発生するわけです

今回の場合ですと、まずCreateWidgetし、AddToViewportしたあとにDelayを挟み、RemoveFromParentという流れになっています
AddToViewportのあとに0.5秒のDelayが指定されたので、一旦そこで処理が中断されます
しかしその直後、その0.5秒の間にもう一度CreateWidgetが実行されました

ここで最初の記述内容を思い出してほしいのが、 関数ノードは 最後 に実行したときの結果を保持している、という点です

1度目に作成したWidgetをWidgetAとしましょう
WidgetAをAddToViewportした後、Delayに入ります
この間で、もう一度CreateWidgetが呼ばれ、WidgetBが作成されます
この時点で、CreateWidgetは、WidgetAの情報を忘れ、最後の結果であるWidgetBの情報を保持することになります
その後、Delayで先送りにされた処理が実行されます
RemoveFromParentはCreateWidgetの結果を参照し、WidgetBを画面から消します

さて、このときWidgetAはどこにいるかというと、RemoveFromParentで消されなかったため、画面上に残っています
これが、画面上にWidgetが残ってしまう原因です

以上が、ボタンを連打した際に起こっている内容になります
ボタンをゆっくり押した場合(0.5秒以上の間隔を開けた場合)は上記のようなことが起こらず、想定どおりに動作しています

more ▼

answered Apr 18 '19 at 07:12 AM

avatar image

T_Sumisaki
3.6k 26 4 8

avatar image kei_oka Apr 18 '19 at 10:45 PM

分かりやすく説明いただきまして有り難う。 なるほど、widjetAが取り除かれる前にwidjetBが表示されているということなのですね。 しかもdelayで一度処理が終わってしまうということなのですね。 1倍の最後につないでいるRemove from parentを削除して、2倍のセットMaxwalkspeedとそれに繋げているspwn emitter attachの間にRemove from parentを入れてみましたが、結果は同じでやはり表示が残ったままでした。 すみません、残った表示を消そうと思うとどのようにすればよろしいでしょうか?

avatar image T_Sumisaki Apr 19 '19 at 02:24 AM

単に表示して一定時間後にWidgetを取り除きたいだけであれば、AddToViewport以降のノード(Delay含む)を、WidgetBPのConstructイベントに移すのが良いでしょう
Widget自身にRemoveしてもらうと参照を管理する必要がなくなるので楽になります

alt text

avatar image kei_oka Apr 21 '19 at 02:33 AM

回答有難うございます。 教えていただいた、Add To Viewport以降のノードをWidjetブループリントに移動させてみました。

この方法だとSpeedUpの文字はずっと表示されていることはなくなりました。 ただ、SpeedUPの文字とSpeedDownの文字が少しの間重なって表示されてしまうのですが、この少しの間文字か重なって表示されるというのは、このやり方ではこれ以上はどうすることもできないのでしょうか? delayの時間を0.5より短くしたりして試してみましたが、SpeedUpの表示時間が短くなってしまったため、2倍、3倍の時に早く文字が消えてしまうため、思ったような結果になりませんでした。

Delayの0.5秒というのは保ちつつ、SpeedUpとSpeedDownの文字が重なってしまう時間がないようにするというような場合は、どのように処理されていらっしゃるのでしょうか?

avatar image T_Sumisaki Apr 21 '19 at 03:21 AM

そこから先は表現の問題になると判断します
ですので、こちらは明確な回答を提示できない、ということをご理解ください

簡単に思いつく範囲では以下のようなものがあります

  • Animationを使用して文字を上や下にずらす

  • そもそも同じ位置に表示しない

avatar image kei_oka Apr 22 '19 at 02:33 AM

回答いただきまして有難うございます。 教えていただいた方法を参考にさせていただきたいと思います。

(comments are locked)
10|2000 characters needed characters left
Viewable by all users
Your answer
toggle preview:

Up to 5 attachments (including images) can be used with a maximum of 5.2 MB each and 5.2 MB total.

Follow this question

Once you sign in you will be able to subscribe for any updates here

Answers to this question