﻿1
00:00:04,360 --> 00:00:05,260
‫こんにちは､ ようこそ｡

2
00:00:05,260 --> 00:00:08,800
‫この講義では､ プレイヤーの視点から物事を見ていくことになります｡

3
00:00:08,830 --> 00:00:21,010
‫プレイヤーのビューポート､ カメラの位置と回転を取得し､ トリガーボタンを押したときにデバッグ用カメラを描画できるようにするためです｡

4
00:00:21,040 --> 00:00:26,890
‫この赤い小さな箱型のカメラは､ ビューポートの位置を示しています｡

5
00:00:26,890 --> 00:00:28,060
‫そして､ それを確認することができます｡

6
00:00:28,060 --> 00:00:32,050
‫それを後で銃のレイトレーシングに利用することができます｡

7
00:00:32,050 --> 00:00:34,990
‫そのすべてを､ 実際に飛び込んで見てみましょう｡

8
00:00:36,200 --> 00:00:38,360
‫この講義は､ まず質問から始めましょう｡

9
00:00:38,360 --> 00:00:45,860
‫このようにビューポートで照準を合わせ､ 画面の中心をD on Dコマンドセンターまたはゼロコマンドセンターに合わせようとしている場合､

10
00:00:45,860 --> 00:00:51,020
‫それがどのようなものであれ､ その意味は同じです｡

11
00:00:51,260 --> 00:00:54,860
‫そして､ 私は何を目指すのか？

12
00:00:54,950 --> 00:00:56,420
‫何を打てばいいんだろう？

13
00:00:56,450 --> 00:00:59,360
‫と言われるかもしれませんが､ そのゼロに当たることを期待しているのです｡

14
00:00:59,360 --> 00:01:01,260
‫サム それは当然の答えのような気がします｡

15
00:01:01,280 --> 00:01:06,980
‫まあ､ やり方､ リキャストの仕方によっては必ずしも当たるとは限りませんが｡

16
00:01:06,980 --> 00:01:10,160
‫では､ リキャストの戦略を見てみましょう｡

17
00:01:10,190 --> 00:01:15,920
‫一番わかりやすいのは､ 「銃から発射しているから､ 銃身をリキャストする」というものですね｡

18
00:01:15,920 --> 00:01:20,450
‫ところで､ このセットアップ､ とてもとても粗末なものですが､ 基本的に私たちの三人称のセットアップなんです｡

19
00:01:20,450 --> 00:01:21,860
‫後ろにカメラがあります｡

20
00:01:21,860 --> 00:01:23,870
‫キャラクターも､ 銃もある｡

21
00:01:23,870 --> 00:01:26,690
‫そして､ こっちの別のターゲットキャラを撃とうとしている｡

22
00:01:26,900 --> 00:01:31,240
‫それで､ まあ､ まず､ あのピュアな感じで銃からリキャストしたんです｡

23
00:01:31,280 --> 00:01:38,120
‫カメラが銃の向いているところに向いていないから外れるのかもしれませんが､ そうとは限りません｡

24
00:01:38,120 --> 00:01:43,970
‫同じ方向を向いていても､ 微妙にずれているので､ 必ずしも同じものに当たるとは限りません｡

25
00:01:43,970 --> 00:01:48,440
‫その代わり､ カメラからのリキャストを選択することもあります｡

26
00:01:48,470 --> 00:01:57,440
‫つまり､ カメラが見ているものがそのまま被写体になるということで､ 一般的に三人称視点のゲームではその方が自然に感じられるのです｡

27
00:01:57,710 --> 00:02:02,960
‫一人称視点のゲームでは､ 樽に非常に近い位置にいることが多いので､ 物事が少し近くなります｡

28
00:02:02,960 --> 00:02:07,100
‫しかし､ 一人称視点のゲームでも､ このルールはありがちです｡

29
00:02:07,100 --> 00:02:10,970
‫画面上の照準点がどこにあるのか､ 動き回らないようにしたいものです｡

30
00:02:10,970 --> 00:02:18,680
‫通常､ 画面の真ん中のここに小さなUIが重なりますが､ そこを下に向けることになります｡

31
00:02:18,680 --> 00:02:25,010
‫そのため､ このビューポートの下にある光線投射された武器で光線投射を行うことが多いのです｡

32
00:02:25,340 --> 00:02:34,520
‫さて､ 幸運なことに､ このビューポートを取得する方法があります｡ 実際にコントローラからそれを行うことで､ コントローラのビューポートを取得できます｡

33
00:02:34,520 --> 00:02:44,300
‫そのため､ キャラクタのところに行き､ そのキャラクタのコントローラを見つけ､ そのビューポートの位置と回転を見つける必要があるのです｡

