﻿1
00:00:04,460 --> 00:00:05,240
‫こんにちは､ ようこそ｡

2
00:00:05,240 --> 00:00:10,250
‫この講義では､ 携帯電話のキラーゲームモードを作成する予定です｡ これは､

3
00:00:10,250 --> 00:00:19,940
‫仮想の -- どのゲームモードでも呼び出せるkilledメソッドを持っているために作成できるゲームモードのひとつに過ぎません｡

4
00:00:19,970 --> 00:00:24,560
‫では､ この仮想メソッドをどのように実装していくのか､ 見ていきましょう｡

5
00:00:25,540 --> 00:00:28,640
‫だから､ 私たちはゲームを終わらせることができるようにしたいのです｡

6
00:00:28,660 --> 00:00:29,760
‫ゲームが終わるというのはどういうことですか？

7
00:00:29,770 --> 00:00:34,990
‫ある種､ 自分こそが､ あるいは自分が負けたという状態に入るということです｡

8
00:00:34,990 --> 00:00:37,240
‫プレイヤーに何らかのUIで知らせる｡

9
00:00:37,270 --> 00:00:40,810
‫また､ 「もう一度､ 再生してください」という選択肢もあります｡

10
00:00:41,050 --> 00:00:43,020
‫そんな感じです｡

11
00:00:43,030 --> 00:00:46,900
‫さて､ これに関わるクラスは通常､ ゲームモードです｡

12
00:00:46,900 --> 00:00:52,420
‫ゲームモードは､ 勝ち負けなどのゲームに関するルールを決定する役割を担っています｡

13
00:00:52,780 --> 00:00:56,470
‫そのためには､ 誰が殺されているのかを知る必要があります｡

14
00:00:56,470 --> 00:01:02,500
‫そこで､ Pawn Killedという仮想メソッドを用意します｡ このメソッドは､ シューターポーンが死んだときに､

15
00:01:02,500 --> 00:01:09,370
‫AIであろうとプレイヤーであろうと呼び出されるものです｡

16
00:01:10,360 --> 00:01:15,310
‫さらに､ ここで少し複雑なことを付け加えると､ メインのシューティングゲームモードから派生して､

17
00:01:15,310 --> 00:01:18,550
‫さまざまなゲームモードを用意することになるんです｡

18
00:01:18,550 --> 00:01:20,320
‫そのゲームモードを実装するとのことです｡

19
00:01:20,320 --> 00:01:21,580
‫ここでの矢印の意味は､ そういうことです｡

20
00:01:21,580 --> 00:01:25,840
‫矢印の進み方が少し直感的でないことが多いのですが､ 全部倒してください｡

21
00:01:25,840 --> 00:01:33,310
‫ゲームモードはシューターゲームモードを継承しており､ カウントアップやゲームルールの決定が異なるため､

22
00:01:33,310 --> 00:01:35,770
‫ポーンキルを上書きしています｡

23
00:01:35,770 --> 00:01:49,570
‫そのため､ 親ゲームモードであるシューターで仮想ポーンを殺すメソッドを実装し､ 自分たちで実装するゲームモードであるキルオールゲームモードで再び実装するかオーバーライドすることにしました｡

24
00:01:49,570 --> 00:01:58,450
‫また､ 「すべての敵を倒すのではなく､ 一定数の敵を倒す」というようなゲームモードを選択することもできます｡

25
00:01:58,450 --> 00:02:00,670
‫キャプチャー・ザ・フラッグとか､ 何か違うかもしれない｡

26
00:02:01,900 --> 00:02:08,560
‫でも基本的には､ シューターが......シューター系のゲームモードを見つけて､

27
00:02:08,560 --> 00:02:13,060
‫それを......殺すんです｡

28
00:02:13,060 --> 00:02:21,250
‫そして､ 実際にあるどんな実装にもよりますが､ オーバーライドを経由して実装に至ることになります｡

29
00:02:21,910 --> 00:02:28,390
‫さて､ もうひとつ複雑なのは､ UIロジックと再起動ロジックは､ ゲームモードのようなグローバルなものではなく､

30
00:02:28,390 --> 00:02:36,310
‫一般にプレーヤーの権限であるプレーヤーコントローラのUIで行われるべきものであるということです｡

