﻿1
00:00:04,360 --> 00:00:05,440
‫こんにちは､ ようこそ｡

2
00:00:05,440 --> 00:00:15,010
‫この講義では､ このコードの一部である RT アクタレンジを紹介し､ 特定のレベルにあるすべてのアクタに対してどのように反復処理を行うかを見ていきます｡

3
00:00:15,010 --> 00:00:16,810
‫さっそく潜入してみましょう｡

4
00:00:17,410 --> 00:00:24,760
‫つまり､ Kill Allゲームモードでポーンが殺されたとき､ プレイヤー側のコントローラで「ゲームが終了しました」と呼んでいますが､ 実際には「ゲームが終了しました」は､

5
00:00:24,760 --> 00:00:31,750
‫Aさんがいるすべてのコントローラで機能しているのです｡ 私やプレイヤーのコントローラーはもちろん､

6
00:00:31,750 --> 00:00:38,620
‫AIコントローラーにもゲームの終了を知らせるべきでしょうし､ そうなればプレイヤーのポーンが必ずしもここに来るわけではないので､

7
00:00:38,620 --> 00:00:46,240
‫勝利条件を出すのも簡単になるでしょう｡

8
00:00:46,870 --> 00:00:50,140
‫では､ どのように進めていけばいいのでしょうか｡

9
00:00:50,140 --> 00:00:59,500
‫さて､ KMLゲームモードに新しい関数､ End Gameというプライベートなものを作り､ この行為を担当させることにします｡

10
00:00:59,500 --> 00:01:02,710
‫だからEnd Gameと､ いくつかの情報が必要になってくるんです｡

11
00:01:02,710 --> 00:01:04,780
‫誰が勝ったかを知る必要がありそうだ｡

12
00:01:04,780 --> 00:01:06,730
‫それはプレイヤーなのか､ それともAなのか｡  I.?

13
00:01:06,760 --> 00:01:11,800
‫そこで､ ここにB is player winnerというboolを作成します｡

14
00:01:12,160 --> 00:01:19,930
‫そしてそれは､ AIに「勝った」と伝えるべきか､ プレイヤーに「勝った」と伝えるべきかの判断材料になるのです｡

15
00:01:19,930 --> 00:01:22,660
‫なぜなら､ ここでは私たちのゲームは終わっていることを忘れてはならないからです｡

16
00:01:22,660 --> 00:01:26,740
‫コントローラが勝者であるかどうかを示す boolean を受け取ります｡

17
00:01:27,490 --> 00:01:31,960
‫そこで､ これからやるべきことは､ まず､ 実装を考えることです｡

18
00:01:31,960 --> 00:01:35,380
‫そこで､ コントロールシフトPを行い､ 実装を作成することにします｡

19
00:01:35,950 --> 00:01:45,580
‫そして､ シーン内のすべてのコントローラを見つけ､ それらのコントローラでゲーム終了を呼び出せるようにする方法を考えなければなりません｡

20
00:01:46,390 --> 00:01:51,880
‫さて､ これを行うには､ エンジンヘルパーの呼び出しを使用します｡

21
00:01:51,880 --> 00:01:57,570
‫そこで､ ハッシュインクルードを行う場合､ まずエンジンユーティルを使うことになります｡

22
00:01:57,570 --> 00:02:08,260
‫このヘルパーはT Actor Rangeと呼ばれ､ T Actor Rangeはテンプレートのことです｡

23
00:02:08,260 --> 00:02:11,500
‫だから､ ここで角かっこをすればいいんです｡

24
00:02:11,590 --> 00:02:18,760
‫そして､ コントローラを置いて､ 括弧を付けて､ 世界を得ることができます｡

25
00:02:18,760 --> 00:02:20,050
‫さて､ これでどうする？

26
00:02:20,080 --> 00:02:28,840
‫これは基本的に､ すべてのコントローラを網羅したリストのようなものです｡

27
00:02:28,840 --> 00:02:37,240
‫そのため､ world aの中にcontrollerパラメータを入れています｡  k. をレベルとして､ これをforループで使用することができます｡

28
00:02:37,240 --> 00:02:39,610
‫では､ さっそくこれをforループで巻いてみます｡

29
00:02:39,610 --> 00:02:44,200
‫そこで､ Aコントローラの上にforを行うことにします｡

30
00:02:44,200 --> 00:02:51,190
‫つまり､ これから範囲を広げる変数は､ コントローラポインタと呼ぶことにします｡