34
00:02:44,300 --> 00:02:53,060
‫そして､ この講義で行うのは､ そのビューポートの位置と回転が期待通りのものであることを視覚化して確認することです｡

35
00:02:53,210 --> 00:02:57,350
‫そして､ デバッグヘルパーをいくつか描くことによって､ それを実現するつもりです｡

36
00:02:57,500 --> 00:03:05,390
‫これで､ デバッグヘルパーはヘッダーファイルの中にあり､ ヘッダーファイルの名前はdebugとなります｡

37
00:03:06,310 --> 00:03:06,820
‫助っ人

38
00:03:06,820 --> 00:03:10,600
‫面白いことに､ 私は信じるか､ 描画､ デバッグヘルパーを描画します｡

39
00:03:10,600 --> 00:03:11,170
‫それです｡

40
00:03:11,530 --> 00:03:16,600
‫そして､ このF12を見て､ もしすでにヘッダーファイルを持っているのであれば､ ヘッダーファイルに移動して､

41
00:03:16,600 --> 00:03:22,120
‫camera draw debug cameraというものを探してみましょう｡

42
00:03:22,120 --> 00:03:29,440
‫そしてこれは､ 私がここで描いた図のような､ ちょっとした三角形やノスタルジーを利用したものを描画します｡

43
00:03:29,440 --> 00:03:31,270
‫では､ 何を取り込むのか？

44
00:03:31,270 --> 00:03:37,870
‫そのカメラの位置､ カメラの回転を世界に取り込むのです｡

45
00:03:37,900 --> 00:03:41,320
‫だから､ 位置､ 回転､ 視野｡

46
00:03:41,320 --> 00:03:44,440
‫まあ､ おそらくデフォルトで90度くらいに設定するんでしょうけど｡

47
00:03:44,440 --> 00:03:46,960
‫目盛りがあり､ カラーデフォルトがある｡

48
00:03:46,960 --> 00:03:48,130
‫これらはすべて既定値です｡

49
00:03:48,130 --> 00:03:49,720
‫だから､ そのデフォルトを使えばいいんです｡

50
00:03:50,020 --> 00:03:59,410
‫デバッグ用のカメラを銃の中に描き､ それをプルトリガーメソッドに入れます｡

51
00:03:59,410 --> 00:04:01,870
‫まず必要なのは､ 何だったのか？

52
00:04:01,870 --> 00:04:03,970
‫新しい世界だったのです｡

53
00:04:03,970 --> 00:04:06,460
‫だから､ 私たちの世界を手に入れることができるのです｡

54
00:04:07,300 --> 00:04:11,410
‫しかし､ 次に必要なのは､ 場所でしょう｡

55
00:04:11,410 --> 00:04:21,250
‫とりあえずアクターロケーションを取得して､ アクターローテーションも取得してやりましょう｡

56
00:04:22,030 --> 00:04:25,650
‫そして､ 最後に必要だったのが､ 視野角です｡

57
00:04:25,660 --> 00:04:35,860
‫そこは適当に90度の視野にして､ コンパイルして､ これが表示されるかどうか見てみましょう｡

58
00:04:36,280 --> 00:04:40,480
‫そして､ 再生してヒットしよう｡

59
00:04:41,170 --> 00:04:42,100
‫トリガーボタン

60
00:04:42,100 --> 00:04:43,480
‫何も表示されないんだけど

61
00:04:43,480 --> 00:04:47,110
‫F8をやって､ 近づけるかどうかやってみよう｡

62
00:04:48,550 --> 00:04:51,790
‫まだ､ ここにカメラのようなものは映っていません｡

63
00:04:51,790 --> 00:04:53,740
‫本当に､ 小さいのかなと思います｡

64
00:04:54,490 --> 00:05:00,730
‫そこで､ もう一つの選択肢として､ 永続的な行を用意することが考えられます｡

65
00:05:01,120 --> 00:05:07,660
‫つまり､ C++でスケールを1に設定できるように､ それまでのすべてを指定する必要があるわけです｡

66
00:05:07,660 --> 00:05:13,180
‫万が一､ 大きさが問題なら､ 2倍の大きさにすることも可能です｡

67
00:05:13,240 --> 00:05:16,960
‫目につきやすい色､ たとえば赤を選べばいいんです｡

68
00:05:16,960 --> 00:05:19,000
‫だからFカラー､ コロン､ コロン､ 赤｡

69
00:05:19,420 --> 00:05:27,760
‫そして､ しつこいセリフは真に受けて､ あれこれ試してみるのもいい｡

70
00:05:28,410 --> 00:05:29,910
‫そこで再びコンパイル｡

