﻿1
00:00:04,390 --> 00:00:05,440
‫こんにちは､ ようこそ｡

2
00:00:05,440 --> 00:00:10,000
‫この講義では､ BPプレーヤーに新しいコンポーネント､ 物理ハンドルを追加します｡

3
00:00:10,000 --> 00:00:16,060
‫そして､ グラバーコンポーネントでそのポインタを取得する方法について学びます｡

4
00:00:16,060 --> 00:00:20,800
‫また､ 誤ってエンジンをクラッシュさせてしまわないように､ 自分自身を守る方法についても見ていきます｡

5
00:00:20,800 --> 00:00:23,380
‫それでは､ 潜入してみましょう｡

6
00:00:24,280 --> 00:00:29,380
‫さて､ 物体をつかむためには､ 物理システムと対話する必要があります｡

7
00:00:29,380 --> 00:00:37,090
‫物理ハンドルというコンポーネントがあり､ これを使うと､ 物理オブジェクトを掴んで､

8
00:00:37,090 --> 00:00:45,760
‫世界のどこに行きたいかを指示することができます｡

9
00:00:46,180 --> 00:00:54,880
‫また､ オブジェクトは､ こちらが指示した特定のポイントに忠実に従うのではなく､ バネの上に乗っているように見えます｡

10
00:00:55,030 --> 00:00:57,910
‫そこで､ この物理処理コンポーネントを利用することにします｡

11
00:00:57,910 --> 00:01:02,230
‫グラボと一緒にBPというプレーヤーに追加してきます｡

12
00:01:02,230 --> 00:01:09,790
‫そこで､ コンポーネントペインの下にある追加ボタンから､ 物理ハンドルを探して追加してみましょう｡

13
00:01:09,790 --> 00:01:18,460
‫これはシーンコンポーネントではなくアクターコンポーネントであることがわかります｡

14
00:01:18,460 --> 00:01:26,170
‫物理ハンドルで行うのは､ つかむべきオブジェクトを指示し､ つかんだオブジェクトをどこに置くかを指示することです｡

15
00:01:26,290 --> 00:01:32,050
‫ドキュメントをご覧いただければ､ 利用可能な機能でおわかりになると思います｡

16
00:01:32,060 --> 00:01:41,320
‫ファンクションセクションまでスクロールすると､ ロケーションファンクションにリリースコンポーネントとグラブコンポーネントがあることがわかります｡

17
00:01:41,320 --> 00:01:45,940
‫また､ ターゲットの位置や回転も決まっています｡

18
00:01:45,940 --> 00:01:51,160
‫これは､ 物体を置こうとする場所ですが､ 明らかに物理的な制約を尊重し､

19
00:01:51,160 --> 00:01:56,440
‫まるでバネの上にいるような滑らかな方法でそれを行います｡

20
00:01:56,440 --> 00:02:05,470
‫さて､ まだこれらの関数を使うつもりはありませんが､ グラバーコンポーネントでこのコンポーネントを取得する方法を見つける必要があります｡

21
00:02:05,590 --> 00:02:07,780
‫では､ どうすればいいのか｡

22
00:02:07,780 --> 00:02:15,310
‫では､ grab a CPで､ begin playを見て､ 手に取ってみましょう｡

23
00:02:15,310 --> 00:02:23,980
‫現在では､ どのアクターにも､ そのタイプによってコンポーネントを見つけることができる関数があります｡

24
00:02:23,980 --> 00:02:27,190
‫しかし､ 物理的なハンドルの種類はどうなっているのでしょうか？

25
00:02:27,190 --> 00:02:31,180
‫まあ､ ユー・フィジックス・ハンドル・コンポーネントなんですけどね｡

26
00:02:31,180 --> 00:02:40,180
‫さて､ このタイプを手に入れるには､ インクルードを使う必要があります｡ ドキュメントにあるインクルードは､ 物理エンジンのフォワードスラッシュ物理ハンドルコンポーネントであることがわかります｡

27
00:02:40,180 --> 00:02:46,420
‫これをコピーして､ grab a CP に移動し､ add draw debug helpers の下に追加してみましょう｡

28
00:02:46,870 --> 00:03:00,370
‫次に､ get ONAでポインターを取得し､ arrowでコンポーネントをクラスごとに検索します｡

