﻿1
00:00:04,370 --> 00:00:05,390
‫こんにちは､ ようこそ｡

2
00:00:05,390 --> 00:00:12,170
‫この講義では､ 依存性注入という手法を使って､ ムーバーとトリガーの間のリンクを設定し､

3
00:00:12,170 --> 00:00:20,810
‫講義が終わる頃には､ ガーゴイルを刺せば､ ドアが下に動く､ あるいは少なくとも部分的には動くようにします｡

4
00:00:20,810 --> 00:00:24,260
‫さっそく､ この仕組みを見てみましょう｡

5
00:00:25,080 --> 00:00:26,460
‫そして､ 私はカップを手に取る｡

6
00:00:26,490 --> 00:00:33,030
‫物理ハンドルの依存関係とでもいうべきものが存在することがわかりました｡

7
00:00:33,030 --> 00:00:42,960
‫このグラバーは､ 物理ハンドルのコンポーネントがどこかにないと仕事ができないのですが､ たまたまトリガーのコンポーネントが同じでした｡

8
00:00:42,960 --> 00:00:50,100
‫トリガーコンポーネントが正しく動作するためには､ ムーバーコンポーネントにアクセスする必要があります｡

9
00:00:50,460 --> 00:01:02,400
‫しかし､ この場合は少し厄介です｡ 確かに､ 秘密のドアの場合､ トリガーと移動オブジェクトは同じアクタ内にあります｡

10
00:01:02,730 --> 00:01:08,220
‫つまり､ アクター上の型のコンポーネントを見つけることで､ オブジェクトを取得することができます｡

11
00:01:08,220 --> 00:01:14,490
‫しかし､ もしそうだとしたらどうでしょう｡ 私の脚本では､ そのような柔軟性を持たせるために､

12
00:01:14,490 --> 00:01:20,760
‫よく動いている俳優とは別の場所にトリガーを置いて欲しいという状況があります｡

13
00:01:20,760 --> 00:01:26,940
‫トリガーが自分自身で依存関係を見つけに行く必要がないようにしたいのです｡

14
00:01:26,940 --> 00:01:30,330
‫そして､ このような番組コンセプトには､ 実は名前がついているんです｡

15
00:01:30,330 --> 00:01:32,640
‫依存性注入と呼ばれるものです｡

16
00:01:32,640 --> 00:01:40,230
‫基本的には､ 「別のオブジェクトが必要だが､ 自分では見つけられない､ あるいは見つけたくない」というものがある場合です｡

17
00:01:40,290 --> 00:01:50,850
‫そして､ 自分の仕事をしているオブジェクトに任せきりにせず､ オブジェクトを手に入れようとする別の仕事をさせることが賢明な場合が多いのです｡

18
00:01:51,300 --> 00:02:02,730
‫そこで､ これを実現する方法として､ ブループリントがトリガー・コンポーネントにムーバーを見つける場所を伝える仕組みを作ることです｡

19
00:02:02,910 --> 00:02:09,330
‫そのためには､ トリガー コンポーネントでブループリント呼び出し可能な関数を作成します｡

20
00:02:09,810 --> 00:02:11,220
‫だから､ 公開されることになるんです｡

21
00:02:11,220 --> 00:02:16,980
‫tickコンポーネントの下のpublicセクションに配置し､ U関数にすることで､

22
00:02:16,980 --> 00:02:22,710
‫括弧の中でblueprint callableにできるようにします｡

23
00:02:23,280 --> 00:02:26,130
‫そして､ この機能にはあまり必要ないのです｡

24
00:02:26,130 --> 00:02:33,330
‫しかし､ moverへのリンクを設定するためにset moverとし､

25
00:02:33,330 --> 00:02:43,620
‫moverコンポーネントへのポインタを取得する必要があります｡

26
00:02:43,620 --> 00:02:52,440
‫これはムーバースターと呼ばれるもので､ このようにムーバーと呼んで､ その行の最後にセミコロンを付けます｡

27
00:02:52,830 --> 00:02:55,350
‫そして､ これをどこかに保存する必要があります｡

28
00:02:55,350 --> 00:02:57,300
‫そこで､ 新たにプライベート変数を作成することにします｡

29
00:02:57,300 --> 00:03:04,530
‫新しい物件になるわけでもなく､ U moveのポインターになるだけなので､ こちらもムーバーと呼ぶことにします｡