31
00:02:36,340 --> 00:02:42,850
‫特にマルチプレイのゲームでは､ ゲームモードは実際にはプレイヤーのマシンには存在せず､ サーバーにのみ存在するため､

32
00:02:42,850 --> 00:02:45,160
‫この傾向は顕著です｡

33
00:02:45,160 --> 00:02:49,270
‫ですから､ UIに関することはすべてプレイヤーコントローラーで行う必要があります｡

34
00:02:49,540 --> 00:02:52,690
‫これはマルチプレイヤーゲームではないので心配する必要はない複雑さですが､

35
00:02:52,690 --> 00:02:57,430
‫それでもUnrealで想定される用途にクラスを使用するのは良いことです｡

36
00:02:57,880 --> 00:03:04,750
‫ゲームモードがこのメソッドを呼び出せるように､ プレイヤーコントローラ（実際のルートプレイヤー・コントローラ・クラス）には､

37
00:03:04,750 --> 00:03:12,610
‫この目的のために game has ended という仮想メソッドがあり､ 私たち自身のシュータープレイヤーコントローラにこれを実装してUIや再起動など､

38
00:03:12,610 --> 00:03:17,770
‫あらゆることを行うことができます｡

39
00:03:17,830 --> 00:03:23,590
‫でも､ ゲームモードからは､ ゲームオーバーと判断したときに呼び出す必要がありますね｡

40
00:03:23,590 --> 00:03:28,270
‫そこで､ ルートプレーヤーコントローラーにバーチャルゲームが終了したと表示することにします｡

41
00:03:28,390 --> 00:03:35,290
‫そして､ その根幹となるプレイヤーコントローラーが実はシューターであるため､ プレイヤーコントローラーは結局､ 流用したり､ 呼び出したりすることになります｡

42
00:03:35,290 --> 00:03:36,130
‫このゲームは終了しました｡

43
00:03:36,130 --> 00:03:42,040
‫つまり､ シューターポーンからシューターゲームモード､ キラーモアゲームモード､ プレイヤーコントローラー､ シュータープレイヤーコントローラーと､

44
00:03:42,040 --> 00:03:46,570
‫遠回りのようでありながら､ 呼び出すことになるのです｡

45
00:03:46,570 --> 00:03:52,360
‫しかし､ これによって､ さまざまなプレーヤーコントローラーを組み合わせて､ さまざまな方法で､ さまざまなレベルのUIを表示させることができるという点で､

46
00:03:52,360 --> 00:03:55,900
‫非常に柔軟になりました｡

47
00:03:55,900 --> 00:04:02,260
‫さまざまなゲームモードを混在させることができるので､ このようなアーキテクチャーにしたのです｡

48
00:04:02,260 --> 00:04:07,750
‫私たちのプロジェクトでは少しやりすぎですが､ 「Capture the Flag」のゲームモードやさまざまな種類のプレーヤーコントローラーを使用する他のプロジェクトに､

49
00:04:07,750 --> 00:04:11,970
‫この方法を拡張することができることを示すものです｡

50
00:04:11,980 --> 00:04:14,500
‫では､ さっそく実装してみましょう｡

51
00:04:14,530 --> 00:04:18,040
‫行って､ まずはルートゲームモードを探します｡

52
00:04:18,040 --> 00:04:22,330
‫C++のプロジェクトから始めたので､ すでに1つ作成されています｡

53
00:04:22,330 --> 00:04:28,120
‫このシンプルなシューティングゲームモードをベースに､ パブリック関数を作成して､

54
00:04:28,120 --> 00:04:37,480
‫voidを返すようにし､ それを -- kill して､ ここで殺された -- を渡すようにします｡

55
00:04:37,480 --> 00:04:42,400
‫だから､ それは......スターという名の......そうやって殺されるんです｡

56
00:04:42,400 --> 00:04:50,770
‫そして最初に､ これを仮想メソッドにして､ 基本的にここでは何もしない基本的な実装を作成することにします｡

57
00:04:50,770 --> 00:04:52,930
‫そして､ サブクラスを作成します｡

