UE4初心者です。
現在、アクションゲームを作成しており、プレイヤーがアイテムを取得したらそのアイテムを右上に表示する、という風にBPを組んでみたつもりなのですが、思うように動いてくれません。
本来なら、アイテムが未使用の状態で別のアイテムを取得すると、アイテムが上書きされて最初に持っていたアイテムは消えてしまうはずなのですが、どうしても画像のようにアイテムが重なって表示されてしまいます…
アドバイスや、解決方法がわかる方がおられましたら、是非、教えていただけると幸いです。よろしくお願いいたします。
画像から全体を想像しての回答になりますが、まず Remove from Parent はちゃんと呼ばれているでしょうか?
呼ばれていない場合、ウィジットのインスタンスがどのように管理されているか、投稿者さんの処理をしっかり見直す必要があります。
破棄するためには W_Sio を作成した後に保持しなければならないはずなので、見直すべきポイントが見えてくるはずです!
ノードの繋ぎを見るに、最も基礎となる部分のラーニングがまだ足りないみたいです。
「ウィジットを作成して画面に表示する」といった部分は問題ありません。
次に、一度表示したウィジットを画面から消すためには「Remove from Parent というノードに、作成した時のウィジットを指定してあげる」必要があります。
この作成した時のウィジットを保持している様子も上記リンクに載っています。
エラーが出ている理由は、作成したウィジットではないものを指定してしまっているからです。
また、キャストの使い方も間違っているので、ゆっくりラーニングを進めてみてください。
https://docs.unrealengine.com/latest/JPN/Engine/Blueprints/UserGuide/CastNodes/index.html
※ちなみに今回の目的達成にキャストは使用しないです。
調べたところ、Remove from Parent が呼び出されていなかったためすこしつなぎ方を変えて呼び出されるようにしたのですが、今度はエラーが出るようになってしまいました…C言語などもまだまだ初心者なのでエラーに何が書いてあるのかさえよくわかりません…
すみません、とても分かりにくい画像になってしまいましたが、見ていただけると幸いです。よろしくお願いします…!
”作成したウィジェット”を保持している状態については理解できました。また、キャストの使い方を間違って覚えてしまっていたことにも気づけました。ありがとうございます。
しかし、今度はウィジェットを消すときのフラグの立て方がわからなくなってしまいました…この場合、どのようにフラグを立てるべきなのでしょうか?
初歩的な質問ばかりで申し訳ないのですが、アドバイスなどもらえるととても嬉しいです。よろしくお願いします。
例えば今回の場合ですと、アイテムを拾った時に、拾った情報をプレイヤーに伝え、プレイヤー側で所持しているアイテムの表示、既に持っていたアイテムの破棄、のように組んでみるのはどうでしょうか。
そのうち所持しているアイテムに応じて、パラメータの変化やアクションの変化、モデルの変化もやるようになるかもしれませんので、何らかの情報は持たせておくと今後も組み込みやすいかもしれませんね。
データの仕様や持ち方はゲーム自体の仕様によって様々なので、フラグ管理など一概にこの方法が正しい、というのはなかなかないものです。
もちろんある程度の定石はありますが、それは数ある参考書から知識を得たり、とにかく自分で作ってみて学ぶ、という経験を積んこそになります。
勉強をやめたプログラマーに存在価値はありませんから。持論ですが笑。
アドバイスありがとうございます!参考にして作ってみたのですが、(おそらく)あと一歩というところで詰まってしまいました…
アイテムの絵が重なってしまう、というのは解決したのですが、二つ目のアイテムを取ったときに、アイテムが上書きされるのではなく既に持っているアイテムが残って二つ目に取ったアイテムは表示されない、という風になってしまいました。
調べたところ、Remove from Parent が動いていないのかもしれない…というところまでは分かったのですが、なぜそうなってしまったのかわかりません。
しっかり調べて組みなおしたつもりなのですが、どこが悪いのでしょうか…教えていただけると嬉しいです。alt text
Widgetが参照切れを起こしていますね。
「Widgetを作成」が呼ばれるたびに新しいWidgetが作成されて、変数に格納されるため、それまで参照されていたWidgetが誰からも参照されず残ってしまいます。
その後Removeされるのは新しく作った方なので、古い方は画面に残るという結果になります。
Widgetの消去(画像2枚目)を先にするか、Widget作成は1度だけ行うようにして、AddToViewportとRemoveFromParentで表示のみの切り替えにする良いかと思います。
T_Sumisaki さんのアドバイス通り、消したいものと保持しておきたいものが上手く噛み合っていないようです。
また、アイテムの種類が増える度に処理が膨大になっていく問題にも直面しているかと思います。
そこで、簡単ではありますが、私の方で処理サンプルを用意してみました。
link text
まずは実行してみて、意図した挙動になっているか試してみてください。
次に、MyCharacterBase というブループリントを開いて、どんな処理をしているか確認してください。
この方法が正義という事は決してありませんが、参考にはなるかと思います。
なるほど、こんなふうに出来るんですね…初めて見る処理もいくつかありましたが、これなら理解できそうです。わざわざ用意してくださってありがとうございます!参考にさせて頂きます!
これまでアドバイスしてくださった方々、ありがとうございます、参考になりました!これで何とか解決できそうです。