9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

一人UE4 & C++Advent Calendar 2020

Day 13

【UE4】会話システム内での選択肢を作成してみる

Posted at

最初に

どうも、ろっさむです。

今回は前回の記事に引き続き、会話システム内での選択肢の簡易実装を行っていきます。

↓↓↓↓前回の記事は以下からご確認ください↓↓↓↓

【UE4】NPCとの会話システム実装

開発環境

  • UE4.26
  • Windows 10

作業手順

今回行う作業は以下の通りです。

  1. 会話用ダイアログ内での選択肢用UI作成
  2. 会話ダイアログ用のウィジェット作成時にフラグ操作
  3. 選択肢表示の実装
  4. 選択肢の選択処理実装

それでは順番に実装していきましょう。

会話用ダイアログ内での選択肢用UI作成

前回作成したWBP_TextDialogを編集していきます。
image

ダブルクリックして開いてください。

開いたら、まずは選択肢用のウィンドウを作成していきます。新たに、選択肢用のCanvasを作成してください。これはテキストウィンドウ用のCanvasの子供にします。
image

Canvas名をSelectableWindowとします。
image

Anchorsは左上基準で固定します。
image

次に、選択肢ウィンドウの背景を作成します。

imageSelectableWindowの子供として追加してください。
image

Anchorsは左基準で固定します。
image

ZOrderは文字よりも後ろにいくように-1に設定し、アルファを0.7としておきます。
image

ここまでで、ざっくり以下のような感じになっているかと思います。
image


次に選択肢の中身のUIを作成します。

まずはYES用のCanvasを作成していきましょう。このCanvasはSelectableWindowの子供として追加してください。更にその下には先ほどと同じようなImageと、選択肢テキスト尾を追加します。
image

三つの要素全てでAnchorsを左基準で固定します。
image

テキストのContent > TextからYES用のテキストを入力しましょう。
image

imageは以下のようにZOrderとアルファ値を変更するのを忘れないでください。
image

私の方で作成を行った感じ、ざっくり以下のような見た目になりました。
image

最後に、NO用のものを用意する必要がありますが、こちらはYES用のCanvasを複製することでさくっと作ることが可能です。
image

テキストのContent > TextからNO用のテキストを入力して、位置を整えればUIデザイン側での作業はOKです。
image


次に、選択肢の表示切替え部分を作成していきます。

まずは、選択肢が表示される会話ダイアログ以外の場合では、選択肢を非表示にしておく必要があります。また、選択肢内で現在選択されていないテキストは黄色背景をオフにして目立たせないようにする必要もあります。今回の場合だと、以下の三つが対象となります。
image

これらをデフォルトで非表示にするための設定をしましょう。

上記三つの要素をそれぞれBehavior > VisibilityからHiddenにして非表示にしておき、Bindボタンを押してCreateBindingを選択します。
image

作成した関数の処理を作成する前に、必要となる変数を二つ用意しましょう。

bool型のIsUpperIsSelectModeという変数を作成してください。
image

また作成した関数の方も名前を変更しておきます。

  • SelectableWindowにBindしている関数:SetActiveSelectMode
  • YESのimageにBindしている関数:SetActiveUpper
  • NOのimageにBindしている関数:SetActiveRow
    image

それぞれの関数の中身を作成していきます。

まずはSetActiveSelectModeIsSelectModeがtrueの時に表示するようにします。
image

次にSetActiveUpperではIsUpperがtrueの時に表示するようにします。
image

最後にSetActiveRowではIsUpperがfalseの時に表示するようにします。
image

これでWidget側での土台作成は完了です!


会話ダイアログ用のウィジェット作成時にフラグ操作

前回の記事で、会話ダイアログの作成を行う初期化処理はEvent BeginPlayから開始させていました。ここに、選択肢用のフラグ操作も入れておきます。IsSelectModeはデフォルトでfalseとなっているので、選択肢が必要になったWidgetにだけtrueと設定する必要があります。今回は会話の最後に選択肢用のウィンドウを表示するようにします。

Widget追加処理内に以下の処理を追加しましょう。

  1. Dialogリスト内から最後の要素をGETし、ForEachLoopでの要素と合致してるか確認。
  2. 合致している場合は、IsSelectModetrueにする。
    image

これで初期化処理側での作業はOKです。


選択肢処理の実装

こちらの実装は、前回の「話しかける処理の実装」のTrace処理から続く、「0番目の要素が既に表示されているかのチェックから、表示されていれば、その要素をTextDialogListから取り除きます。」と紹介している箇所からスタートします。

TextDialogListから要素を取り除く前に、現在のWidgetが次に選択肢用のウィンドウを表示させたいのかどうかIsSelectModeでチェックします。
image

次にtrueだった場合のYESとNO用の処理を作成します。今回はNOを選んだ時に会話用ダイアログが追加され、会話のループフラグがオフとなり、戦闘へと進みます。

以下の処理を追加しましょう。

  1. YESを選んだ場合、つまりIsUppertrueだった場合には会話は終了します。
  2. NOを選んだ場合には、追加Widgetを作成してTextDialogListに要素を追加し、テキストを設定します。また、会話ループフラグであるIsLoopfalseに設定します。
    image

会話終了時の処理は前回の記事の最後と同じです。
image

全体を通すと以下のようなグラフになります。
image


選択肢の選択処理実装

最後に選択肢を選択する処理を入れていきます。

今回使用するキーは、UpDownです。以下のように処理を入れていきます。

  1. UpDownのいずれかが押下された場合に、現在の会話ダイアログ用WidgetのIsSelectModetrueだった場合はIsUpperを反転してSetし直す。
    image

完成

これで一通りの実装は終わりました。

私の環境で実行した場合は以下のような動きとなります。

dialog-select

参考

9
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
10

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?