﻿1
00:00:04,470 --> 00:00:05,430
‫こんにちは､ ようこそ｡

2
00:00:05,430 --> 00:00:15,330
‫このレクチャーでは､ 実際にガーゴイル像を手にして､ 目の前で持ち運べるようにグラボをセットアップしていきます｡

3
00:00:15,330 --> 00:00:17,670
‫では､ どのように行うのか､ 潜入してみましょう｡

4
00:00:18,090 --> 00:00:24,540
‫それでは､ そろそろこのグラブ部品を回転させて位置で呼び出すことにしましょう｡

5
00:00:24,540 --> 00:00:26,790
‫さて､ 先ほども言いましたが､ 実はこれには2つのパートがあるんです｡

6
00:00:26,790 --> 00:00:36,180
‫コンポーネントを掴んで､ 後でターゲットの位置と回転を設定し､ 動き回るようにする必要があるのです｡

7
00:00:36,180 --> 00:00:44,580
‫まず最初に､ grab関数で､ 物理ハンドルへのポインタを取得する必要があります｡

8
00:00:44,580 --> 00:00:51,690
‫Begin Playの行をコピーして､ グラバーに移動し､ ここに配置します｡

9
00:00:51,690 --> 00:00:55,920
‫そして､ これがヌルくならないように自分を守るために｡

10
00:00:55,920 --> 00:00:57,510
‫さて､ どうなることでしょう？

11
00:00:57,510 --> 00:01:00,330
‫まあ､ 実際､ やりたいことは何もないんですけどね｡

12
00:01:00,330 --> 00:01:03,060
‫物理のハンドルがなければ､ 何もつかめません｡

13
00:01:03,150 --> 00:01:10,200
‫そこで､ このgrab関数の本体全体をif文に入れることもできますが､ ちょっと面倒なことになります｡

14
00:01:10,200 --> 00:01:13,800
‫そこで代わりにできるのが､ いわゆるアーリーリターンというものです｡

15
00:01:13,830 --> 00:01:18,720
‫本来は､ 物理のハンドルがあれば､ というだけなのですが｡

16
00:01:19,490 --> 00:01:21,720
‫イコールNULLポインタに等しい｡

17
00:01:21,740 --> 00:01:23,810
‫ここに二重の等号を入れなければならない｡

18
00:01:23,810 --> 00:01:25,460
‫それ以外は課題です｡

19
00:01:25,760 --> 00:01:32,500
‫そして､ 下に降りてブレースを作り､ ここにリターンを入れればいいのです｡

20
00:01:32,510 --> 00:01:38,240
‫つまり､ 物理ハンドルにヌルポイントがあった場合､

21
00:01:38,240 --> 00:01:46,910
‫すぐに戻り､ 関数の残りの部分を実行しないようにします｡

22
00:01:47,330 --> 00:01:49,010
‫だから､ それを実行するのです｡

23
00:01:49,010 --> 00:01:52,010
‫ヒットしているところに潜り込む｡

24
00:01:52,010 --> 00:01:54,380
‫このログメッセージはもう必要ないのでは？

25
00:01:54,380 --> 00:01:56,140
‫だから､ alt文を削除する｡

26
00:01:56,150 --> 00:02:03,950
‫if文の本文から基本的にすべてを削除して､ グラボを使うことにします｡

27
00:02:03,950 --> 00:02:13,040
‫そこで､ 物理ハンドルの矢印グラブコンポーネントを回転を伴う位置で行うことにします｡

28
00:02:13,040 --> 00:02:17,010
‫そして､ 掴もうとしているコンポーネントを提供しなければならない｡

29
00:02:17,030 --> 00:02:22,250
‫見てもらうとわかるのですが､ 期待しているのはyouプリミティブコンポーネントなんです｡

30
00:02:22,250 --> 00:02:27,280
‫ヒットした結果にそれらしいものがあるかどうか見てみましょう｡

31
00:02:27,290 --> 00:02:39,290
‫プリミティブコンポーネントのドキュメントページを開くと､ get componentがヒットしたプリミティブコンポーネントを返してくれることが分かります｡

32
00:02:39,290 --> 00:02:40,310
‫それこそ､ 私たちに必要なことです｡

33
00:02:40,310 --> 00:02:49,670
‫そこで､ ヒットした結果のドットゲットコンポーネントを探すと､ 第1引数に欲しいものが出てくる｡

34
00:02:50,060 --> 00:02:54,020
‫さて次は､ 骨のFネームです｡

35
00:02:54,020 --> 00:02:57,440
‫今､ 私たちは実際に特定の骨で何かをつかみたいわけではありません｡

