﻿1
00:00:04,550 --> 00:00:21,050
‫この講義では､ ゲームモードからゲームが終了したという情報を受け取り､ 5秒後にプレイヤーが死亡したレベルを再ロードするこの再起動動作を作成するプレイヤーコントローラーをまとめることになります｡

2
00:00:21,050 --> 00:00:22,730
‫さっそく潜入してみましょう｡

3
00:00:23,360 --> 00:00:30,710
‫ゲームが終了したら､ プレイヤー・コントローラーに通知する必要があります｡ また､ C++でプレイヤー・コントローラーを作成し､

4
00:00:30,710 --> 00:00:38,000
‫レベルを再開できるようにするなどの動作を実装する必要があります｡

5
00:00:38,210 --> 00:00:44,360
‫だから､ このポイントが殺されると､ まず､ 無差別にログを取ることになるんです｡

6
00:00:44,360 --> 00:00:48,200
‫ゲームオーバーになったかどうかは確認したい｡

7
00:00:48,200 --> 00:00:50,390
‫さて､ シナリオは2つあります｡

8
00:00:50,390 --> 00:00:52,730
‫ひとつは勝つところ､ もうひとつは負けるところ｡

9
00:00:52,760 --> 00:00:55,580
‫負けは一番簡単なので､ 最初に取り組むことにしました｡

10
00:00:55,580 --> 00:00:58,220
‫殺されたポーンが負けたプレイヤーであればそれで終了です｡

11
00:00:58,220 --> 00:01:04,850
‫このゲームモードを繰り返し使って､ 複数のライフを持つという選択もあるかもしれませんが､ 私はそんなことはしないつもりです｡

12
00:01:04,850 --> 00:01:06,170
‫シングルライフでいいんです｡

13
00:01:06,170 --> 00:01:07,520
‫死んだらゲームオーバー｡

14
00:01:07,520 --> 00:01:08,900
‫再起動したほうがいいかもしれません｡

15
00:01:09,320 --> 00:01:13,640
‫では､ このポーンがプレイヤーコントローラーであるかどうかは､ どのように確認すればよいのでしょうか｡

16
00:01:13,670 --> 00:01:14,990
‫なるほど､ なかなか分かりやすいですね｡

17
00:01:14,990 --> 00:01:22,700
‫キャストすればいいので､ プレイヤーコントローラーにキャストして､ 殺されたポーンにキャストすることにします｡

18
00:01:22,700 --> 00:01:25,340
‫そして､ これがnullでない場合｡

19
00:01:25,340 --> 00:01:34,490
‫そこで､ ポインタ､ プレーヤーコントローラのポインタを取って､ プレーヤーコントローラと呼び､ その結果をここに格納しましょう｡

20
00:01:34,490 --> 00:01:42,890
‫つまり､ プレーヤーコントローラーがヌルポインターでなければ､ プレーヤーが死亡し､

21
00:01:43,190 --> 00:01:47,540
‫ゲームオーバーになったことがわかります｡

22
00:01:47,630 --> 00:01:52,100
‫そこで､ プレーヤーコントローラのメソッドを呼び出すことにします｡

23
00:01:52,100 --> 00:01:57,500
‫ゲームハズエンドメソッドがあることは､ すでにほのめかしています｡

24
00:01:57,500 --> 00:01:58,460
‫これを見てみよう｡

25
00:01:58,460 --> 00:02:06,530
‫コントロールPでプレイヤーコントローラーを見て､ game has endedを探すと､ 確かにここにgame

26
00:02:06,530 --> 00:02:14,780
‫has endedという仮想メソッドがあり､ ゲーム終了のフォーカスがあるのがわかりますね｡

27
00:02:14,780 --> 00:02:19,970
‫最終的にどのアクターに注目するかは､ デフォルトではこれがヌルポインターで､ それを使うことになるのでしょう｡

28
00:02:20,690 --> 00:02:22,910
‫そして､ これが優勝か､ と言うことになる｡

