読者です 読者をやめる 読者になる 読者になる

I From Japan Staff Blog

I From Japan の開発者ブログです

カウントダウンタイマーとGameStateさん。オンライン同期 UE4

プログラミング Unreal Engine 4

こんばんは。

 

 よしざねです

 

ちなみに、まだLevelStreamingの問題は解決しておりません...

 

 

本日はホームページのSEO対策やら、ブログのお引っ越しなので忙しかったので

 

 

 

軽めのプログラムを組んで進捗報告をしよう

 

 

 

 

 

と思っていました!! いました!! いました!! いました!! いました!! いました!! いました!!

 

ですが今、何時ですか!?

 

ブログを書いている現在は朝の4時12分です。

 

 

気を取り直して行きましょう。本日は

 

 

カウントダウンタイマーとGameStateについてです。

 

オンラインゲームによくある、対戦前のカウントダウンタイマーを作りました。

 

 

はじめに,

 

 

 

 

本日もバグっております。

 

 

解決はしております。

 

 

しかし、なぜ解決したのか、なぜバグっているのかはわかっていません。

 

 

 

今後、ブループリントを勉強していくうちに解決することを願います。

 

解決次第また、記事にします。

 

 

実装した、動画がこちらです。

 

 

 


CountDown

 

 

これはロビー画面で処理をしていますが

 

バトルフィールドでも同じステップを踏むことで実装可能です。

 

 

まずは、使用しているGameModeのOnPostLoginに

 

f:id:YoshiakiNakamichi:20161001042133p:plain

 

以下のイベントをつなぎます。

これはサーバーで実行します。

 

f:id:YoshiakiNakamichi:20161001043543p:plain

 

キャストしているのはPlayerControllerです。 

 

 

 

このサーバーを作成した時に設定した

 

Max Playerと現在ログインしているPlayerが同じ数であるかどうかを確かめます。

 

 

 

 

この処理で全員のロードが完了しているかどうかを確かめます

 

 

 

 

現在のPlayerの数はOnPostLoginの時にサーバー側で

 

Player ControllerのArrayに追加していき、それのLengthで確かめることができます。

 

f:id:YoshiakiNakamichi:20161001043321p:plain

 

 

イベントの中身はこちらです。

 

 

f:id:YoshiakiNakamichi:20161001043736p:plain

 

 

 これは、それぞれのクライアントのみで実行です。

 

 

add to View port の ZOrder は 

 

今回の僕のプロジェクトの場合

 

この時点での一番表面に来ていたウィジェットの ZOrder が 2 でしたので

 

それよりも表面に持ってくるために今回は  に設定しました。

 

 

この処理で、それぞれのプレイヤーに

 

 

カウントダウン用のウェジェットが一番表面に生成されました。

 

 

次にカウントダウンの処理を作って行きます。

 

 

このカウントダウンの処理は、

 

それぞれのプレイヤーでカウントダウンのズレが無いように作ります。

 

 

それぞれのウェジェット内でカウントダウンの処理をしてしまうとズレが生じてしまいます...

 

 

 

そんな時に活用できるのが GameState です!

 

 GameStateは、

 

すべてのクライアント上とサーバーに存在しているのですが

 

クライアントが常にサーバーのGameStateを参照し続けています。

 

つまり、

 

 

どんなときでも

サーバーや全クライアントから読み出すGameStateの情報は、同じものという事です!

 

ですので、ゲームのスコアや、ゲーム内で経過している時間などを保持するのにピッタリというわけです。

 

 

 

今回はGameStateの中でカウントダウンの処理をしてそれを各ウェジェットから呼び出しました。

f:id:YoshiakiNakamichi:20161001050846p:plain

 

 

これはウェジェットのイベントConstructです。

ここでGameStateのカウントダウンの関数を呼び出します。

 

中身は単純にIntをマイナスしていっているだけです。

 

 

そして、その変数をそれぞれのウェジェットで読み出そうとした時!!

 

 

 

バグが発生しました。

 

 

通常ならば、Get GameState で、そのあと使用しているGameStateにキャストをすれば変数を参照できるはずなのですが、何故かクライアント上では参照できない事態に陥りました。

 

Constructを使ってみたり、関数をつかってみたり、わざわざInstanceを通してみたり,,,,,

いろいろなことを試してみましたが、結局解決しませんでした。

 

誰かお助けを、、、

 

 

カウントダウンの変数を参照できた唯一の方法がこちらです。

 

 

f:id:YoshiakiNakamichi:20161001051314p:plain

 

 

ウェジェットに表示していたカウントダウンの数字のバインディング用に作った関数の中から変数を参照しました。

 

上のノードはStartの文字の表示と数字の表示を管理しています。

 

この方法はそんなに良くない方法だと思うので、解決策を探っていきたいと思います。

 

 

夜明け近いので日本語がおかしいところが所々あると思うので、近いうちに訂正します。

 

 

 

 

それでは!