58
00:04:52,930 --> 00:05:02,230
‫新しいC++クラスで､ すべてのクラスを表示し､ ベースクラスとしてシューター､ シンプルシューターゲームモードベースを探します｡

59
00:05:02,230 --> 00:05:12,010
‫そして､ これをkill em allゲームモードと呼ぶことにして､ クラスを作成します｡

60
00:05:12,010 --> 00:05:18,100
‫それが完了したら､ ちょっと切り替えて､ シューターキャラクターに行きたいと思います｡

61
00:05:18,130 --> 00:05:23,620
‫CP そして､ この中で､ ダメージを受けるメソッドで死んでいるのがわかると思います｡

62
00:05:23,830 --> 00:05:31,180
‫もし､ これが死んだのなら､ 私がしたいのは､ ゲームモードを手に入れ､ ......殺されたと言うことです｡

63
00:05:31,210 --> 00:05:38,470
‫このように､ まずゲームモードを取得するためにget worldを呼び出し､ 次にget auth game

64
00:05:38,470 --> 00:05:40,690
‫modeを呼び出します｡

65
00:05:40,690 --> 00:05:46,750
‫そして､ このゲームモードが正しいタイプであること､ つまり､ シンプルな､ 根源的な､ シンプルなシューティングゲームモードであり､

66
00:05:46,750 --> 00:05:54,910
‫このキャラクターを切り替えて､ 旗取りゲームモードなどの異なるゲームモードで使用できるようにしたいのです｡

67
00:05:55,060 --> 00:06:01,540
‫このように､ すべてのゲームモードを取得するために､ 右の角括弧を使用することができます｡ そして､

68
00:06:01,540 --> 00:06:07,900
‫単純なシューティングゲームモードを行うつもりなので､ それを一番上に含める必要があります｡

69
00:06:08,320 --> 00:06:15,270
‫だから､ ハッシュはシンプルなシューティングゲームモードを搭載しています｡

70
00:06:15,550 --> 00:06:18,070
‫ということは､ クラス名全体がよくわからなかったのでしょうか？

71
00:06:18,070 --> 00:06:18,700
‫そうだと思います｡

72
00:06:18,700 --> 00:06:22,180
‫シンプルなシューティングゲームモードベースになりそうですね｡

73
00:06:22,360 --> 00:06:23,710
‫それが､ 私たちの目指すところです｡

74
00:06:24,130 --> 00:06:29,290
‫そして､ それを変数ポインタに格納し､ ゲームモードと呼ぶことにしましょう｡

75
00:06:29,290 --> 00:06:36,790
‫そして､ この新しい行で､ このポインタがヌルポインタではないことを確認したいと思います｡

76
00:06:36,790 --> 00:06:40,630
‫つまり､ ゲームモードはヌルポインタとイコールではないのです｡

77
00:06:40,630 --> 00:06:50,590
‫そして､ それがヌルポインタに等しくない場合､ 我々はゲームモード矢印ポーンが殺され､ ポーンが殺された呼びたいところですこのようなのですか？

78
00:06:50,590 --> 00:06:55,150
‫つまり､ ポーンが殺されたことをゲームモードが認識するようになったわけです｡

79
00:06:55,170 --> 00:07:00,460
‫KILL THEME ALLゲームモードを上書きして､ できるようにするためのちょっとしたミニチャレンジです｡

80
00:07:00,580 --> 00:07:06,880
‫が殺されたらログアウトし､ それをマップのデフォルトゲームモードとして設定します｡

81
00:07:07,210 --> 00:07:09,680
‫というわけで､ このミニチャレンジに挑戦していただけたらと思います｡

82
00:07:09,700 --> 00:07:11,800
‫実装に踏み切ります｡

83
00:07:11,800 --> 00:07:19,540
‫そこで､ シンプルなシューティングゲームモードのベースの公開部分をコピーして行うのですが､ これだけでは把握するのが大変です｡

84
00:07:19,540 --> 00:07:24,070
‫次に､ それを継承したゲームモード「kill them all」のベースに移動します｡

85
00:07:24,310 --> 00:07:33,850
‫そして､ virtualメソッドを貼り付け､ overrideキーワードを追加して､ このメソッドを正しくオーバーライドしていることを確認します｡