29
00:02:22,910 --> 00:02:28,340
‫基本的には､ プレイヤーに操作してもらい､ 勝ったかどうかがわかるようにすることです｡

30
00:02:28,340 --> 00:02:31,760
‫そしてそれは､ この場合､ かなりストレートに言えることです｡

31
00:02:31,760 --> 00:02:33,050
‫いいえ､ そうではありません｡

32
00:02:33,140 --> 00:02:47,540
‫そこで､ プレイ・コントローラー・アロー・ゲームが終了し､ エンド・ゲーム・フォーカスのためのヌル・ポインターを置くつもりです｡

33
00:02:47,540 --> 00:02:49,430
‫単純に虚偽になるんですよ｡

34
00:02:49,430 --> 00:02:53,540
‫これって､ さっき死んだばかりのプレイコントローラーだから､ 勝ち組じゃないよね｡

35
00:02:54,370 --> 00:02:56,950
‫ということで､ そろそろ少しチャレンジングなことを実践してみませんか？

36
00:02:56,950 --> 00:02:59,710
‫プレイコントローラーでゲームが終了しました｡

37
00:02:59,860 --> 00:03:06,940
‫つまり､ C++ プレイヤー コントローラーを作成し､ そのブループリント サブクラスを作成し､ そのブループリント サブクラスをゲーム

38
00:03:06,940 --> 00:03:12,530
‫モードからデフォルトでスポーンし､ その後､ オーバーライドする必要があります｡

39
00:03:12,550 --> 00:03:17,350
‫ゲームが終了し､ ログメッセージを入れて､ 確かに取得していることを確認します｡

40
00:03:17,350 --> 00:03:19,830
‫そのゲームは､ 適切なタイミングで終了しました｡

41
00:03:19,840 --> 00:03:21,220
‫ビデオを一時停止して､ 試してみてください｡

42
00:03:21,250 --> 00:03:21,580
‫なるほど｡

43
00:03:21,580 --> 00:03:22,260
‫お帰りなさい｡

44
00:03:22,270 --> 00:03:30,760
‫ステップ1では､ C++のプレイヤーコントローラーを作成し､ 新しいC++クラスを作成します｡

45
00:03:30,760 --> 00:03:34,720
‫次に､ これをシュータープレイヤーコントローラと呼ぶことにします｡

46
00:03:34,750 --> 00:03:36,010
‫そのクラスを作成してください｡

47
00:03:36,010 --> 00:03:44,560
‫これが完了したら､ ブループリントに移動して､ これを基にしたブループリント クラスを作成したいと思います｡

48
00:03:44,560 --> 00:03:53,200
‫そこで､ シューター・プレイヤー・コントローラーをベースとして選択し､ それをビープ・アンダースコア・シューター・プレイヤー・コントローラーと呼ぶことにします｡

49
00:03:53,200 --> 00:03:59,230
‫これは今のところ本当に必要ではありませんが､ 後々､ このプレーヤー・コントローラーにいくつかのUIアセットをフックアップすることになるでしょう｡

50
00:03:59,230 --> 00:04:00,940
‫だから､ そこに用意しておくのです｡

51
00:04:01,150 --> 00:04:07,900
‫次に､ beep, more game mode に移動して､ それをドッキングします｡ デフォルトのプレイヤーコントローラクラスを､ プレイヤーコントローラから､

52
00:04:07,900 --> 00:04:13,150
‫beep underscore shooter プレイヤーコントローラに変更したいからです｡

53
00:04:13,450 --> 00:04:14,050
‫かっこいい｡

54
00:04:14,380 --> 00:04:18,280
‫そして､ ゲームが終了したことをオーバーライドしたい｡

55
00:04:18,490 --> 00:04:21,430
‫では､ プレイヤーコントローラーに移動して見ましょう｡

56
00:04:22,060 --> 00:04:24,550
‫これが公開されていることがわかる｡