30
00:03:04,560 --> 00:03:12,900
‫このように､ CPPにセットムーバーを実装して､ このムーバーにポインターをセットするのですが､

31
00:03:12,900 --> 00:03:15,660
‫デフォルトではヌルになります｡

32
00:03:16,050 --> 00:03:17,790
‫そして､ もうひとつやらなければならないことがあります｡

33
00:03:17,790 --> 00:03:20,640
‫ムーバー用のヘッダーファイルをインクルードする必要があります｡

34
00:03:21,150 --> 00:03:26,370
‫この場合､ ヘッダーファイルはトリガーコンポーネントと同じフォルダにあるため､

35
00:03:26,370 --> 00:03:38,100
‫トリガーコンポーネントがムーバータイプを認識できるように､ クォート・ムーバーHをハッシュインクルードするだけでよいのです｡

36
00:03:38,280 --> 00:03:40,230
‫では､ トリガー・コンポーネントに移動してみましょう｡

37
00:03:40,230 --> 00:03:46,530
‫CP そして､ セットムーバーを実装するティックコンポーネントの下にこれを置くつもりです｡

38
00:03:46,530 --> 00:03:52,500
‫トリガーとなるクラスを前に置き､ インデントします｡

39
00:03:53,400 --> 00:03:55,590
‫セミコロンを削除し､ 中括弧を追加します｡

40
00:03:55,590 --> 00:04:00,150
‫そして､ 基本的に私たちがここでしなければならないことは､ C++ファイルの中の名前だけを変更することです｡

41
00:04:00,150 --> 00:04:06,060
‫ヘッダーとC++の間でパラメータ名が一致するかどうかは､ 実は重要ではありません｡

42
00:04:06,060 --> 00:04:12,540
‫ですから､ ここで変えて､ 新しいムーバーはセットムーバーに入ってくるものだと言えばいいのです｡

43
00:04:12,630 --> 00:04:20,010
‫そして､ ローカル変数､ クラス変数moverを新しいmoverと同じように設定することができます｡

44
00:04:20,010 --> 00:04:34,170
‫入力パラメータがクラスの変数と同じ名前だった場合､ unrealはデフォルトでそれをエラーに設定します｡

45
00:04:34,170 --> 00:04:39,720
‫これはシャドウイングと呼ばれるもので､ Unreal

46
00:04:39,720 --> 00:04:46,260
‫はこれを実行することを望んでいません｡

47
00:04:46,260 --> 00:04:52,920
‫エディターを閉じてVisual Studioのコードから再コンパイルし､ 新しいプロジェクトから再スタートします｡

48
00:04:52,950 --> 00:04:58,950
‫次に､ コンテンツドロワーで秘密の壁のブループリントを開き､ イベントグラフの

49
00:04:58,950 --> 00:05:06,080
‫Begin Play ノードから､ ここを引き抜いて set mover を検索してみましょう｡

50
00:05:06,090 --> 00:05:08,190
‫ここで､ 2つのオプションがあることに注目してください｡

51
00:05:08,190 --> 00:05:15,750
‫1つは､ ムーバーと呼ばれるコンポーネントを設定すること､ もう1つは､ トリガーコンポーネントの関数です｡

52
00:05:15,750 --> 00:05:18,840
‫そこで､ トリガー・コンポーネントの関数であるものを選択したいと思います｡

53
00:05:19,050 --> 00:05:28,110
‫そして､ この関数の他の引数として､ ムーバーコンポーネントをドラッグすることで､ トリックを実行することができます｡

54
00:05:28,110 --> 00:05:31,350
‫ムーバーをビギンプレイに設定します｡

55
00:05:31,350 --> 00:05:37,800
‫つまり､ 本質的には､ トリガー・コンポーネントがここにあるブール値を設定し､

56
00:05:37,800 --> 00:05:41,400
‫移動すべきであるとすることです｡

57
00:05:41,400 --> 00:05:46,110
‫そこで､ ムーバーとムーバーで何かパブリックな関数を作ってみようというのが､ 私のチャレンジになります｡

58
00:05:46,110 --> 00:05:51,780
‫CP 設定され､ 移動し､ そのプロパティの変数を更新する必要があります｡