36
00:02:57,440 --> 00:03:01,640
‫これはスケルトンメッシュがあればの話ですが､ そうではありません｡

37
00:03:01,640 --> 00:03:06,680
‫静的メッシュなので､ name, underscore noneでOKです｡

38
00:03:06,770 --> 00:03:11,180
‫また､ 一般的に骨の話をするFネームでは､ この話がよく出てきます｡

39
00:03:11,180 --> 00:03:15,350
‫何も入れたくない場合は､ name, underscore noneを使用します｡

40
00:03:15,350 --> 00:03:18,380
‫次に､ それをつかむ場所を指定します｡

41
00:03:18,380 --> 00:03:20,270
‫そして､ 私たちはすでに､ このことを調べたと言いました｡

42
00:03:20,270 --> 00:03:29,300
‫ヒット結果のドットインパクトポイントと､ それから回転､ まあ､ そのコンポーネントの現在の回転でもいいし､ アクターの現在の回転でもいいし､

43
00:03:29,300 --> 00:03:33,140
‫好きなほうを選んでください｡

44
00:03:33,170 --> 00:03:35,390
‫だから､ ヒット結果には部品がつく｡

45
00:03:35,390 --> 00:03:45,830
‫これは､ コンポーネントの回転を取得するためのポインタなので､ そのヒット結果を取得するコンポーネントドット矢印をつかむつもりです｡

46
00:03:45,830 --> 00:03:52,280
‫そこで､ 閉じ括弧を別の行に置き､ セミコロンを置いてステートメントを終了させれば､

47
00:03:52,280 --> 00:03:56,840
‫コンポーネントの取得に効果的なはずです｡

48
00:03:56,870 --> 00:04:04,130
‫さて､ 次のパズルはティックコンポーネントで､ 再び物理ハンドルを使用することになります｡

49
00:04:04,130 --> 00:04:10,160
‫ということで､ とりあえずコードをコピーしてみます｡ 3箇所にコードをコピーするのはちょっと多すぎるので､

50
00:04:10,160 --> 00:04:15,410
‫それを再利用するために関数に引っ張り出すことを考えたほうがいいかもしれません｡

51
00:04:15,410 --> 00:04:20,720
‫しかし､ インテークコンポーネントは､ 我々は物理ハンドルを使用するつもりだ､ 我々は物理ハンドルを取得することができない場合は､

52
00:04:20,720 --> 00:04:22,310
‫早期に返すつもりだ｡

53
00:04:22,430 --> 00:04:26,270
‫そして､ これから行うのは､ その目標位置を設定しようとすることです｡

54
00:04:26,270 --> 00:04:35,330
‫そこで､ 物理演算､ 矢のターゲット位置の設定と回転を処理することにします｡

55
00:04:35,330 --> 00:04:37,340
‫そして､ このことについて少し考えてみましょう｡

56
00:04:37,340 --> 00:04:42,290
‫どのようなターゲットロケーションの設定に興味があるのだろうか？

57
00:04:42,290 --> 00:04:46,130
‫まあ､ 基本的にはエンドポイントのときと同じになるんですけどね｡

58
00:04:46,130 --> 00:04:53,060
‫現在地から､ 前方向の外側に一定距離だけ移動させるのです｡

59
00:04:53,060 --> 00:04:54,590
‫今度は､ これが設定可能になる｡

60
00:04:54,590 --> 00:05:00,230
‫最大つかみ距離を使うこともできますが､ 実際には遠すぎると感じています｡

61
00:05:00,230 --> 00:05:10,220
‫そこで､ Hのグラブで､ Edit Anywhereという新しい使用プロパティを作成し､ ホールドディスタンスというフロートにすることにします｡

62
00:05:10,220 --> 00:05:12,530
‫そして､ これを200に設定する｡

63
00:05:12,530 --> 00:05:15,260
‫だから､ よりプレーヤーに近い存在になるのです｡

64
00:05:15,260 --> 00:05:21,410
‫さて､ CPのグラブに入ると､ ティック関数に入り､ このターゲット位置を作ってみることができます｡

65
00:05:21,410 --> 00:05:26,240
‫つまり､ 目標位置というFベクトルになるわけです｡

66
00:05:26,780 --> 00:05:40,040
‫これは､ コンポーネントの位置を取得し､ 前方ベクトルを取得し､ 保持距離を掛けたものに等しくなるように設定します｡

67
00:05:40,280 --> 00:05:42,350
‫そうすると､ それを目標地点にすればいいわけです｡

68
00:05:42,350 --> 00:05:47,870
‫これが最初の引数で､ 次にターゲット回転が必要です｡

