‫この講義では､ ゲームモードからゲームが終了したという情報を受け取り､ 5秒後にプレイヤーが死亡したレベルを再ロードするこの再起動動作を作成するプレイヤーコントローラーをまとめることになります｡
‫さっそく潜入してみましょう｡
‫ゲームが終了したら､ プレイヤー・コントローラーに通知する必要があります｡ また､ C++でプレイヤー・コントローラーを作成し､
‫レベルを再開できるようにするなどの動作を実装する必要があります｡
‫だから､ このポイントが殺されると､ まず､ 無差別にログを取ることになるんです｡
‫ゲームオーバーになったかどうかは確認したい｡
‫さて､ シナリオは2つあります｡
‫ひとつは勝つところ､ もうひとつは負けるところ｡
‫負けは一番簡単なので､ 最初に取り組むことにしました｡
‫殺されたポーンが負けたプレイヤーであればそれで終了です｡
‫このゲームモードを繰り返し使って､ 複数のライフを持つという選択もあるかもしれませんが､ 私はそんなことはしないつもりです｡
‫シングルライフでいいんです｡
‫死んだらゲームオーバー｡
‫再起動したほうがいいかもしれません｡
‫では､ このポーンがプレイヤーコントローラーであるかどうかは､ どのように確認すればよいのでしょうか｡
‫なるほど､ なかなか分かりやすいですね｡
‫キャストすればいいので､ プレイヤーコントローラーにキャストして､ 殺されたポーンにキャストすることにします｡
‫そして､ これがnullでない場合｡
‫そこで､ ポインタ､ プレーヤーコントローラのポインタを取って､ プレーヤーコントローラと呼び､ その結果をここに格納しましょう｡
‫つまり､ プレーヤーコントローラーがヌルポインターでなければ､ プレーヤーが死亡し､
‫ゲームオーバーになったことがわかります｡
‫そこで､ プレーヤーコントローラのメソッドを呼び出すことにします｡
‫ゲームハズエンドメソッドがあることは､ すでにほのめかしています｡
‫これを見てみよう｡
‫コントロールPでプレイヤーコントローラーを見て､ game has endedを探すと､ 確かにここにgame
‫has endedという仮想メソッドがあり､ ゲーム終了のフォーカスがあるのがわかりますね｡
‫最終的にどのアクターに注目するかは､ デフォルトではこれがヌルポインターで､ それを使うことになるのでしょう｡
‫そして､ これが優勝か､ と言うことになる｡
‫基本的には､ プレイヤーに操作してもらい､ 勝ったかどうかがわかるようにすることです｡
‫そしてそれは､ この場合､ かなりストレートに言えることです｡
‫いいえ､ そうではありません｡
‫そこで､ プレイ・コントローラー・アロー・ゲームが終了し､ エンド・ゲーム・フォーカスのためのヌル・ポインターを置くつもりです｡
‫単純に虚偽になるんですよ｡
‫これって､ さっき死んだばかりのプレイコントローラーだから､ 勝ち組じゃないよね｡
‫ということで､ そろそろ少しチャレンジングなことを実践してみませんか？
‫プレイコントローラーでゲームが終了しました｡
‫つまり､ C++ プレイヤー コントローラーを作成し､ そのブループリント サブクラスを作成し､ そのブループリント サブクラスをゲーム
‫モードからデフォルトでスポーンし､ その後､ オーバーライドする必要があります｡
‫ゲームが終了し､ ログメッセージを入れて､ 確かに取得していることを確認します｡
‫そのゲームは､ 適切なタイミングで終了しました｡
‫ビデオを一時停止して､ 試してみてください｡
‫なるほど｡
‫お帰りなさい｡
‫ステップ1では､ C++のプレイヤーコントローラーを作成し､ 新しいC++クラスを作成します｡
‫次に､ これをシュータープレイヤーコントローラと呼ぶことにします｡
‫そのクラスを作成してください｡
‫これが完了したら､ ブループリントに移動して､ これを基にしたブループリント クラスを作成したいと思います｡
‫そこで､ シューター・プレイヤー・コントローラーをベースとして選択し､ それをビープ・アンダースコア・シューター・プレイヤー・コントローラーと呼ぶことにします｡
‫これは今のところ本当に必要ではありませんが､ 後々､ このプレーヤー・コントローラーにいくつかのUIアセットをフックアップすることになるでしょう｡
‫だから､ そこに用意しておくのです｡
‫次に､ beep, more game mode に移動して､ それをドッキングします｡ デフォルトのプレイヤーコントローラクラスを､ プレイヤーコントローラから､
‫beep underscore shooter プレイヤーコントローラに変更したいからです｡
‫かっこいい｡
‫そして､ ゲームが終了したことをオーバーライドしたい｡
‫では､ プレイヤーコントローラーに移動して見ましょう｡
‫これが公開されていることがわかる｡
‫これがそのサインです｡
‫コピーしよう｡
‫シュータープレイコントローラーHに移動し､ パブリックを作成します｡
‫その仮想空白のゲームに終止符を打った｡
‫かっこいい｡
‫そして､ 明らかにどこからかオーバーライドされているため､ すでにオーバーライドされています｡
‫そして､ 私たちにできることは､ それを実行に移すことです｡
‫コントロールシフトpをスーパーメモリーへ呼び出す｡
‫そして､ このようにゲームが終了してしまいました｡
‫そして､ エンドゲームフォーカスでパスして､ Bがウィナーで､ ログを取りたいのです｡
‫それでログを取るんですね｡
‫そこで私のマクロを使ってください｡
‫終了しました｡
‫最後に出てくるのはログメッセージになりそうですね｡
‫では､ コンパイルして､ それがうまくいっているかどうか見てみましょう｡
‫出力ログを見に行く｡
‫再生ボタンを押して､ 行って､ 殺されてください｡
‫基本的にhealthyは徐々に下がっていき､ その後メッセージが表示されるはずです｡
‫メッセージは届いていますか？
‫いいえ｡
‫では､ 見てみましょう｡
‫ここでいうプレイヤーコントローラーとは？
‫Beep underscore shooter player controllerが正しいようです｡
‫オーバーライドゲームが終了しました｡
‫さて､ ここでバグを発見｡
‫さて､ お気づきの方もいらっしゃるかもしれませんが､ プレイヤーコントローラーをキャストしているのですが､
‫これがプレイヤーの実際のコントローラーと混同されているようです｡
‫ここでやりたいことは､ 殺された...のコントローラを取得する､ ということです｡
‫それで､ arrow get controllerでコントローラを取得して､ それをプレイヤーのコントローラにキャストして､
‫もしそれがnullだったら､ うまくいくはずです｡
‫では､ さっそく試してみましょう｡
‫どうぞ､ 再生ボタンを押してください｡
‫また自分たちが殺される｡
‫また､ 今回はログメッセージも表示されません｡
‫しかも今回は微妙な理由で｡
‫それは､ コントローラーから切り離すからです｡
‫これを呼ぶ前に......殺す｡
‫だから､ コントロールしようとすると......それは実際には無効で､ コントロールするものはもうないんです｡
‫そのため､ コントローラからデタッチする直前に､ この通知を行う必要があります｡
‫それは､ 私たちのゲームモードを把握するラインの移動も含まれます｡
‫そんなことは関係ないと思っていた｡
‫でも､ 実際に考えてみると､ そう､ もちろんそうなんです｡
‫では､ 私たちのレベルに入ってプレイしてみましょう｡
‫さあ､ 撃たれに行こう｡
‫そして､ それが終わると､ 思い通りのプリントに仕上がったことがわかります｡
‫そのため､ 途中､ 何度かハプニングがありました｡
‫チャレンジでそれができなかったのは､ あなたのせいではありません｡
‫それ以外のことは､ それまでちゃんとやっていたんですね｡
‫それは素晴らしいことです｡
‫でも､ もしそのようなことで行き詰まったら､ 心配しないでください｡
‫ここで最後にやりたかったのは､ 実際にタイマーでゲームを再開することです｡
‫プレイヤー・コントローラには､ リスタート・メソッドがあるので､ これを利用するのは簡単です｡
‫だから､ これを見に行くと､ 再稼働レベルになっているはずです｡
‫それが､ タイマーで呼び出したいものなのです｡
‫タイマーを使って繰り返し処理を行うことは以前にもありましたが､ ある動作を一定時間だけ遅らせるという使い方もできます｡
‫そこで､ シュータープレイヤーコントローラーHで､ ここにプライベートプロパティを作成します｡
‫プライベートとは､ どこでも編集可能な自分の所有物のことです｡
‫フロートです｡
‫それが再起動の遅れになる｡
‫もうこれだけで設計図ベースが必要な理由がわかりますね｡
‫5/2の遅延にします｡
‫次に､ C++に移動して､ タイマーの世界タイマー・マネージャーを取得することにします｡
‫そして､ その上で行うことができます｡
‫それから､ インクルードする必要があります｡
‫だからハッシュインクルードして､ タイマーマネージャーになる｡
‫H そうすると､ DOT演算子が使えるはずです｡ ここの戻り値の型は参照なので､ タイマーを設定しようとすると､
‫ここでタイマーハンドルを渡す必要があります｡
‫そこで､ プライベートセクションに､ 作成してみましょう｡
‫つまり､ Fタイマーのハンドルになるわけですが､ ここではリスタートタイマーと同じように呼ぶことにします｡
‫これがセットタイマーに渡されるハンドルになります｡
‫次に必要なのは､ 5番目のシグネチャで､ 呼び出したいオブジェクトを指定することです｡
‫それから､ メソッドそのものも必要だと思います｡
‫だから､ アンパサンドをすればいいんです｡
‫そして､ Aプレイヤー・コントローラーで定義されたメソッド､ リスタート・レベル・メソッドを呼び出したいのです｡
‫つまり､ プレイヤーコントローラーですね｡
‫カレン
‫Cullenの再起動レベルを設定し､ 再起動遅延としてすでに定義した遅延を渡すだけです｡
‫そうして､ 最後にセミコロンをつければ､ うまくいけば5秒後に再起動するようになるはずです｡
‫今度はライフルを開放して､ ほんの少し殺傷力を高めることで､ テストをより簡単にします｡
‫だから､ デフォルトのまま､ ダメージを50にして､ 2発で殺されるようにするんだ｡
‫さあ､ 再生ボタンを押してみましょう｡
‫早く自分たちを殺してくれ｡
‫そして､ 5秒後にうまくいけば､ 私たちは再起動し､ レベルの中に戻ってくるはずです｡
‫つまり､ タイマーは期待通りに動いているのです｡
‫このようなエラーメッセージが表示され､ UUID､ PID､ サンドボックス､
‫ブラブラなど､ 旅行に関する失敗について説明されます｡
‫さて､ 再起動しようとしているときに､ 再起動がうまくいっているかどうかを確認するには､
‫プレイメニューではなく､ ドット､ ドット､ ドットメニューに移動して､ 独立したゲームとしてプレイする必要があります｡
‫もし､ スタンドアローンゲームとしてプレイする場合､ 起動に少し時間がかかりますが､
‫再起動はこのように期待通りに動作します｡
‫そして､ レベルが再読み込みされるのを確認します｡
‫今､ 明らかに､ これが実現する兆候はあまりありません｡
‫そこで､ 次回の講義では､ UIについて見ていきたいと思います｡
‫現地でお会いしましょう｡