57
00:04:24,550 --> 00:04:25,360
‫これがそのサインです｡

58
00:04:25,360 --> 00:04:25,990
‫コピーしよう｡

59
00:04:25,990 --> 00:04:31,390
‫シュータープレイコントローラーHに移動し､ パブリックを作成します｡

60
00:04:32,170 --> 00:04:35,650
‫その仮想空白のゲームに終止符を打った｡

61
00:04:35,650 --> 00:04:36,190
‫かっこいい｡

62
00:04:36,190 --> 00:04:40,210
‫そして､ 明らかにどこからかオーバーライドされているため､ すでにオーバーライドされています｡

63
00:04:41,160 --> 00:04:45,330
‫そして､ 私たちにできることは､ それを実行に移すことです｡

64
00:04:45,340 --> 00:04:48,780
‫コントロールシフトpをスーパーメモリーへ呼び出す｡

65
00:04:49,790 --> 00:04:53,060
‫そして､ このようにゲームが終了してしまいました｡

66
00:04:53,870 --> 00:05:01,770
‫そして､ エンドゲームフォーカスでパスして､ Bがウィナーで､ ログを取りたいのです｡

67
00:05:01,790 --> 00:05:02,810
‫それでログを取るんですね｡

68
00:05:02,900 --> 00:05:04,280
‫そこで私のマクロを使ってください｡

69
00:05:04,610 --> 00:05:07,240
‫終了しました｡

70
00:05:07,250 --> 00:05:10,310
‫最後に出てくるのはログメッセージになりそうですね｡

71
00:05:10,310 --> 00:05:12,880
‫では､ コンパイルして､ それがうまくいっているかどうか見てみましょう｡

72
00:05:12,890 --> 00:05:14,540
‫出力ログを見に行く｡

73
00:05:14,690 --> 00:05:17,690
‫再生ボタンを押して､ 行って､ 殺されてください｡

74
00:05:17,690 --> 00:05:23,480
‫基本的にhealthyは徐々に下がっていき､ その後メッセージが表示されるはずです｡

75
00:05:23,480 --> 00:05:24,530
‫メッセージは届いていますか？

76
00:05:24,530 --> 00:05:24,920
‫いいえ｡

77
00:05:24,920 --> 00:05:25,880
‫では､ 見てみましょう｡

78
00:05:25,880 --> 00:05:27,230
‫ここでいうプレイヤーコントローラーとは？

79
00:05:27,230 --> 00:05:32,870
‫Beep underscore shooter player controllerが正しいようです｡

80
00:05:32,870 --> 00:05:35,570
‫オーバーライドゲームが終了しました｡

81
00:05:35,570 --> 00:05:37,250
‫さて､ ここでバグを発見｡

82
00:05:37,250 --> 00:05:42,170
‫さて､ お気づきの方もいらっしゃるかもしれませんが､ プレイヤーコントローラーをキャストしているのですが､

83
00:05:42,170 --> 00:05:49,760
‫これがプレイヤーの実際のコントローラーと混同されているようです｡

84
00:05:49,760 --> 00:05:57,260
‫ここでやりたいことは､ 殺された...のコントローラを取得する､ ということです｡

85
00:05:57,260 --> 00:06:05,030
‫それで､ arrow get controllerでコントローラを取得して､ それをプレイヤーのコントローラにキャストして､

86
00:06:05,030 --> 00:06:08,600
‫もしそれがnullだったら､ うまくいくはずです｡

87
00:06:08,600 --> 00:06:10,760
‫では､ さっそく試してみましょう｡

88
00:06:10,820 --> 00:06:12,320
‫どうぞ､ 再生ボタンを押してください｡

89
00:06:12,800 --> 00:06:14,030
‫また自分たちが殺される｡

90
00:06:15,700 --> 00:06:18,940
‫また､ 今回はログメッセージも表示されません｡

