本来は水鉄砲ゲームの水鉄砲の残量の管理をやりたいですが、仕組みが銃の弾数の管理と似ているのでそれを真似して作っていきます。(水鉄砲でバトルするゲームを作っています。映像にはまだないですが水を入れたタンクを担ぎながら、様々な水鉄砲の武器を使用して、水をぶっかけ合うTPSゲームです。殺し合いではなく平和で明るいパラダイスシューティングゲームを目指しています。)
やりたいこと・全体像
- 水の量を管理する変数などを作成
- リロード、発砲したときに水の量を変更
- UIへ更新した水の量を反映
ポイント・基礎技術
- 構造体(Structure)
- ウィジェットに構造体の値を送る処理
- Playerから構造体へアクセスする方法
水の量の管理の作り方
水の量を管理する構造体を作る
タンクの水、ライフル、ピストルなど様々な武器の水の量、さらに、発射したときの水の量、リロードしたときの水の量、タンク自体の水の量などを管理する変数を構造体で作っていきます。
Playerのブループリントへ構造体を作る
ウインドウ左下変数から構造体型の変数?構造体?を作成します。
リロードする処理、砲弾を発射する処理に水の量を変更する処理を構造体の変数に格納するようにブループリントのノードを作成します。(細かい部分は割愛)
ウィジェット(UI)のテキストへ値を渡す
バインディング関数で毎フレーム更新
ウィジェットのテキストを変数化してバインディング関数を作ると、毎フレームテキストを更新する処理を記入できる関数を作ることができます。Youtube動画を参考にバインディングの始まりにInputのピンを作って構造体の値を渡す方法を試しましたがエラーが解消できずに2時間くらい悩んだ末にプレイヤーをキャストして変数の値を持ってくる方法に落ち着きました。
構造体を指定したときのエラー(ブループリントスクショしとけばよかった)
バインディング:ウィジェット’ /Script/UMG.TextBlock:TextDelegate ‘のプロパティ’ Text_ChargedVolume ‘:メンバー:Get_Text_ChargedVolume_Text に誤った数の引数が設定されています。値を1つ返してパラメータを受け取ってはいけません。
SetText(Text)で水の量が変わったときに更新
結論としては更新された文字がダブって表示されてしまい、テキストの更新には成功しましたが、全く数値が読めずに使い物になりませんでした。
まとめ
2日かけて作成して終わってみれば大したことはありませんでしたが、ウィジェットへ構造体の値を渡す部分にかなり苦労しました。参考資料もドンピシャの資料がなく、Youtube動画をかいつまむ形で処理を作っていったのでよくわからないまま進んで、殺伐とした密林を闇雲に進んでいた気分でした。
終わってみるとただたんにUIのテキストの更新ができなかっただけで大したことはなかったのか?と振り返れますが、たったそれだけのことに大苦戦した印象です。
初日に苦悩しながら処理を作っていったときのメモの残骸です。特に読む価値はありませんが記念にこれだけ苦しんだという記録として残しておきます。参考にしたYoutubeの動画のリンクも残しておけばよかった。なぜ消したのか?
ウィジェットのテキストをブループリントで変更する方法1
- ウィジェットデザイナで作成したテキストを変数化する
- ウィジェットのイベントグラフ内にカスタム関数を作る
- カスタム関数から実行ピンを引っ張って来ながらSetText(Text)を呼び出す。
(なにもないところから右クリックSetText(Text)で検索をかけても何も出てこなく、それだけに数時間苦戦しました。)
フォーラムの質問で解決した↓
Blocked - SetText(Text)に変数化したテキストを指定する。
- 表示させたい文字列をSetText(Text)のText(ピンク色のピン)へ繋ぐ
ウィジェットのテキストをブループリントで変更する方法2
- ウィジェットデザイナで作成したテキストの詳細からバインディングを作成する
- するとグラフの方に専用のテキストを更新する関数が作成される。
- バインディングの関数にブループリントを追加して変更したいテキストを出力ノードのOutputに繋ぐ。
(構造体の変数を繋いだ場合はエラー「バインディング:ウィジェット’ /Script/UMG.TextBlock:TextDelegate ‘のプロパティ’ Text_ChargedVolume ‘:メンバー:Get_Text_ChargedVolume_Text に誤った数の引数が設定されています。値を1つ返してパラメータを受け取ってはいけません。」が発生してコンパイルできなかった。) - バインディングした関数は毎フレーム更新される。
構造体の値をウィジェットへ渡す
ウィジェットでHUDを作る
銃の現在弾数と最大弾数のテキストを作るだけです。(詳しいのは割愛)
ブループリントのストラクチャーで銃の弾数管理を担当
- BluePrints Structureファイルを作成(Weapon_Struc)
- もう一つBluePrints Structureファイルを作成(Data_Struc)
- Weapon_StrucにDataという名前のDataStruc型の変数を追加
- Data_Strucに現在の弾数、Maxの弾数などの変数を作成
Structureを使いたいブループリントのEvent Begin Playeで初期化
ブループリントの画像
ウィジェットに処理を追加
テキストのCreateBinding で弾薬の数をセットする処理を作る
コメント