29
00:03:00,370 --> 00:03:14,410
‫さて､ この関数はC++ではテンプレート関数と呼ばれる特別な種類の関数で､ これはコンパイル時に実際に評価されるいくつかのパラメータを渡すことができることを意味します｡

30
00:03:14,410 --> 00:03:19,090
‫そして､ その方法は､ 次のような角括弧を使用します｡

31
00:03:19,090 --> 00:03:25,330
‫関数の後に角括弧を使い､ 検索したい型を指定します｡ この例では､

32
00:03:25,330 --> 00:03:30,910
‫物理演算子をこのように指定します｡

33
00:03:30,970 --> 00:03:33,250
‫そして､ 角括弧を閉じます｡

34
00:03:33,250 --> 00:03:37,660
‫しかし､ これは関数なので､ 通常の括弧も使って呼び出す必要があります｡

35
00:03:37,660 --> 00:03:41,680
‫それで､ この後に2つ目の括弧をつけるわけです｡

36
00:03:41,680 --> 00:03:52,330
‫つまり､ これらのコンパイル時の引数は角括弧を使って渡され､ 実行時の引数は括弧を使って渡されていることがわかります｡

37
00:03:52,630 --> 00:03:58,900
‫さて､ 通常の関数と同様に､ これは戻り値を持っています｡ この場合の戻り値は､

38
00:03:58,900 --> 00:04:01,390
‫ここで渡した型になります｡

39
00:04:01,390 --> 00:04:08,680
‫しかし､ ポインタとして､ 物理ハンドル・コンポーネント・ポインタを取り､ 物理ハンドルと呼ぶ変数を作り､

40
00:04:08,680 --> 00:04:16,390
‫このクラスによるget owner find componentと等しく設定することができるのです｡

41
00:04:16,390 --> 00:04:26,110
‫この行の最後にあるセミコロンが､ 同じアクター上の別のコンポーネントを取得するために必要なすべてです｡

42
00:04:26,110 --> 00:04:34,720
‫ポインタがNULLになることがあり､ それが原因でクラッシュすることがあるので危険だという話をしたのを覚えていますか｡

43
00:04:34,720 --> 00:04:46,180
‫アクタに物理ハンドルコンポーネントを付けるのを忘れたり､ 新しいアクタにグラバーを付けて､ まだ物理ハンドルコンポーネントと結び付けていない場合を考えてみましょう｡

44
00:04:46,180 --> 00:04:52,510
‫この場合､ 物理ハンドルのポインタはヌルポインタになるそうです｡

45
00:04:52,510 --> 00:05:03,340
‫そして､ そのポインタに矢印演算子や参照演算子を使おうとすると､ エンジンがクラッシュしてしまうのですが､ そのクラッシュがどのようなものかを確認するのが難しい場合があります｡

46
00:05:03,340 --> 00:05:18,010
‫物理ハンドルのポインタをヌルポインタと等しい値に再割り当てしてみます｡

47
00:05:19,060 --> 00:05:20,320
‫特別なキーワード

48
00:05:20,320 --> 00:05:21,630
‫全てNULLです｡

49
00:05:21,640 --> 00:05:24,550
‫Peter C++では､ NULL POINTERはこう書きます｡

50
00:05:24,550 --> 00:05:28,030
‫そして､ 最後にセミコロンをつけて､ 物理演算､

51
00:05:28,030 --> 00:05:32,410
‫矢印の処理､ 名前の取得をこのように行うのです｡

52
00:05:32,620 --> 00:05:38,200
‫ライブコーディングでコンパイルして､ コンパイルが終わったら､

53
00:05:38,200 --> 00:05:50,140
‫まず最初に､ リプレイで進行しているものをすべて保存することを確認します｡

54
00:05:50,140 --> 00:05:58,440
‫レポーター これを見ると､ アンリアルに何か問題があるのではと思いたくなるかもしれませんが､ 実はここで問題になっているのはあなたのコードなのです｡

55
00:05:58,450 --> 00:06:08,230
‫このクラッシュレポートの中で､ 最初の行に､ この問題はあなたがコロン､ コロン､ begin playをつかむことから来ていると書いてあるのがわかりますね｡

56
00:06:08,230 --> 00:06:11,760
‫そして､ 実際に行番号も表示され､ それは28行目です｡