59
00:05:51,780 --> 00:05:59,760
‫実は､ これからコードで設定するので､ もう新しいプロパティではなく､ パブリックセクションに置くことができるのです｡

60
00:05:59,760 --> 00:06:04,740
‫トリガーコンポーネントからアクセスするため､ publicである必要があります｡

61
00:06:04,740 --> 00:06:11,850
‫そして､ トリガーコンポーネントのティックコンポーネントの設定から､ 適切なブール値､ ロックを解除するか､

62
00:06:11,850 --> 00:06:18,960
‫再びロックするか､ ビデオを一時停止して実行するために､ ムーバーポインターを呼び出すことができます｡

63
00:06:22,250 --> 00:06:23,690
‫では､ おかえりなさい｡

64
00:06:23,690 --> 00:06:29,410
‫TTICコンポーネントの下にあるpublicセクションに移動して､

65
00:06:29,420 --> 00:06:43,010
‫should moveと呼ぶブール値を取るvoidセットを作成するつもりです｡

66
00:06:43,280 --> 00:06:51,560
‫そして､ これを移動CPに移動して実装します｡ セミコロンを置き換えて､

67
00:06:51,560 --> 00:07:08,030
‫コロン､ コロンクラスを追加して､ 基本的にもう一度､ これを新しい移動すべきと呼ぶことができます｡

68
00:07:08,030 --> 00:07:14,660
‫ここで､ なぜ変数そのものを公開し､ 直接設定できるようにしないのかと思うかもしれません｡

69
00:07:14,780 --> 00:07:24,620
‫C++では一般的に良い習慣ではありません｡ なぜなら､ 誰かに変数を変更させると､ その変数に何が起こるかわからないからです｡

70
00:07:24,620 --> 00:07:32,090
‫一方､ メソッドがあれば､ パブリック関数を変更することなく内部変数の構造を変更することができるので､

71
00:07:32,090 --> 00:07:39,920
‫異なるクラスを更新する必要が少なくなります｡

72
00:07:39,920 --> 00:07:46,850
‫ですから､ 一般的には､ 他のクラスの変数にアクセスする必要がある場合は､ 必ずセッターとゲッターを使用するのが原則です｡

73
00:07:46,850 --> 00:07:53,570
‫さて､ 新しい関数を作成したところで､ 現在ログメッセージを保存しているトリガーコンポーネントCPに移動してみましょう｡

74
00:07:53,570 --> 00:08:01,670
‫移動ポインタにアクセスしたいので､ 移動矢印を移動に設定します｡

75
00:08:01,670 --> 00:08:06,140
‫そして､ 納得のいく俳優がいる場合には､ そうなるはずです｡

76
00:08:06,140 --> 00:08:08,600
‫行末のセミコロンを移動させるべき｡

77
00:08:08,690 --> 00:08:12,200
‫そして､ それ以外の場合は......たぶん､ やめたほうがいいと思います｡

78
00:08:12,200 --> 00:08:20,510
‫そこで､ 矢印のセットを移動させ､ 括弧の中にfalseを入れて､

79
00:08:20,510 --> 00:08:30,020
‫メソッドの末尾にある余分なRを削除します｡

80
00:08:30,020 --> 00:08:34,940
‫この機能を使うために実際にエディターを再起動する必要はないと思います｡ 出力ログを閉じて､

81
00:08:34,940 --> 00:08:39,530
‫ガーゴイルの方に行き､ プレイを開始して彼をピックアップします｡

82
00:08:39,770 --> 00:08:49,400
‫このケージの外に出て､ アルコーブに突っ込もう」「下に動いているが､ ガーゴイルが落ちるとすぐに止まってしまう」「ガーゴイルが本当に固定されているわけではないし､

83
00:08:49,400 --> 00:08:59,060
‫壁も完全に下がっているわけではないので､ 理想的ではない」｡

84
00:08:59,150 --> 00:09:03,020
‫しかも､ 物理をシミュレートしているから､ あの床の間から飛び出してくるんでしょう？

85
00:09:03,020 --> 00:09:11,780
‫そこで必要なのは､ 一度トリガー部分に落とすと､ そこに固定されるようにすることです｡

86
00:09:11,780 --> 00:09:14,210
‫ということで､ 次回の講義の題材にします｡

87
00:09:14,210 --> 00:09:15,200
‫現地でお会いしましょう｡