91
00:06:18,940 --> 00:06:21,370
‫しかも今回は微妙な理由で｡

92
00:06:21,490 --> 00:06:24,550
‫それは､ コントローラーから切り離すからです｡

93
00:06:24,640 --> 00:06:26,890
‫これを呼ぶ前に......殺す｡

94
00:06:26,890 --> 00:06:32,740
‫だから､ コントロールしようとすると......それは実際には無効で､ コントロールするものはもうないんです｡

95
00:06:32,740 --> 00:06:38,470
‫そのため､ コントローラからデタッチする直前に､ この通知を行う必要があります｡

96
00:06:38,620 --> 00:06:42,220
‫それは､ 私たちのゲームモードを把握するラインの移動も含まれます｡

97
00:06:42,220 --> 00:06:43,600
‫そんなことは関係ないと思っていた｡

98
00:06:43,660 --> 00:06:47,200
‫でも､ 実際に考えてみると､ そう､ もちろんそうなんです｡

99
00:06:47,200 --> 00:06:50,170
‫では､ 私たちのレベルに入ってプレイしてみましょう｡

100
00:06:50,500 --> 00:06:51,970
‫さあ､ 撃たれに行こう｡

101
00:06:51,970 --> 00:06:56,940
‫そして､ それが終わると､ 思い通りのプリントに仕上がったことがわかります｡

102
00:06:56,950 --> 00:06:59,020
‫そのため､ 途中､ 何度かハプニングがありました｡

103
00:06:59,020 --> 00:07:01,660
‫チャレンジでそれができなかったのは､ あなたのせいではありません｡

104
00:07:01,660 --> 00:07:03,730
‫それ以外のことは､ それまでちゃんとやっていたんですね｡

105
00:07:03,730 --> 00:07:04,990
‫それは素晴らしいことです｡

106
00:07:04,990 --> 00:07:11,050
‫でも､ もしそのようなことで行き詰まったら､ 心配しないでください｡

107
00:07:11,350 --> 00:07:17,890
‫ここで最後にやりたかったのは､ 実際にタイマーでゲームを再開することです｡

108
00:07:17,980 --> 00:07:25,960
‫プレイヤー・コントローラには､ リスタート・メソッドがあるので､ これを利用するのは簡単です｡

109
00:07:25,960 --> 00:07:30,220
‫だから､ これを見に行くと､ 再稼働レベルになっているはずです｡

110
00:07:30,220 --> 00:07:35,590
‫それが､ タイマーで呼び出したいものなのです｡

111
00:07:35,590 --> 00:07:44,050
‫タイマーを使って繰り返し処理を行うことは以前にもありましたが､ ある動作を一定時間だけ遅らせるという使い方もできます｡

112
00:07:44,050 --> 00:07:50,170
‫そこで､ シュータープレイヤーコントローラーHで､ ここにプライベートプロパティを作成します｡

113
00:07:50,890 --> 00:07:56,740
‫プライベートとは､ どこでも編集可能な自分の所有物のことです｡

114
00:07:58,620 --> 00:07:59,160
‫フロートです｡

115
00:07:59,160 --> 00:08:02,940
‫それが再起動の遅れになる｡

116
00:08:03,060 --> 00:08:05,760
‫もうこれだけで設計図ベースが必要な理由がわかりますね｡

117
00:08:05,790 --> 00:08:08,400
‫5/2の遅延にします｡

118
00:08:08,610 --> 00:08:16,920
‫次に､ C++に移動して､ タイマーの世界タイマー・マネージャーを取得することにします｡

119
00:08:17,520 --> 00:08:19,850
‫そして､ その上で行うことができます｡

120
00:08:19,860 --> 00:08:21,870
‫それから､ インクルードする必要があります｡

121
00:08:21,870 --> 00:08:27,120
‫だからハッシュインクルードして､ タイマーマネージャーになる｡