71
00:05:30,890 --> 00:05:32,810
‫そして､ プレーに飛び込むこと｡

72
00:05:33,260 --> 00:05:34,960
‫そして､ そこに行く｡

73
00:05:34,970 --> 00:05:35,990
‫ヒットしました｡

74
00:05:37,450 --> 00:05:38,260
‫きっかけは｡

75
00:05:38,260 --> 00:05:50,350
‫そして､ トリガーを押すとここに小さなカメラボックスが表示され､ 銃と位置と回転が設定されているのがわかると思います｡

76
00:05:50,350 --> 00:05:53,020
‫そこで､ 今度はビューポートの取得を試みたいと思います｡

77
00:05:53,020 --> 00:05:57,220
‫ですから､ 先ほどから申し上げているように､ これは私たちのコントローラーに搭載されることになるのです｡

78
00:05:57,250 --> 00:06:06,640
‫コントローラHを見てみましょう｡ ここでもゲームフレームワークのものが欲しいので､ ここでviewportを探します｡

79
00:06:06,770 --> 00:06:07,390
‫なんですって？

80
00:06:07,390 --> 00:06:11,050
‫実は､ 視点というのは私たちが探している言葉で､ ここにもいくつかあるんです｡

81
00:06:11,050 --> 00:06:15,670
‫アクターアイを取得するアクターの目を通して見ることになる視点｡

82
00:06:15,670 --> 00:06:24,490
‫しかし､ 実際には視点の取得プレイをしたいのです｡ アイ・コントローラーの場合は目を使いますが､ プレーヤーの場合はプレーヤーのカメラを使います｡

83
00:06:24,490 --> 00:06:25,570
‫だから､ それを望んでいるのです｡

84
00:06:25,570 --> 00:06:27,700
‫ゲットプレーヤーの視点が欲しい｡

85
00:06:27,910 --> 00:06:32,080
‫しかし､ まずはそのコントローラーを手に入れることが先決です｡

86
00:06:32,080 --> 00:06:39,160
‫シューターキャラクターのCPを開いた状態で､ Begin Playに移動すると､

87
00:06:39,250 --> 00:06:48,190
‫銃の所有者をキャラクターに設定していることがわかります｡

88
00:06:48,400 --> 00:06:51,700
‫つまり､ 銃の中では逆を行くことができるのです｡

89
00:06:51,700 --> 00:06:56,890
‫オーナーをゲットと言えば､ シューターキャラクターが手に入るのです｡

90
00:06:56,890 --> 00:06:59,380
‫今はシューターキャラクターであることがわからないようになっています｡

91
00:06:59,380 --> 00:07:00,880
‫知っているのは､ 自分が俳優であるということだけだ｡

92
00:07:00,880 --> 00:07:02,560
‫だから､ ここでキャストをやるしかないんです｡

93
00:07:02,890 --> 00:07:07,810
‫そこで､ Aシューターキャラクターにキャストをします｡

94
00:07:08,540 --> 00:07:12,890
‫しかも､ 実はシューターキャラクターであることくらい､ 何も知らなくてもいいんです｡

95
00:07:12,890 --> 00:07:19,760
‫ポーンであることが分かれば十分で､ あとはシューターキャラでなくてもポーンなら誰でもこの銃を所持することができます｡

96
00:07:19,760 --> 00:07:22,210
‫だから､ できるだけ非特異的であるようにする｡

97
00:07:22,220 --> 00:07:24,200
‫なぜ､ ポーンである必要があるのでしょうか？

98
00:07:24,200 --> 00:07:29,570
‫ポーンである必要があるのは､ コントローラーを手に入れる必要があり､ コントローラーに憑依できるのはポーンのみだからです｡

99
00:07:29,570 --> 00:07:30,980
‫では､ これを変数にいれてみましょう｡

100
00:07:30,980 --> 00:07:39,200
‫星マークと､ ownerが変数名となります｡

101
00:07:39,710 --> 00:07:42,350
‫そして､ これがNULLでないことを確認する必要があります｡

102
00:07:48,750 --> 00:07:53,490
‫もしNULLだったら､ プールトリガーから早めにリターンするというワンライナーで､

103
00:07:53,490 --> 00:07:59,280
‫NULLポインターで何かを呼び出そうとするリスクを回避するために行います｡

104
00:07:59,430 --> 00:08:08,790
‫そこで､ ポーン・オーナー､ ゲット・コントローラーを行い､ それをAコントローラーに保存したいと思います｡

105
00:08:09,030 --> 00:08:11,640
‫星 そして､ これがオーナーになりうる｡

106
00:08:12,090 --> 00:08:12,960
‫コントローラーです｡