57
00:06:11,770 --> 00:06:26,800
‫つまり､ 28行目のこの時点で､ 関数を呼び出すためにポインタを参照したときに､ そのポインタがヌルであるかどうかを最初にチェックしないという重大なミスを犯していることがわかりますね｡

58
00:06:26,860 --> 00:06:28,330
‫だから､ それが必要なんです｡

59
00:06:28,330 --> 00:06:29,710
‫そして､ それをif文で行うのです｡

60
00:06:29,710 --> 00:06:41,440
‫物理ハンドルがヌルポインターと等しくなければ､ その物理ハンドルに対して何かを呼び出すことができます｡ したがって､ 物理ハンドルと名前の取得をこのif文の中に記述すれば､

61
00:06:41,440 --> 00:06:46,900
‫ヌルポインターを持つ場合にそのコード（D参照コード）は実行されないので､

62
00:06:46,900 --> 00:06:53,380
‫私たちを保護できます｡

63
00:06:53,380 --> 00:06:58,330
‫そこで､ NULLポインタに設定している27行目を削除してきます｡

64
00:06:58,330 --> 00:07:02,710
‫そして､ 自分自身で部品名をプリントすることに挑戦するのです｡

65
00:07:02,710 --> 00:07:10,930
‫実際のコンポーネントがある場合のみ表示します｡ 基本的にヌルポインターは使用せず､

66
00:07:10,930 --> 00:07:19,180
‫コンポーネントを取得できなかった場合に警告するためにelseを使用します｡

67
00:07:22,290 --> 00:07:22,770
‫なるほど｡

68
00:07:22,770 --> 00:07:23,690
‫お帰りなさい｡

69
00:07:23,700 --> 00:07:33,600
‫ここで新しいユーログメッセージを作成し､ 物理ハンドルコロン％sxを得たと言うことにします｡ この物理ハンドル名は､

70
00:07:33,600 --> 00:07:43,260
‫ユーログの第2引数または第4引数としてカットアンドペーストします｡

71
00:07:43,320 --> 00:07:46,950
‫そして､ 文字列なので星をつけます｡

72
00:07:46,950 --> 00:07:50,250
‫では､ if文の下にelse文を追加してみましょう｡

73
00:07:50,250 --> 00:07:55,500
‫今回は表示ではなく､ 黄色で表示される警告タイプのメッセージで､

74
00:07:55,500 --> 00:08:02,340
‫No physics handle found, exclamation

75
00:08:02,640 --> 00:08:07,350
‫pointと表示されます｡

76
00:08:07,350 --> 00:08:12,960
‫今はエディタを開いていないので､ コントロールシフトBでVisual Studioのコード内でビルドし､

77
00:08:12,960 --> 00:08:17,820
‫成功したらターミナルを閉じて､ 新しいプロジェクトから再スタートします｡

78
00:08:17,820 --> 00:08:25,440
‫起動したら､ 再生ボタンを押して､ 出力ログを開くと､ ログメッセージが表示されるはずです｡

79
00:08:25,440 --> 00:08:28,440
‫どの名前なのか物理的なハンドルを手に入れた｡

80
00:08:28,440 --> 00:08:29,790
‫面白いことに､ 物理演算ができるんです｡

81
00:08:29,970 --> 00:08:41,160
‫では､ ビープ・プレーヤーで実際に物理ハンドルを削除して､ 再生してみるとどうでしょう｡

82
00:08:41,160 --> 00:08:48,840
‫出力ログを見ると､ 物理ハンドルが見つからなかったという黄色い警告が表示されています｡

83
00:08:48,840 --> 00:08:50,040
‫だから､ プレーを止めよう｡

84
00:08:50,070 --> 00:08:55,860
‫物理ハンドルを追加して､ プレーヤーを保存しましょう｡

85
00:08:55,860 --> 00:08:57,090
‫Beep 素晴らしい内容ですね｡

86
00:08:57,090 --> 00:09:03,570
‫さて､ ここまででコンポーネント内部から他のコンポーネントを取得する方法と､

87
00:09:03,570 --> 00:09:08,820
‫NULLポインタの扱い方とその注意点を学びました｡

88
00:09:08,850 --> 00:09:10,500
‫それでは､ 次回の講義でお会いしましょう｡