31
00:02:52,180 --> 00:02:56,140
‫そして､ 範囲指定するものにはコロンを使用します｡

32
00:02:56,140 --> 00:02:58,240
‫このTアクティブレンジになるんです｡

33
00:02:58,450 --> 00:03:03,160
‫そして､ 閉じ括弧と中括弧をつけます｡

34
00:03:03,160 --> 00:03:04,900
‫では､ この言葉は何でしょう？

35
00:03:04,900 --> 00:03:14,380
‫これは､ 世界中のすべてのコントローラに対して4つのループを行い､ それをcontrollerという変数に格納すると言っているのです｡

36
00:03:15,120 --> 00:03:17,700
‫そして今､ あなたが知っておくべきことがいくつかあります｡

37
00:03:17,700 --> 00:03:22,530
‫つまり､ ひとつは､ キャストをしなくても､ コントローラーにプレーヤーコントロールかどうかを問い合わせることができるということです｡

38
00:03:22,530 --> 00:03:28,620
‫実際にコントローラの矢印を実行するだけで､ 実際にここにコントローラを入れる必要があると思います｡

39
00:03:28,620 --> 00:03:38,400
‫だから､ ハッシュのインクルードを一番上に､ 我々はゲームフレームワークのフォワードスラッシュコントローラーHを行うつもりだ､ 今オートコンプリートはおそらく動作します｡

40
00:03:38,400 --> 00:03:39,030
‫はい､ そうです｡

41
00:03:39,030 --> 00:03:41,790
‫ですから､ 私たちにできることは､ 当然､ ゲームが終了したことを知らせることです｡

42
00:03:41,790 --> 00:03:46,530
‫最初のオートコンプリートはこれですが､ プレイヤー・コントローラという言い方もできます｡

43
00:03:46,530 --> 00:03:58,410
‫基本的には､ プレイヤー・コントローラーの世界で､ ゲームが終了したことを伝えるべきかどうかを決定するためのものです｡

44
00:03:58,410 --> 00:04:05,880
‫そこで､ このforループを埋めるために､ 正しいbooleanパラメータでgame has endedを呼び出すことに挑戦します｡

45
00:04:06,240 --> 00:04:12,570
‫つまり､ 現在forループで会話しているコントローラがプレイヤーコントローラであり､

46
00:04:12,570 --> 00:04:23,700
‫プレイヤーコントローラが勝者であるというブール値が渡された場合､ 基本的にtrueになるようにするのです｡

47
00:04:23,700 --> 00:04:31,290
‫それがプレーヤーコントローラではなく､ プレイヤーではない場合､ プレイヤーは基本的にこれが味方とIは勝者である場合偽の場合は､

48
00:04:31,290 --> 00:04:40,890
‫プレーヤーコントローラが､ プレイヤーは勝者ではなく､ プレーヤーコントローラではない場合偽の場合は､ プレイヤーが勝者であると言っています｡

49
00:04:40,890 --> 00:04:43,530
‫この先がどうなるか､ おわかりいただけたでしょうか｡

50
00:04:43,530 --> 00:04:46,680
‫そこで､ ビデオを一時停止して､ このように実施してみてください｡

51
00:04:46,680 --> 00:04:47,940
‫if文を使うことがあります｡

52
00:04:47,940 --> 00:04:53,820
‫他のロジックを使って､ このブーリアン・ポーズ・ビデオを計算することができるかもしれません｡

53
00:04:54,930 --> 00:04:55,380
‫なるほど｡

54
00:04:55,380 --> 00:04:55,950
‫お帰りなさい｡

55
00:04:55,950 --> 00:04:57,930
‫だから､ いろいろなやり方があるんですね｡

56
00:04:57,930 --> 00:05:05,250
‫1つの方法として､ もしbeeがプレイヤーなら､ 勝者をコントロールすると言って､ このif文の中に何かを入れるかもしれません...ここでboolをやって､

57
00:05:05,250 --> 00:05:14,430
‫基本的にBはプレイヤーコントローラだと決めるかもしれません｡

58
00:05:15,210 --> 00:05:18,990
‫コントローラをすることから保存することになります｡

59
00:05:19,840 --> 00:05:23,740
‫プレーヤーコントローラーを矢印のように操作します｡

60
00:05:24,130 --> 00:05:28,310
‫そして､ よし､ コントローラーを呼び出そう､ となるかもしれません｡

61
00:05:28,330 --> 00:05:31,060
‫アローゲームは終了しました｡