69
00:05:47,870 --> 00:05:54,860
‫そのためには､ 現在のコンポーネントの回転を使用します｡ 周りを見渡すと､ オブジェクトがビューとともに回転するので､

70
00:05:54,860 --> 00:06:07,370
‫コンポーネントの回転を取得して､ 現在のグラバーシーンコンポーネントの回転を取得すればよいのです｡

71
00:06:07,370 --> 00:06:13,040
‫では､ その行の最後にセミコロンを付けて再コンパイルし､ この動作を確認してみましょう｡

72
00:06:13,040 --> 00:06:18,900
‫さて､ コンパイルが成功したら､ ガーゴイルを選択して､ 移動力をSTARTから変更することだけは確認しておこう｡

73
00:06:19,070 --> 00:06:26,300
‫物理に反応して動く必要があるので､ movableにこだわって､ 物理をシミュレートしていることを確認しましょう｡

74
00:06:26,300 --> 00:06:31,880
‫物理のカテゴリーに移動して､ 物理シミュレーションのボタンをチェックしよう｡

75
00:06:31,880 --> 00:06:34,910
‫再生ボタンを押して､ ピックアップしてみよう｡

76
00:06:34,910 --> 00:06:40,010
‫だから､ 今のところ起きていると思うのですが､ 床の中で止まっているようなので､ 理想的ではありませんね｡

77
00:06:40,010 --> 00:06:43,760
‫床の中で動かないように､ 少し持ち上げてみましょう｡

78
00:06:44,030 --> 00:06:47,840
‫そうやって床に落として､ 今度は拾ってみてください｡

79
00:06:47,840 --> 00:06:52,790
‫今､ また床の中で詰まっているようなので､ 2回目もやってみましょう｡

80
00:06:52,820 --> 00:06:53,150
‫なるほど｡

81
00:06:53,150 --> 00:06:59,660
‫だから､ ちょっと頼りなくて､ まっすぐ捕まえるとガーゴイルをうまく拾ってくれて､

82
00:06:59,660 --> 00:07:03,410
‫そのまま拾えることもあるんです｡

83
00:07:03,410 --> 00:07:11,510
‫回転が正しくないことに気づいたのですが､ これは物理コンポーネントをつかむところで間違ったものを使ってしまったからです｡

84
00:07:11,510 --> 00:07:15,800
‫ガーゴイルの回転を手に入れたので､ 今度はその回転を維持するために

85
00:07:15,800 --> 00:07:23,390
‫実際に使う必要があったのは､ グラボの回転を選ぶ際に使っている回転です｡

86
00:07:23,390 --> 00:07:29,270
‫そこで､ これを変更して再コンパイルし､ もう一度再生ボタンを押して､ データを取得することにしましょう｡

87
00:07:29,270 --> 00:07:29,960
‫これでよしとする｡

88
00:07:29,990 --> 00:07:35,390
‫今度は私が握ったので､ 正確な回転を得ることができました｡

89
00:07:35,390 --> 00:07:39,350
‫そして､ バネでつかんでいるように見えるのがおわかりいただけると思います｡

90
00:07:39,350 --> 00:07:44,660
‫壁を突き破ろうとすると､ なるべく壁を通らないようにするんです｡

91
00:07:44,660 --> 00:07:52,100
‫最終的には壁を突き破って飛び出すのですが､ 私が動かすことで物理を観察しようとしているのです｡

92
00:07:52,100 --> 00:07:56,870
‫そこで､ 私は今､ get physics handleという新しい機能を引き出すことに挑戦したいのです｡

93
00:07:56,870 --> 00:07:58,040
‫プライベートになりそうです｡

94
00:07:58,070 --> 00:07:59,300
‫Uを返すはずです｡

95
00:07:59,300 --> 00:08:06,080
‫物理的にコンポーネントを扱うので､ オーナーを取得し､ クラスによってコンポーネントを見つける必要があるこの重複したコードは削除されるはずです｡

96
00:08:06,080 --> 00:08:11,420
‫可能かどうか潜在的にコンストしてログ化することも可能です｡

97
00:08:11,420 --> 00:08:18,080
‫物理ハンドルコンポーネントがない場合は､ それが表示され､ 何か間違ったことをしたことがわかるように､ 警告ログを与えてください｡

98
00:08:18,110 --> 00:08:20,180
‫ビデオを一時停止して､ 試してみてください｡

99
00:08:23,950 --> 00:08:24,250
‫なるほど｡

100
00:08:24,250 --> 00:08:24,750
‫お帰りなさい｡

101
00:08:24,760 --> 00:08:29,410
‫まず､ ファイルの先頭に行き､ privateの部分にこれを入れるのですが､

