sylph55
(sylph55)
1
テキストが表示される場所を画面全体とし、一行目から一つ目のテキストが表示され、エンターを押すと既に表示されているテキストはそのまま残り、次のテキストは次の行に表示されていき、画面一番下の行までテキストが表示された状態でエンターを押すと画面に表示されている全てのテキストを消し、再度一行目から次のテキストが表示されていく、というサウンドノベルのようなテキストの進め方をしたいのですが、うまくいかず苦戦しています。
データテーブル、構造体を使用し、ウィジェットのTextのバインディングを作成してデータテーブルに書き込んだテキストを表示する、ということはできるのですが、表示するデータテーブルの行を一つ変数で指定しているもののため、エンターを押すとそのテキストは消されて同じ一行目に新しく次に指定したデータテーブルの行のテキストが表示される仕組みになってしまいます。
実装の仕方がわかる方がいましたら、ご回答をお願いします。
alwei
(alwei)
2
文章だけで理解するのが難しい質問です。具体的なイメージや同じようなことをやっているゲームを例に出すことで回答がしやすくなるのではないかと思います。
sylph55
(sylph55)
3
分かりづらく申し訳ありません…。例をあげると、かまいたちの夜のようなテキストの進め方を目標にしています。よろしくお願いします。
alwei
(alwei)
4
実装イメージがかまいたちの夜ということで、やり方を提示しますと…
1ページ辺りのテキストをデータテーブルのカラムで管理し、何もしなければ1ページ全体が表示されるように作ります。1ページ辺りのテキストの中に特定文字(かまいたち風なら"
"とか)を入れておき、そのテキストを見つけた際には、エンターキーが入力されるまで次の表示を行わないようにします。
1ページ全体の終了はこれもまた特定の文字(たとえば"■"など)を見つけた際に、エンターを押すことでそのページの表示を終了し、データテーブルから次のカラムを取得し、表示を行います。これを続けていけばおそらく、かまいたちの夜のようなテキスト表示ができるはずです。
alwei
(alwei)
5
文字列はデータテーブルからとってくるようにし、実際に表示する文字は、何もない"** 空のText Box **"に後から追加するようにします。
データテーブルから文字列を1文字ずつ解析し、その中から特定の文字を見つけた場合には、そこまでの文字をText Boxに追加し、表示するようにします。その間は入力処理を受け付けるように作成し、エンターキーが入力された時に、前回解析した文字列の最後の位置から再度解析を行い、特定文字を見つけるまで同じことを繰り返します。
ページが変わる文字が見つかった場合には、一度Text Boxの中を空にし、新しいページのテキストをデータテーブルから引っ張ってきて、同様のことを繰り返すことで可能になるでしょう。文字列の分析には文字列用ノードが用意されていますので、ご参考ください。
解決済みになってしまっていたのは、ちょっとしたこちらのちょっとした手違いです。改めて解決済みになった際には変更の方をお願いします。
alwei
(alwei)
6
文字列を管理する際には1ページ丸ごとをデータテーブルで管理するのですが、表示は" 空のText Box "を利用します。データテーブルから1ページ分のテキストを取得したら、特定文字があるまで文字列を解析します。その特定文字までの文字列を空のText Boxに追加することで、必要な部分までの表示ができます。
次に入力が来るまでは文字列の解析は行わず、エンターキーが入力されたタイミングで、最後に解析した文字列の位置から再度解析し、特定文字があればそれを再度追加、というように手順を繰り返します。最後に1ページ分の区切りとなる部分まで見つけたら、その次のエンターキー入力のタイミングで、Text Boxを空に、表示をクリアし、また最初から同様の手順を繰り返すことで、実装が可能です。
文字列の解析には便利なノードが沢山ありますので、こちらを参考にしてください。
sylph55
(sylph55)
7
ご回答ありがとうございます。
申し訳ないのですが、データテーブルで1ページ分のテキストが全て表示されるように作ることはできるのですが、「1ページ辺りのテキストの中に特定文字を入れて、そのテキストを見つけた際にエンターキーが入力されるまで次の表示を行わないようにする」というやり方がうまくできませんでした…。これに関しては、どのようにノードを組めば良いのでしょうか?
sylph55
(sylph55)
8
ご回答ありがとうございます。
サイトを参考に、なんとか「特定の文字が来たらそこでテキストをストップさせる」まではできたのですが、その後の「エンターを押すと次が流れていく」といったことがどうも実装できずにいます。
度々申し訳ないのですが、ノードの組み方のアドバイスを頂けないでしょうか。
画像はウィジェットBPで特定の文字まで来たら文章が止まるよう組んだものです。
alwei
(alwei)
9
「エンターを押すと次が流れていく」というのは文字が順番に表示されていき、時間をかけて表示していくということでしょうか?と、なると文字の追加を時間をかけて行う必要がありますので、実装難易度が1ランク上がってしまいます。
例えばTickやTimeLineやTimerなど、なんでもいいですが、時間をかけて処理可能なノードを使って、何フレームかにかけてゆっくり文字を追加していきます。文字の追加が終わるまでそれを繰り返します。その間もキー入力を受け付けるのであれば一気に文字を追加し、表示用処理を完了させるとよいでしょう。
sylph55
(sylph55)
10
時間をかけて表示させることができない、というよりは、特定文字が来てテキストがストップした後、「エンターを押したら次のテキストが表示される」自体が実装できずにいます。キーボードイベントのEnterにはどのようなノードを組めば良いのでしょうか。
alwei
(alwei)
11
文字列解析が出来ているのであれば、Text Boxに文字を追加→エンターキーの入力で次の特定文字列を解析→特定文字を見つけたらText Boxに文字を追加、をずっと繰り返していくだけなのですが、具体的にどの部分がわからず実装ができないのかを教えてもらえると答えやすいです。
sylph55
(sylph55)
12
すみません、初心者ゆえ簡単なことが理解できず、実装できずつまずいているのだと思います…。
文字列解析のやり方自体間違っていて最初からノードの組み方がおかしい可能性もあります。本当に申し訳ないのですが、できればその「Text Boxに文字を追加→エンターキーの入力で次の特定文字列を解析→特定文字を見つけたらText Boxに文字を追加」の部分のノードの組み方を詳しく教えてもらえないでしょうか?
alwei
(alwei)
13
すいません、ここまでText Boxと書いていましたが、全てただのTextのウィジェットで問題ありません。
ええっと、答え全てを書いてしまうとご自身の成長にも繋がらなくなってしまい、今後何かを実装する際にきっと躓いてしまうので、せめてロジックをもう一度細かく書きます。
1.データテーブルから1ページ分の文字列を取り出す
2.入力の区切りとなる文字列を検索する
3.区切りとなった文字の位置(インデックス)を保存する
4.String型変数に区切り文字までの文字列を追加(Append)する
5.表示用のTextウィジェットに、4.のString型変数をTextに変換してSetTextでセット
6.入力待ちを行い、Enterが来るまで処理をしない
7.入力が来たら、前回の位置(インデックス)から再度区切り文字を探す
8.前回の位置から、区切り文字までの文字列を4.と同様に追加
9.ページの終了文字が来たら、入力の後にTextを空にクリアする
10.ここから再度1.以降の手順をずっと繰り返す
おそらく、これで実装できるはずです。これでも難しいというのであれば、単純なロジック構築能力の問題かと思いますので、もっと簡単な内容でノードを組んでみてから練習してみることをお勧めします。
sylph55
(sylph55)
14
詳しくご回答してくださりありがとうございます。
ご回答や貼ってくれたサイトを参考に、自分なりにノードを組んでみたところ、途中までは理想通りテキストが進んでいってくれるのですが、途中からおかしくなりまだ表示されてほしくない次の行の先頭文字までもが何故か表示されていってしまう等の不具合が起きます。
ノードの組み方がおかしいのでしょうか?申し訳ないのですが、もしもおかしな点が分かれば教えていただけないでしょうか…。
Enterイベントは、レベルブループリントでNext Messageを呼び出すようにしています。
alwei
(alwei)
15
途中まで出来ているということはかなり惜しい部分まできているはずです。ノードだけを見ても直接デバッグしてみなければ原因がわかりませんので、あとは根強くデバッグして、ひとつひとつ確認していくしかありません。
ブループリントのデバッグについては以下のドキュメントが役立つはずです。
sylph55
(sylph55)
16
試行錯誤した結果、なんとか思い通り動くようになりました。
本当にありがとうございました!