BoxCollisionの中に入ると、会話ができるようなものを作っています。
キーボードのBキーで会話を進めるようにしています。
キーボードのBキーで次の会話に進むことができるのですが、最初の会話、次の会話も表示されてしまいます。
最初の会話の後は、最初の会話を消alt textして次の会話のみの表示にするようにしているのですが、表示されたままになっています。
Removeparentにエラーが出ているようなのですが、エラーが出ているのが原因でしょうか?
返信有難うございます。
RemoveFromParentとRemoveIndexの順番を逆にしてみると、最初の会話を消して次の会話が表示されました。
On Component Begin Overlapの処理はできたのですが、
On Component End Overlapの処理を作成したところ、Boxコリジョンの範囲外に出ても、会話が残ったままになってしまいます。
On component end Overlapノードの処理が間違っていますでしょうか?
On component end OverlapにつないだRemoveParentのターゲットには、Createwidgetをつないでいます。
RemoveFromParentとRemoveIndexの順番が逆であると考えます
RemoveIndexを先にすると、もとの0番目が削除されてもとの1番目が繰り上がり、0番目と扱われるようになります
その状態で0番目を指定してRemoveFromParentを実行すると、対象となるのはもとの1番目です
どうしても先にRemoveIndexをしたければ、別途変数に0番目の参照をとっておく必要があります
なお、他のWidgetが表示されているように見えるのは、上記の通りに処理されたため、RemoveFromParentが事実上意味の無いものとなっているためです
また、これは蛇足ですが、イベントドリブンであるべきアクション(ボタンを押したら動作する、と決めているアクション)をTickで処理するのは処理状況が分かりづらくなりますのでやめたほうが良いでしょう
別イベントで実行した関数ノードの戻り値(今回はCreateWidget)をつなぐのは大変よろしくありません
というのも、いつ実行されたのか、そもそも生きているのかが定かで無いからです
対象に取るべきなのは、その時点で画面に表示されていると考えられる、配列に格納したWidget参照です
ノードプログラミングを書いていると、見かけ上どこからでもラインを引っ張れるように見えますが、論理的に成り立たないものは動作しません
変数やPure関数以外の関数の戻り値を、イベントを跨いで引っ張るのは様々なエラーの原因になりますので、避けるべきです
先の画像で、Widgetを持っていると思われるPlayerControllerを変数に入れているようですが、同様の方法でPlayerControllerを特定、または格納済みの変数から参照を取得することはできないのでしょうか?
ご指摘いただきまして有難うございます。
頂いた回答をもと試していました。
いただいた回答の、対象に取るべきなのは、その時点で画面に表示されていると考えられる、配列に格納したWidget参照です
というところですが、
現在画面に表示されている配列に格納したWidget参照というのはどのよにすれば取得できるのでしょうか?
どうしても分りません。
返信有難うございます。
TextDialogListまでのつながっているノードを複製し、OnconponentEndOverlapにつなぎ、RemovefromParentにつないだりしてみましたが、やはりCollisionから離れてもウィジェットが表示されたままになってしまいます。
申し訳ありませんが、どのように接続すると良いのか教えていただけませんでしょうか?
RemoveFromParentした後、Listを空にしましたか?
本件で書かれている処理は、表示部分が変更されていなければ、Listの内容が空でない場合に毎フレームWidgetの表示を試みるように実装されていたように記憶しております。
返信有難うございます。
LISTを空にするですが、していませんでした。
LiSTを空にするにはRemove from Parentの後にREMOVE INDEXを接続するということでしょうか?
キャプチャのようにつないでみましたが、会話のダイアログが表示された後にコリジョンの範囲から外に出ると、会話のダイアログのWidgetが削除されず次の会話に進んでしまいます。
間違いをご指摘いただけますでしょうか?
- EndOverlapではWidgetをすべて消す、ということだったかと思いますが、なぜ新たなWidgetを生成しているのでしょうか?
- なぜ新たに生成したWidgetをListにAddしているのでしょうか?
- ListをClearする必要がある、という内容だったかと思いますが、1つしかRemoveされていません。これは意図通りでしょうか?
配列の内容をすべて削除するにはClearノードを使用します
ですので、処理はRemoveFromParent->Clearの順になるかと思います
返信有難うございます。
配列の中身を空にするにはClearというノードでるんですね。
>EndOverlapではWidgetをすべて消す、ということだったかと思いますが、なぜ新たなWidgetを生成しているのでしょうか?
すみません、間違えました。
>なぜ新たに生成したWidgetをListにAddしているのでしょうか?
すみません、間違えました。
>ListをClearする必要がある、という内容だったかと思いますが、1つしかRemoveされていません。これは意図通りでしょうか?
Removeですべて削除できるということではないのですね。
会話が3回なので、Removeは3回必要ということでしょうか?
ノードを修正してみました。
やってみるとコリジョンの外に出ると会話も削除されているうようなのですが、これで合っていますでしょうか?
合っていますが、RemoveFromParentが2つほど余計です
配列をTargetに指定し関数を呼んだ場合は、配列の対象全てに対して関数が実行されます
ですので、RemoveFromParentは1回で良いです
先の内容については、RemoveIndexは指定されたIndexの要素1つしか削除できない、というものでした
返信いただきまして有難うございます。
Remove from parentは1つで良いということでしたか・・・
Remove Index の場合がIndex要素1つしか削除できないということだったのですね。
ノードの説明もしてくださり有難うございます。
Remove from parentを2つ削除して動きを確認いたしました。
度々の質問にもかかわらず、丁寧に説明くださり有難うございました。