カウントダウンの実装方法~後編~最後にアドバイスがあるよ!
どーも!Free_Gamerです!
今回は前回の続き・・・
カウントダウンの実装方法~後編~
を始めていきたいと思います!
前回は、
とりあえずカウントダウン処理を実装することはできました。
ですが・・・
動画(画面の左上)を見てもらえると分かる通り、カウントが「0」になっても、「0」以下まで下がり、「-1」「-2」・・・と下がっていってしまいましたね。
今回はカウントが「0」になったらそこできっちりカウントダウンを止める処理を実装していきたいと思います!
前回のカウントダウン処理のBPを開いてください!
レベルBPにありましたよね。
これですね!
今回はこれにちょっと改良を加えます!
加えるもの!
・Branch
・Integer変数
・<か≦
それではやっていきましょう!
まずInteger変数を作ります!理由はカウントダウン終了時に使いたい重要なものだからです!
レベルBPの画面左側の変数の項目にある「+変数」ボタンをクリックし、Integer型の変数を作ります!
次に、作った変数の名前を決めましょう!
カウントダウン終了時に使いたいので、「FinishCount」とでもしておきましょうか!わかりやすいですね!多分!
さて!一度コンパイルして、ここでInteger型の変数を作ることは終わりました!デフォルト値は「0」のままで!
次に、Branchノードを出しましょう!
Branchノードは、Condition(条件)によって「True」か「False」どちらかの処理を流すノードです!
このノードはよく使います!覚えておきましょう!
このBranchを、Timer変数とPrintStringの間に挟みましょう!
画像のように出来ましたか??
次に、FinishCount変数をセットし、BranchのTrueとつなぎましょう!
出来ましたか??
次に、PrintStringをもう1個出しましょう!
そして、「<(小なり)」ノードを出しましょう!
グラフ内で右クリックし検索欄に「<」と打つと、
「Integer<Integer」か「Integer≦Integer」の2つが出てきます。
どちらでもいいので、今回は「Integer≦Integer」を選びましょう!
このノードは、「「A」が「B」と同等、あるいは「B」より小さい場合、Trueを返す」ノードです。
なぜこのノードを使うのか、後程わかります!
さて!このノードの「A」に、セットTimer変数のピンをつなげ、「B」には「0」の値を入れておきましょう!
そして、「Integer≦Integer」の赤いピン、いわゆるBooleanピンをBranchのConditionにつなぎましょう!
Booleanは、「True」か「False」の値を持つ型ですよ。
出来ましたか??
そして、BranchのFalseを、もう1個のPrintStringにつなぎましょう!
最後に、セットTimer変数のピンをFalseにつながっているPrintStringのピンクのピン、Stringピンにつなぎ、
セットFinishCount変数のピンをすぐ隣につながっているPrintStringのStringピンにつなぎましょう!
OKです!これで完了です!
さて!ここでBPの流れを整理しましょう!
①ゲーム開始時EventTickが毎フレーム呼び出される
②1秒おきにカウントダウンが始まる。
この時まだカウントダウンの秒数は0より上、つまり「A」が「B」より大きいためBranchの処理はFalseに流れている。
③カウントダウンが「0」になったとき、「A」が「B」と同等、それ以降はずっと「B」より小さくなるので、「Integer≦Integer」が「True」を返し、Branchの処理は「True」に流れ続ける。
④TrueにつながっているセットFinishCount変数のデフォルト値「0」を、PrintStringによって表示し続ける。
といった感じです!
それではコンパイルし、実際にプレイしてみましょう!
動画のように行きましたでしょうか??
行ったのなら大成功です!よかったですね!^^
ちなみに、「Integer<Integer」ノードを使っても結果は変わりません。
実際にやってみるとわかります。
さて!うまくいって (((o(*゚▽゚*)o)))ウェーイwwwwwwww としているところで一つアドバイスです!
これは僕が実際にやった間違いなので、よーく覚えといてください!
僕は、このカウントダウンの処理を作っているときに、
「0、つまり「A」が「B」の0と同等の時にTrueにつながっている処理を流すようにしよう!」
と決めました!
なので、「A」と「B」が同等の時にTrueを返すノード「Integer=Integer」ノードを出しました!
これのことですね!
そしてあとは同じように処理を組んでいく!
ノリノリで作り、さあ完成!
さあ!プレイスタートだぁあ!
確かめてみると・・・
動画を見てもらうとわかったかと思いますが、0に到達したのにも関わらずそのまま「-1」「-2」・・・と続いてしまいました。
なぜでしょう??この時の僕は本当に悩みました。
さて、勘のいい人ならもう気づいたかもしれませんが、僕は痛恨の勘違いをしています。
いったいどこを勘違いしたというのでしょうか??
変数をミスった??デフォルト値が違う??そもそもこれ本当にUE4??それとも俺のPCがbg(ry・・・
原因はどれでもありません。原因はこれです!
さっきの文章を思い出してみましょう。
「0、つまり「A」が「B」の0と同等の時にTrueにつながっている処理を流すようにしよう!」
と決めました!
なので、「A」と「B」が同等の時にTrueを返すノード「Integer=Integer」ノードを出しました!
さあ気づきましたか??
原因は「Integer=Integer」ノードにあったのです!
くどくて申し訳ないですが、「Integer=Integer」ノードは「A」と「B」が同等の時に「True」を返すノードです。
言い方を変えると、「A」と「B」が同等の時に”しか”Trueを返さないということになります。
つまり、カウントダウン用のTimer変数が0になった時にちゃんと「True」に処理が流れているのですが、「B」と同等になるのは一瞬なので、0以下になった時点ですぐにFalseに処理が戻り、そのまま0以下の数値が表示された。
と、いうことになります。
実際にBPの処理がどう流れているかの映像も含めて動画にしました。見てみるとよくわかると思います。
おわかりいただけただろうか。
僕の言った通り、「A」と「B」が同等になった時だけ「True」に流れ、それ以降はすぐに「False」の処理に戻りましたね。
僕と同じようなミスをしないよう皆さんにお伝えしました。
まあ僕がバカなだけってのもありますが(真顔)
もし、カウントダウン処理のあるゲームを作りたいということであれば、参考にしてみてください!
それではまた!^^ノシ