62
00:05:31,210 --> 00:05:33,280
‫とりあえずヌルポインタを渡しておきます｡

63
00:05:33,280 --> 00:05:40,690
‫そして､ それが勝者であるプレーヤーで､ 私たちがプレーヤーコントローラーであるならば､ そう､ 基本的にその値で行こう､

64
00:05:40,690 --> 00:05:43,300
‫ということになります｡

65
00:05:43,300 --> 00:05:44,980
‫だから､ コントローラーを弾く｡

66
00:05:45,010 --> 00:05:48,100
‫そうでなければ､ プレイヤーコントローラーでなければ､ 負けていたことになります｡

67
00:05:48,100 --> 00:05:55,360
‫そして､ これを否定すればいいのです｡ そこで､ コントローラーのゲームが終わったと言うことを､

68
00:05:55,360 --> 00:06:04,900
‫not is player controllerで行うことになります｡

69
00:06:04,900 --> 00:06:11,710
‫で､ やりたいことは､ 基本的にプレーヤーが勝ったかどうかの逆､ つまり目が勝ったかどうかに依存する､

70
00:06:11,710 --> 00:06:14,380
‫ということです｡

71
00:06:14,680 --> 00:06:17,370
‫確かにそういうやり方もあるんですね｡

72
00:06:17,380 --> 00:06:22,990
‫しかし､ もうひとつ､ もっとシンプルな方法があります｡ それは､ 単純に「私たちは勝者か？

73
00:06:22,990 --> 00:06:26,020
‫So be is winner.

74
00:06:26,530 --> 00:06:36,790
‫そして､ これは簡単に言うと､ 自分がプレイヤーコントローラーであるかどうかが､ プレイヤー勝者であるかどうかに等しいということです｡

75
00:06:36,970 --> 00:06:43,000
‫さて､ もう少し考えて､ これを完全に完成させてから､ 話をしましょう｡

76
00:06:43,000 --> 00:06:53,050
‫つまり､ コントローラゲーム終了は､ ここに渡されたbe is winnerのヌルポインタになるわけです｡

77
00:06:53,950 --> 00:06:56,630
‫さて､ なぜこの文が有効なのか｡

78
00:06:56,650 --> 00:06:58,630
‫さて､ 事例を考えてみましょうか｡

79
00:06:58,630 --> 00:07:04,300
‫では､ ここにプレイヤーコントローラーがあり､ プレイヤーが勝者となるわけですね｡

80
00:07:04,300 --> 00:07:06,730
‫そう､ 私たちは勝者であり､ 彼らは対等なのです｡

81
00:07:06,730 --> 00:07:07,720
‫真・真・真

82
00:07:08,290 --> 00:07:13,660
‫これがプレイヤーコントローラーでなく､ プレイヤーが勝者でない場合はどうでしょうか｡

83
00:07:13,690 --> 00:07:15,370
‫じゃあ､ これは嘘だね｡

84
00:07:15,370 --> 00:07:21,570
‫そして､ こっちのこれも偽なので､ 2つがイコールになり､ 結果的に勝者となるのです｡

85
00:07:21,580 --> 00:07:22,100
‫そうなんですか？

86
00:07:22,120 --> 00:07:27,370
‫そうですね､ 私たちがAIで､ AIが勝者なら､ 私たちが勝者であるべきですから｡

87
00:07:27,880 --> 00:07:33,370
‫それ以外の場合､ これら2つが等しくない場合､ i. e. AIコントローラーがあるがプレイヤーが勝者である場合､

88
00:07:33,370 --> 00:07:40,960
‫またはプレイヤーコントローラーがありAIが勝者である場合､ 真と偽､ または偽と真が発生することになるのです｡

89
00:07:41,170 --> 00:07:45,280
‫この2つは等しくならないので､ ブール値はfalseと評価されます｡

90
00:07:45,280 --> 00:07:51,730
‫だから､ それぞれのケースで､ そこにあるすべてのケースを調べると､ これは正しい答えに行き着くということがわかります｡

91
00:07:51,730 --> 00:07:53,740
‫だから､ これが正解だとわかるのです｡

92
00:07:53,740 --> 00:07:58,390
‫ブール値の素晴らしいところは､ 通常､ すべてのケースを評価できることです｡ なぜなら､

93
00:07:58,390 --> 00:08:00,400
‫「さて､ どんなケースがあるか？

94
00:08:00,400 --> 00:08:01,870
‫真に迫ってきますね｡