122
00:08:27,390 --> 00:08:33,210
‫H そうすると､ DOT演算子が使えるはずです｡ ここの戻り値の型は参照なので､ タイマーを設定しようとすると､

123
00:08:33,210 --> 00:08:38,160
‫ここでタイマーハンドルを渡す必要があります｡

124
00:08:38,160 --> 00:08:40,590
‫そこで､ プライベートセクションに､ 作成してみましょう｡

125
00:08:40,590 --> 00:08:46,470
‫つまり､ Fタイマーのハンドルになるわけですが､ ここではリスタートタイマーと同じように呼ぶことにします｡

126
00:08:46,470 --> 00:08:51,230
‫これがセットタイマーに渡されるハンドルになります｡

127
00:08:51,240 --> 00:08:59,130
‫次に必要なのは､ 5番目のシグネチャで､ 呼び出したいオブジェクトを指定することです｡

128
00:08:59,460 --> 00:09:05,280
‫それから､ メソッドそのものも必要だと思います｡

129
00:09:05,490 --> 00:09:08,280
‫だから､ アンパサンドをすればいいんです｡

130
00:09:08,280 --> 00:09:16,200
‫そして､ Aプレイヤー・コントローラーで定義されたメソッド､ リスタート・レベル・メソッドを呼び出したいのです｡

131
00:09:16,200 --> 00:09:17,910
‫つまり､ プレイヤーコントローラーですね｡

132
00:09:19,300 --> 00:09:19,660
‫カレン

133
00:09:19,660 --> 00:09:28,210
‫Cullenの再起動レベルを設定し､ 再起動遅延としてすでに定義した遅延を渡すだけです｡

134
00:09:28,630 --> 00:09:36,800
‫そうして､ 最後にセミコロンをつければ､ うまくいけば5秒後に再起動するようになるはずです｡

135
00:09:36,820 --> 00:09:42,520
‫今度はライフルを開放して､ ほんの少し殺傷力を高めることで､ テストをより簡単にします｡

136
00:09:42,520 --> 00:09:48,160
‫だから､ デフォルトのまま､ ダメージを50にして､ 2発で殺されるようにするんだ｡

137
00:09:48,280 --> 00:09:49,900
‫さあ､ 再生ボタンを押してみましょう｡

138
00:09:50,750 --> 00:09:52,250
‫早く自分たちを殺してくれ｡

139
00:09:53,260 --> 00:10:00,460
‫そして､ 5秒後にうまくいけば､ 私たちは再起動し､ レベルの中に戻ってくるはずです｡

140
00:10:00,460 --> 00:10:03,130
‫つまり､ タイマーは期待通りに動いているのです｡

141
00:10:03,640 --> 00:10:11,410
‫このようなエラーメッセージが表示され､ UUID､ PID､ サンドボックス､

142
00:10:11,410 --> 00:10:18,550
‫ブラブラなど､ 旅行に関する失敗について説明されます｡

143
00:10:18,580 --> 00:10:23,650
‫さて､ 再起動しようとしているときに､ 再起動がうまくいっているかどうかを確認するには､

144
00:10:23,650 --> 00:10:31,920
‫プレイメニューではなく､ ドット､ ドット､ ドットメニューに移動して､ 独立したゲームとしてプレイする必要があります｡

145
00:10:31,930 --> 00:10:38,110
‫もし､ スタンドアローンゲームとしてプレイする場合､ 起動に少し時間がかかりますが､

146
00:10:38,110 --> 00:10:41,620
‫再起動はこのように期待通りに動作します｡

147
00:10:41,620 --> 00:10:43,600
‫そして､ レベルが再読み込みされるのを確認します｡

148
00:10:43,600 --> 00:10:46,570
‫今､ 明らかに､ これが実現する兆候はあまりありません｡

149
00:10:46,570 --> 00:10:50,170
‫そこで､ 次回の講義では､ UIについて見ていきたいと思います｡

150
00:10:50,170 --> 00:10:51,010
‫現地でお会いしましょう｡