86
00:07:34,730 --> 00:07:39,620
‫次に､ KMLゲームモードのベースとなる実装をC++で作成します｡

87
00:07:40,100 --> 00:07:42,980
‫ここで､ そのログメッセージが表示されるはずです｡

88
00:07:42,980 --> 00:07:48,430
‫そして､ 超慎重に､ 実装に何もないことは分かっているが､ 分からないことがある｡

89
00:07:48,440 --> 00:07:52,130
‫後で状況が変わって､ 爆弾に噛まれるかもしれない｡

90
00:07:52,140 --> 00:07:55,250
‫そこで､ ポーンキルドを行いたい｡

91
00:07:56,310 --> 00:07:59,160
‫超・・・で・・・殺された｡

92
00:07:59,190 --> 00:08:00,060
‫理にかなっている｡

93
00:08:00,330 --> 00:08:09,630
‫そして､ 基本的には「...が殺されました」というログインを行い､ Unreal に行ってコンパイルし､

94
00:08:09,630 --> 00:08:17,940
‫ツールバーのブループリントの項目で､ プロジェクト設定でデフォルトのゲームモードを選択して､

95
00:08:17,940 --> 00:08:23,250
‫それがうまくいくかどうかを確認することができます｡

96
00:08:23,250 --> 00:08:29,040
‫ゲームモード､ ベースクラスを選択した場合､ KMLベースのゲームモードとなるようにします｡

97
00:08:29,040 --> 00:08:31,770
‫基本的には､ そうしてください｡

98
00:08:31,770 --> 00:08:35,640
‫実際､ 私たちが行って選択する場合､ それは私たちが望むものとは全く違います｡

99
00:08:35,640 --> 00:08:45,060
‫実は､ その青写真の子にしたかったのですが､ すでに青写真の子にはいろいろなものがセットアップされているんです｡

100
00:08:45,060 --> 00:08:47,820
‫そこで､ 再親業をしよう｡

101
00:08:48,390 --> 00:08:54,090
‫ルーツを辿れば､ ここにある「BPシューティング」というゲームモードがあるんです｡

102
00:08:54,240 --> 00:09:02,790
‫このBPをkill em all game modeに改名し､ ウィンドウをドックして､ フルブループリントエディタを開き､

103
00:09:02,790 --> 00:09:11,940
‫クラス設定に移動して親をKML game modeに変更します､ 基本的にはC++です｡

104
00:09:12,030 --> 00:09:18,030
‫そうすれば､ 正しいコードが実行されるはずです｡ もし､ 出力ログにメッセージを表示し､

105
00:09:18,030 --> 00:09:25,740
‫再生ボタンを押して､ キャラクターを殺すと､ 正しい設定がされていないように見える問題があります｡

106
00:09:25,740 --> 00:09:36,900
‫そこで､ クラスのデフォルトに戻り､ デフォルトの -- クラスをBPシューターキャラクターに変更すれば､ 正しく表示されるはずです｡

107
00:09:36,900 --> 00:09:39,330
‫念のため､ 保存してコンパイルしてください｡

108
00:09:39,330 --> 00:09:42,000
‫そして､ この下にある私の設計図ドロップダウンを確認してください｡

109
00:09:42,000 --> 00:09:44,700
‫KMLゲームモード､ C++の方を選択されています｡

110
00:09:44,700 --> 00:09:49,530
‫そこで､ 実際にこの中のブループリントを選んで､ 再生ボタンを押します｡

111
00:09:49,530 --> 00:09:50,850
‫これで手駒は確保できた｡

112
00:09:50,850 --> 00:09:57,330
‫ポーンが殺されたことがログメッセージとして出力されます｡

113
00:09:57,330 --> 00:10:00,090
‫だから､ それは素晴らしい効果を発揮しています｡

114
00:10:00,240 --> 00:10:05,580
‫さて､ 次回の講義では､ この2番目の部分､ つまり､ 実際にゲームを終了して､

115
00:10:05,580 --> 00:10:12,870
‫そこから再開できるようにしたいときに､ ゲームが終了したと呼ぶことについて見ていきたいと思います｡

116
00:10:12,960 --> 00:10:15,930
‫では､ その講義でお会いしましょう｡