95
00:08:01,870 --> 00:08:02,980
‫真偽のほどはともかくとして｡

96
00:08:02,980 --> 00:08:03,970
‫虚と実になりそうです｡

97
00:08:03,970 --> 00:08:05,280
‫虚々実々になりそうです｡

98
00:08:05,290 --> 00:08:06,940
‫そのすべてのケースを評価することができます｡

99
00:08:06,940 --> 00:08:12,610
‫これらのケースがすべて正しければ､ 正しいブール文ができたということです｡

100
00:08:13,090 --> 00:08:13,600
‫かっこいい｡

101
00:08:13,600 --> 00:08:15,880
‫それで､ B is winnerの計算をするわけです｡

102
00:08:15,880 --> 00:08:18,460
‫最後に､ エンドゲームモードを呼び出すだけです｡

103
00:08:18,460 --> 00:08:24,280
‫現時点では､ プレイ・コントローラーのゲーム終了を直接呼び出していますが､

104
00:08:24,280 --> 00:08:36,630
‫ここで実際に行いたいのは､ 先に進んでゲーム終了を呼び出し､ falseを渡すことです｡

105
00:08:36,640 --> 00:08:42,340
‫なぜなら､ もしプレイヤーが勝っていたら､

106
00:08:42,400 --> 00:08:52,900
‫プレイヤーポーンからフォーカスを奪おうとしてくるからです｡

107
00:08:52,900 --> 00:09:01,270
‫つまり､ ここで渡したいのは､ 単純にコントローラ､ ドットゲットポーンにフォーカスを当てるということです｡

108
00:09:01,660 --> 00:09:10,630
‫そしてそれは､ 基本的に自分のプレイヤーコントローラーのフォーカスをどこに置くべきかということです｡

109
00:09:10,630 --> 00:09:12,550
‫まだ自分のポーンを指しているはずです｡

110
00:09:12,970 --> 00:09:17,170
‫なぜそうすることが重要なのか､ そもそもなぜここにこの選択肢があるのか｡

111
00:09:17,170 --> 00:09:27,400
‫さて､ 多くのゲーム､ あるいはマッチスタイルのゲームでは､ ゲームが終了したら､ ポーンを追いかけに行くということがよくありますよね｡

112
00:09:27,400 --> 00:09:28,300
‫それが勝因だった｡

113
00:09:28,300 --> 00:09:34,300
‫だから､ 「フォートナイト」のシナリオのように､ 自分を殺した人を追いかけて行くことが多いと想像してください｡

114
00:09:34,330 --> 00:09:36,430
‫そのための仕組みがこれです｡

115
00:09:36,430 --> 00:09:40,470
‫基本的に殺しをした人の手先になって渡すんですね｡

116
00:09:40,480 --> 00:09:41,800
‫それは､ 私たちのゲームではありえないことです｡

117
00:09:41,800 --> 00:09:45,460
‫アップルを見て､ 勝つのか､ 死ぬのか､ これからも続けていくつもりです｡

118
00:09:45,460 --> 00:09:46,990
‫というわけで､ 講義はこれでおしまいです｡

119
00:09:46,990 --> 00:09:50,110
‫とりあえずコンパイルして動くかどうか見てみましょう｡

120
00:09:50,110 --> 00:09:53,440
‫それでは､ Unreal に飛び込んで､ プレイしてみましょう｡

121
00:09:53,470 --> 00:09:56,110
‫殺されに行こうぜ｡

122
00:09:56,110 --> 00:09:56,980
‫これでよしとする｡

123
00:09:56,980 --> 00:09:58,750
‫すべて以前のように動作しています｡

124
00:09:58,750 --> 00:10:03,220
‫プレイヤーコントローラーへの呼び出しはまだ続いていて､ その後､ 再起動します｡

125
00:10:03,220 --> 00:10:03,790
‫素晴らしい内容です｡

126
00:10:03,790 --> 00:10:06,460
‫さて､ 今回の講義では､ おさらいですが､ 何を見てきたのでしょうか｡

127
00:10:06,460 --> 00:10:16,930
‫さて､ レベル内のアクターを繰り返し処理することで､ それぞれのアクターに対して関数を呼び出すようなことができることを見てきました｡

128
00:10:16,930 --> 00:10:23,680
‫次回の講義では､ 再びTアクターレンジを使い､ 今度はプレイヤーが勝ったかどうかを計算します｡

129
00:10:23,680 --> 00:10:24,400
‫現地でお会いしましょう｡