107
00:08:14,210 --> 00:08:15,140
‫そうそう｡

108
00:08:15,470 --> 00:08:23,930
‫なぜなら､ これからメソッドを呼び出すので､ NULLポインタのメソッドを呼び出すことはできないからです｡

109
00:08:23,960 --> 00:08:26,930
‫非現実的な､ 不幸な､ クラッシュさせるのです｡

110
00:08:26,930 --> 00:08:31,460
‫ということで､ ここでオーナーコントローラーができるようになりました｡

111
00:08:33,340 --> 00:08:37,300
‫そして､ そのゲットプレイに視点を呼び込むことができるはずです｡

112
00:08:38,420 --> 00:08:42,020
‫そこで､ その場所と回転を設定することに挑戦です｡

113
00:08:42,020 --> 00:08:45,440
‫その新しい関数を使って､ そのシグネチャを見ることができます｡

114
00:08:45,440 --> 00:08:52,040
‫ここでも､ ファイルより先にコントローラHに行き､ ビューポイントを取得することを見ています｡

115
00:08:52,040 --> 00:09:01,460
‫この署名から､ 描画デバッグヘルパーに渡す位置と回転を取得する方法を考えてみてください｡

116
00:09:01,700 --> 00:09:05,690
‫で､ これはアウトパラメータを使っていると覚えておいてください｡

117
00:09:05,690 --> 00:09:14,270
‫そこで､ アウトパラメータを修正し､ 先ほど書いたスニペットを使ってデバッグカメラを描画し､ ビューポートでテストしてみましょう｡

118
00:09:14,300 --> 00:09:19,400
‫いろいろな場所でトリガーボタンを数回クリックし､ そのカメラがどこでポーズビデオを表示することになるかを確認し､

119
00:09:19,400 --> 00:09:21,380
‫試してみてください｡

120
00:09:22,470 --> 00:09:22,800
‫なるほど｡

121
00:09:22,800 --> 00:09:23,440
‫お帰りなさい｡

122
00:09:23,460 --> 00:09:24,660
‫だから､ 視点を変えて遊んでみてください｡

123
00:09:24,660 --> 00:09:29,720
‫メソッド名をコピーして､ outパラメータなのでこちらに持ってきます｡

124
00:09:29,730 --> 00:09:34,080
‫まず､ その値を入れる変数を宣言する必要があります｡

125
00:09:34,080 --> 00:09:36,330
‫Fベクトルの位置が

126
00:09:36,720 --> 00:09:41,340
‫Fローテーターローテーションを実現しました｡

127
00:09:42,260 --> 00:09:45,660
‫そして､ それらを引数として渡したいのです｡

128
00:09:45,680 --> 00:09:48,320
‫ちょっとインデントを直しますね｡

129
00:09:48,320 --> 00:09:51,860
‫そして､ 場所､ 回転で渡すことになります｡

130
00:09:52,190 --> 00:09:58,580
‫そして､ これを読むと､ ちょうどここで宣言されているので､ C++からこの点に関する構文の助けはないにもかかわらず､

131
00:09:58,580 --> 00:10:04,130
‫これらが今アウトパラメータであると推測することができます｡

132
00:10:04,460 --> 00:10:13,820
‫そして､ アクターの位置の代わりにこの位置を渡し､ アクティブな回転の代わりにこの回転をデバッグ用カメラの描画に渡すことができるのです｡

133
00:10:14,210 --> 00:10:19,270
‫そして､ そのコンパイルをビルドして､ エディターで試してみることができるのです｡

134
00:10:19,280 --> 00:10:21,350
‫さて､ コンパイルが完了したようです｡

135
00:10:21,350 --> 00:10:23,120
‫遊びに行こうよ｡

136
00:10:23,450 --> 00:10:29,150
‫そして､ トリガーを押すと､ 私の視点の真上にカメラが表示されるのです｡

137
00:10:29,150 --> 00:10:30,160
‫それはいい兆候だ｡

138
00:10:30,170 --> 00:10:32,510
‫少し後ろに下がると､ そこが見えてくる｡

139
00:10:32,510 --> 00:10:38,300
‫このカメラは､ 私が見ていたところから､ まさに正しい方向を指しているんです｡

140
00:10:38,300 --> 00:10:43,700
‫だから､ あのカメラの先から光線を発射して､ その時見ていたあそこの何かに当てようとするのは､

141
00:10:43,700 --> 00:10:49,040
‫想像に難くないでしょう｡

142
00:10:49,040 --> 00:10:51,190
‫そして､ それが次の講義で行われることになるのです｡

143
00:10:51,200 --> 00:10:51,920
‫現地でお会いしましょう｡