102
00:08:29,410 --> 00:08:38,290
‫Qのプロパティの下に､ Uの物理ハンドルコンポーネントを返すようにして､ ここにアスタリスクを付けます｡

103
00:08:38,320 --> 00:08:47,710
‫さて､ ここではこのタイプをヘッダーで使用しているので､ 実際にインクルードを取ってグラボから切り出す必要があります｡

104
00:08:47,710 --> 00:08:55,150
‫だから､ 物理ハンドルに関しても含まれていて､ グラボhの中で､ 生成したものの上に置く必要があるんだ｡

105
00:08:55,400 --> 00:08:58,630
‫H ヘッダーファイルの中でいつも最後にあるものですね｡

106
00:08:58,630 --> 00:09:01,810
‫また､ なぜCPでも必要ないのでしょうか？

107
00:09:01,810 --> 00:09:04,840
‫まあ､ グラボhも含めてだから｡

108
00:09:04,840 --> 00:09:11,890
‫つまり､ grab a Hに入れたものは､ 自動的にC pに入るので､ そこにincludeを入れればいいのです｡

109
00:09:12,370 --> 00:09:21,790
‫さて､ この関数を定義するところまで行って､ このような括弧のペアを物理ハンドル取得と呼ぶことができます｡

110
00:09:21,790 --> 00:09:29,380
‫そして､ この関数を呼び出しても､ グラボには何の変化もないはずです｡

111
00:09:29,470 --> 00:09:37,120
‫Uグラバーコロン､ コロンを先頭に貼り付けて､ セミコロンを削除し､

112
00:09:37,120 --> 00:09:46,270
‫中括弧のペアを追加しているところです｡

113
00:09:46,270 --> 00:09:54,250
‫そこで､ この "get over "ラインをカットして､ "get physics

114
00:09:54,250 --> 00:09:57,040
‫"に置き換えるのです｡

115
00:09:58,140 --> 00:10:00,330
‫このように処理します｡

116
00:10:00,330 --> 00:10:07,500
‫そして､ get physics handleで､ get owner find component by classなどを返すだけでよいのです｡

117
00:10:07,500 --> 00:10:13,800
‫これをティックコンポーネントに置き換えて､ 物理ハンドルを手に入れることができます｡

118
00:10:13,830 --> 00:10:18,930
‫その小さなコードを物理ハンドルを取得するために置き換えてみましょう｡

119
00:10:18,930 --> 00:10:22,920
‫しかし､ この時点の練習と､ これからログメッセージを追加してプレイを始めるという事実のために､

120
00:10:22,920 --> 00:10:27,840
‫間違いなく価値があります｡

121
00:10:27,840 --> 00:10:33,030
‫実際には物理を処理させる必要は全くないので､ そこのコードを削除します｡

122
00:10:33,030 --> 00:10:37,350
‫しかし､ これから行うのは､ ログメッセージを追加することです｡

123
00:10:37,350 --> 00:10:44,100
‫ここで結果を格納するために変数を作成します｡ なぜなら､ もしリターンを行ってからログメッセージを表示しようとすると､

124
00:10:44,100 --> 00:10:46,020
‫うまくいかないからです｡

125
00:10:46,020 --> 00:10:53,520
‫そこで､ resultという新しい物理ハンドルコンポーネントを用意することにした｡ なぜなら､ ここから返すのはresultだからだ｡

126
00:10:53,850 --> 00:11:06,390
‫そして､ もし結果がヌルポインターと等しい場合は､ 警告やエラーとしてログに記録する必要があります｡

127
00:11:06,390 --> 00:11:14,730
‫そして､ grab aにはU物理ハンドルコンポーネントが必要で､ if文の後にと言うことになります｡

128
00:11:14,730 --> 00:11:15,840
‫だから､ こうなるのです｡

129
00:11:15,840 --> 00:11:21,300
‫nullであろうとなかろうと､ 結果を返します｡

130
00:11:21,300 --> 00:11:23,880
‫では､ これをコンパイルして､ すべて動作することを確認しましょう｡

131
00:11:23,930 --> 00:11:38,820
‫シーン内で左クリックすると､ 青いオーブやデバッグオーブが描画されます｡

132
00:11:38,820 --> 00:11:39,390
‫素晴らしい内容です｡

133
00:11:39,390 --> 00:11:48,150
‫この講義では､ グラブを使ってガーゴイル像をつかむことができましたが､ 少し不安定なこともあります｡

134
00:11:48,150 --> 00:11:50,850
‫そして､ これからの講義でこれを整理していくのです｡

135
00:11:50,850 --> 00:11:52,350
‫では､ 現地でお会いしましょう｡

