‫お帰りなさい｡
‫さて､ ゲームモードができましたので､ ゲームモードを使ってゲームを開始するタイミングを決めたいと思います｡
‫さて､ ゲームによっては､ ゲーム開始時に遅延やカウントダウンタイマーが開始されるものがあります｡
‫そして､ 一定時間が経過すると､ プレイヤーはキャラクター､ 私たちの場合は戦車を世界の中で動かすことができるようになるのです｡
‫そこで､ このビデオでは､ それを実装していきます｡
‫これは､ ゲーム開始時にまず入力を無効にして移動できないようにし､ 次にタイマーをセットして一定時間後に入力を有効にするものです｡
‫そこで､ 戦車のゲームモードのチューニングに戻り､ ここにいくつかのことを追加してみましょう｡
‫まず､ ゲーム開始時に動き出すまでの経過時間をフロートで表示するようにしたいと思います｡
‫このフロートをstart delayと呼び､ これを3ポイントFに初期化して､ ゲームを開始する前に3秒待つようにします｡
‫さて､ ゲームが始まると同時に､ このタイマーを開始したいと思います｡ つまり､ このタイマーを開始する関数が必要で､
‫これもプライベート関数にするつもりです｡
‫これをhandle game startというvoid関数にします｡
‫これで､ 戦車ゲームモードでのゲームスタート操作が実装できるようになりました｡
‫ここから下に降りて再生を開始します｡
‫ここで､ tune tanks game modeのクラス名を忘れずに追加して､ handle game start関数を作成しました｡
‫さて､ これを呼び出す場所は「Begin Play」でしょう｡
‫Begin Playはゲーム開始時にコールされるため｡
‫そこで､ ハンドルゲームを呼び出し､ ここからプレイを開始します｡
‫ゲーム開始時に､ 戦車や調整用戦車､ プレイヤー､ コントローラーの変数を設定しているので､
‫これらをゲーム開始時のハンドルに移動させたいと思います｡
‫そこで､ これらを右下の handle game start に移動し､ handle game start を呼び出してプレイを開始するため､
‫tank と tune tanks player controller を設定します｡
‫そこで､ ここでカウントダウンタイマーをスタートさせ､ その後､ ユーザー入力を可能にしたいと思います｡
‫さて､ タイマーをスタートさせる前に､ まだタンクを動かせないように入力を無効にしておきます｡
‫そのためには､ 私たちの機能が必要になってきます｡
‫ここでは､ チューンタンクの中に､ set player enabled stateというプレイヤーコントローラを配置しました｡
‫そして､ チューンタンク､ プレイヤーコントローラーを使うということです｡
‫チューンタンクのプレイヤーコントローラーを使うなら､ それが有効かどうか確認するのもいいと思うしね｡
‫そこで､ if tune tanks, player, controllerと言い､ このif文の内部まで到達したら､
‫tune tanks, player controllerと呼び､ set player enabled stateとfalseを渡すことができます｡
‫そうすれば､ 戦車は動かせません｡
‫そして､ 赤い四角が見えますが､ これは戦車のチューニングではなく､ 戦車､ プレイヤーコントローラーと言ったからです｡
‫だから､ 今は正しいスペルで書けば､ エラーは出ない｡
‫そこで次に､ タイマーを起動する必要があります｡
‫タイマーはFタイマーハンドルを使用することが分かっているので､ クラスに属するメンバー変数を持つのではなく､
‫実際にFタイマーハンドルを作成することができます｡
‫そこで､ 先にそれをやって､ このプレーヤーをイネーブルタイマーハンドルと呼ぶことにします｡
‫次に､ タイマーを設定する必要があります｡ タイマーのコールバック関数には､ set player enabled stateを使用したいと思いますが､
‫set player enabled stateはboolean型の入力を必要とする関数です｡
‫さて､ 入力パラメータを必要とするコールバックを使ってタイマーを設定する方法については､ まだ見ていません｡
‫これには､ タイマーのデリゲートという新しい概念が必要になります｡
‫そこで､ Unreal Engine のタイマー システムについて説明します｡
‫ここでも､ タイマーを管理するワールドタイマーマネージャーがあり､ タイマーを設定する機能があることがわかります｡
‫現在､ セットタイマー機能のオーバーロードは複数存在します｡
‫すでに一人見ています｡
‫さて､ この関数の別バージョンについてお話します｡
‫そして､ このバージョンでは､ タイマー・ハンドル､ タイマー・レート､ またはコールバック関数が呼ばれる前に待機しなければならない遅延時間が必要です｡
‫また､ コールバック関数のアドレスを直接受け取るのではなく､ タイマーのデリゲートと呼ばれるものを受け取ることができます｡
‫これは､ F timer delegate型の構造体で､ 関数を直接バインドできるオブジェクトを作成することができます｡
‫また､ タイマーデリゲートは､ 入力パラメータを必要とする関数をバインドすることができます｡
‫ここで､ EF timer delegate変数を作成し､ f timer delegateからcreate you object関数を使って初期化することができます｡
‫これは､ 新しいタイマーデリゲートを作成し､ 括弧内に渡した内容に基づいて初期化します｡
‫これは､ ofであるユーザーオブジェクトを取ります｡
‫もちろん､ コールバック関数が存在するクラスです｡
‫次に､ コールバック関数自体のアドレスと､ コールバックが呼び出されたときに渡したい入力値を受け取ります｡
‫そこから､ ワールドタイマーマネージャーからセットタイマーを呼び出し､ タイマーデリゲートを取るオーバーロードを使用することができます｡
‫このオーバーロードには､ タイマーハンドル､ タイマーデリゲート､ 再生速度､ コールバックが呼ばれるまでの遅延時間を決定する
‫float､ そしてタイマーがループするかどうかを決定する boolean が必要で､ F タイマーデリゲートの作成方法を知っておくことができます｡
‫そこで､ 新しいif文の中にあるhandle game start関数で作ってほしいのです｡
‫そこで､ ローカルにf timer delegateを作成し､ f timer delegateを使用します｡
‫オブジェクトを作成します｡
‫ここで､ ユーザーオブジェクトを渡す必要があります｡ 通常はこれをユーザーオブジェクトとして使用しますが､
‫呼び出したい関数はプレーヤーコントローラーに存在します｡
‫最初の入力はユーザー・オブジェクトで､ コールバック関数はカスタム・プレイヤー・コントローラに追加したプレーヤー有効状態の設定になります｡
‫演算子のアドレスと､ 3番目の入力として､ 値を渡すことを忘れないでください｡
‫Trueの場合､ タイマーの終了時にコールバックが呼び出されたときに､ プレーヤーの有効状態の設定に渡される値です｡
‫だから､ ビデオを一時停止して､ 今すぐこれを試してみてください｡
‫そこで､ タイマーハンドルのすぐ下に､ ローカルFタイマーデリゲートを作成し､ このプレーヤーイネーブルタイマーデリゲートと呼ぶことにします｡
‫それでいいんです｡
‫他の名前にしたら
‫では､ fタイマー､ デリゲート､ オブジェクトの作成を使って初期化します｡
‫そして､ これは最初にユーザーオブジェクトを取得し､ それがチューンタンクプレーヤーコントローラーになります｡
‫そこで､ 最初の入力として､ タンク・プレーヤーのコントローラーをチューニングすると言うわけです｡
‫2つ目のコールバック関数は､ tune tanks player, controller set player
‫enabled stateにします｡
‫そして忘れてはならないのは､ この関数のアドレスにはオペレータのアドレスが必要で､ このコールバック関数に渡されたい値は､
‫その方法で真になることだ｡
‫遅延時間の終了時にこのコールバックが呼ばれると､ コールバック関数に渡された値であるtrueが返されます｡
‫これで､ タイマーのセットを呼び出す準備ができました｡ つまり､ ワールドタイマーマネージャーの取得を呼び出す必要があるのです｡
‫そして､ そこからセットタイマーを呼び出すことができるのです｡
‫そして､ 今回使用する関数のオーバーロードは､ まずタイマーハンドルを取得し､ それがプレイヤーのイネーブルタイマーハンドルとなります｡
‫次に渡す入力は､ デリゲートになります｡
‫つまり､ プレイヤーのイネーブル､ タイマーのデリゲートになるわけです｡
‫次のページ
‫遅延時間が必要ですが､ これは先ほど作成したfloatであるstart delayになります｡
‫だから次はスタートディレイで通しています｡
‫最後に､ このタイマーをループさせたくないので､ falseを渡して､ ループする動作をさせないようにします｡
‫では､ これらの入力を字下げして､ 見た目がきれいになるようにします｡
‫そして､ 新しいタイマーデリゲートを使って､ セットタイマーを呼び出しています｡
‫この遅延時間が終了すると､ コールバック関数 set player
‫enabled state が呼び出され､ 値 true
‫が渡されるはずです｡
‫再生ボタンを押しても､ この3秒の遅延が終わるまで動けないはずです｡
‫では､ これをコンパイルして､ どのように動作するのか見てみましょう｡
‫それで､ 先に再生を押して､ 移動しようとしても､ できないんです｡
‫そして､ 3秒後に突然動けるようになるのです｡
‫さらに､ こんなこともチェックしています｡
‫私のカーソルが十字キーになっていることに注目してください｡
‫画面では見づらいかもしれませんが､ あなたの画面では問題なく見ることができるはずです｡
‫そして､ これによって､ 戦車の狙い撃ちやコントロールがとてもやりやすくなりました｡
‫タレット回転｡
‫完璧です｡
‫つまり､ 要約すると､ ゲームモード用のハンドルゲーム開始関数を作成し､ これを呼び出してプレイを開始しているのです｡
‫また､ タイマーデリゲートを使用してタイマーを設定し､ プレーヤーコントローラーの set player enabled state 関数にバインドしています｡
‫これにより､ 入力パラメータを受け取るタイマーのコールバック関数を用意することができ､ ゲーム開始時に3秒間の遅延の後､
‫ユーザー入力を可能にするためにこれを使用します｡
‫もし､ 入力が有効でないことを視覚的に知らせてくれるようなものがなければ､ プレイヤーはイライラしてしまうでしょう｡
‫画面にカウントダウンのようなものが表示される｡
‫ですから､ 今後のビデオでその点をケアしていきたいと思います｡
‫でも､ とりあえずはおめでとうございます｡
‫これで､ 入力パラメータを受け取る関数をタイマーデリゲートにバインドする方法を理解しました｡
‫次の動画でお会いしましょう｡