﻿1
00:00:04,170 --> 00:00:04,650
‫ねえ｡

2
00:00:04,650 --> 00:00:05,610
‫お帰りなさい｡

3
00:00:05,640 --> 00:00:14,250
‫さて､ 投射物ができて､ 命中イベントが発生することがわかったので､ 投射物が実際にターゲットに命中したときに何かする必要があります｡

4
00:00:14,280 --> 00:00:19,200
‫そのためには､ ダメージを与えて､ 体力を把握する必要があります｡

5
00:00:19,200 --> 00:00:24,840
‫そこで､ ヘルスコンポーネントと呼ばれるヘルスとダメージを扱うクラスを作成します｡

6
00:00:24,930 --> 00:00:32,690
‫そして､ この機能が独自のクラスを持つ理由は､ 戦車や塔などの異なるクラスで再利用できるようにするためです｡

7
00:00:32,700 --> 00:00:35,250
‫そこで､ この健康成分について説明します｡

8
00:00:35,640 --> 00:00:38,900
‫これで､ シーンコンポーネントクラスの使い方に慣れました｡

9
00:00:38,910 --> 00:00:43,390
‫さて､ このクラスはアクターコンポーネントと呼ばれるクラスから派生しています｡

10
00:00:43,410 --> 00:00:47,220
‫実は､ ここに使用シーンコンポーネントのドキュメントがあります｡

11
00:00:47,220 --> 00:00:53,100
‫そして､ 継承階層では､ その親があなたのアクターコンポーネントであることがわかります｡

12
00:00:53,130 --> 00:00:57,330
‫さて､ you act aコンポーネントは､ you seenコンポーネントよりも基本的なものです｡

13
00:00:57,420 --> 00:00:59,070
‫トランスフォームを搭載していない｡

14
00:00:59,070 --> 00:01:05,020
‫つまり､ 位置､ 回転､ スケールは､ ユア・アクター・コンポーネントが持っているものでもないのです｡

15
00:01:05,040 --> 00:01:06,930
‫アタッチメントに対応していない｡

16
00:01:06,930 --> 00:01:12,660
‫アクティブコンポーネントは､ 例えば静的メッシュコンポーネントやカプセルコンポーネントにアタッチすることはできません｡

17
00:01:12,660 --> 00:01:15,180
‫あくまでも､ 役者のものです｡

18
00:01:15,180 --> 00:01:20,910
‫また､ 視覚的な表現や変形がないため､ 何かにくっつける必要もないのです｡

19
00:01:21,000 --> 00:01:27,060
‫これに対して､ 使用シーンコンポーネントには､ 実際にトランスフォームがあり､ 他のコンポーネントにアタッチしたり､

20
00:01:27,060 --> 00:01:31,640
‫他のコンポーネントにアタッチさせたりすることができます｡

21
00:01:31,650 --> 00:01:36,450
‫だから､ 健康状態を把握し､ ダメージをケアするためには､ そういったものは一切必要ないのです｡

22
00:01:36,450 --> 00:01:39,990
‫だから､ ある部品が最適になるように行動するのです｡

23
00:01:40,170 --> 00:01:44,880
‫では､ エディタに戻って､ 新しいアクションをコンポーネント・クラスにしてみましょう｡

24
00:01:44,880 --> 00:01:48,690
‫そこで､ ツールに上がり､ C++のクラスを新規に作成します｡

25
00:01:48,690 --> 00:01:51,890
‫そして､ 下にスクロールすると､ アクターコンポーネントが見えますね｡

26
00:01:51,900 --> 00:01:53,730
‫これが選択するものです｡

27
00:01:53,760 --> 00:01:54,630
‫さあ､ 気をつけよう｡

28
00:01:54,630 --> 00:01:56,400
‫アクターを選択しないでください｡

29
00:01:56,400 --> 00:01:57,750
‫それは別のクラスです｡

30
00:01:57,750 --> 00:02:02,610
‫実はアクターコンポーネントが持っているものよりも大きなクラスで､ いろいろなものがあるんです｡

31
00:02:02,610 --> 00:02:07,560
‫特にアクターコンポーネントが必要なので､ それを選択して､ 次へをクリックします｡

32
00:02:07,560 --> 00:02:11,490
‫そして､ これを単純に「健康成分」と呼ぶことができます｡

33
00:02:11,880 --> 00:02:13,740
‫クラスの作成］をクリックしましょう｡

34
00:02:14,190 --> 00:02:25,980
‫ここで､ 新しいヘルスコンポーネントとCPファイルを用意しました｡ 先ほど作成したヘルスコンポーネント（クラス）は､ コンポーネントとして機能するあなたから派生したものであることがわかります｡

35
00:02:25,980 --> 00:02:30,390
‫だから､ ここに正しいタイプがあることを確認して､ そのUにあることがわかると思います｡

36
00:02:30,390 --> 00:02:31,710
‫クラスのマクロです｡

37
00:02:31,740 --> 00:02:36,360
‫このメタは､ ブループリントのスポーンテーブルコンポーネントの場所を指定します｡

38
00:02:36,360 --> 00:02:43,050
‫これによって､ このコンポーネントをブループリントに直接追加できるようになります｡

39
00:02:43,050 --> 00:02:48,960
‫新しい健康コンポーネントは､ 健康の世話をするつもりです｡ つまり､ いくつかの変数が必要です｡

40
00:02:48,960 --> 00:02:52,380
‫では､ これらを追加して､ 非公開にします｡

41
00:02:52,380 --> 00:02:59,700
‫そこで､ protectedのすぐ下にprivateセクションを追加し､ いくつかのhealth変数を追加してみましょう｡

42
00:02:59,700 --> 00:03:04,290
‫さて､ これらはフロートにするつもりですが､ 最初のものをMax Healthと呼ぶことにします｡

43
00:03:04,320 --> 00:03:12,180
‫これは､ 持てる体力の最大値となり､ 100Fなどの初期値に設定することができます｡

44
00:03:12,180 --> 00:03:20,850
‫さて､ 最大体力に加えて､ 現在の体力を示す体力値があり､ これはダメージを受けると変化するものです｡

45
00:03:20,850 --> 00:03:24,720
‫そこで､ もう一つフロートを作り､ これを単純にhealthと呼ぶことにしましょう｡

46
00:03:24,720 --> 00:03:30,900
‫これでhealthを0Fに初期化し､ その値をセットしてプレイを開始することができます｡

47
00:03:30,900 --> 00:03:39,690
‫その理由は､ Max Healthが独自のyouプロパティを持っていて､ 詳細パネルからそれを設定できるからです｡

48
00:03:39,690 --> 00:03:43,470
‫そこで､ これにUプロパティを与えて､ どこでも編集できるようにしよう｡

49
00:03:43,680 --> 00:03:46,500
‫そうすれば､ 開発を進めながら変更することができます｡

50
00:03:46,500 --> 00:03:54,600
‫そして､ ここのヘルスコンポーネントCPで､ プレイを開始すると､ 単純にヘルスを最大ヘルスと同じ値に設定することができるのです｡

51
00:03:54,600 --> 00:04:01,860
‫そうすれば､ 詳細パネルで変更した後でも､ ゲーム開始時にはヘルスは最大値のままです｡

52
00:04:02,040 --> 00:04:10,920
‫さて､ これをコンパイルして､ エディタに戻ってBP - tankを開き､ フルブルーペイントエディタを開いてみましょう｡

53
00:04:10,920 --> 00:04:16,200
‫そして､ この健康コンポーネントをコンポーネントパネルに追加することができます｡

54
00:04:16,290 --> 00:04:20,130
‫そこで､ 「追加」をクリックし､ 「健康」を検索してみることにします｡

55
00:04:20,370 --> 00:04:22,350
‫そして､ ここに健康を見ることができます｡

56
00:04:22,530 --> 00:04:25,860
‫さて､ C++ではヘルスコンポーネントと呼んでいました｡

57
00:04:25,860 --> 00:04:29,670
‫そして実際､ ポップアップで健康成分というのが表示されています｡

58
00:04:29,670 --> 00:04:33,420
‫そのため､ ここで表示する際には､ その構成部分を取り除いて表示しています｡

59
00:04:33,420 --> 00:04:40,890
‫また､ 静的メッシュコンポーネントやカプセルコンポーネントを探すと､ ここにもコンポーネントという言葉がないことにお気づきかもしれませんね｡

60
00:04:40,890 --> 00:04:48,270
‫Healthコンポーネントの下にmax healthがあり､

61
00:04:48,270 --> 00:04:55,080
‫100に設定されているのがわかると思います｡

62
00:04:55,170 --> 00:05:03,390
‫それで今､ BP -- tankは健康成分を持っていて､ この健康成分を所有しているのはBP -- tankであると書いてありました｡

63
00:05:03,860 --> 00:05:06,590
‫この健康コンポーネントの所有者です｡

64
00:05:06,620 --> 00:05:13,760
‫コンパイルして保存して閉じて､ BP ポーン タレットを開き､ フル ブループリント エディタを開いて､ ポーン タレットにもヘルス

65
00:05:13,760 --> 00:05:16,930
‫コンポーネントを追加してみましょう｡

66
00:05:16,940 --> 00:05:21,620
‫そこで､ コンポーネントの追加をクリックし､ healthを検索してhealthを選択しましょう｡

67
00:05:21,620 --> 00:05:25,490
‫そして今､ 私たちはタワーに健康コンポーネントも搭載しています｡

68
00:05:25,670 --> 00:05:30,560
‫そこで､ これらをコンパイルして保存し､ すべてをクローズアウトして保存します｡

69
00:05:30,590 --> 00:05:38,740
‫健康コンポーネントを作成し､ 異なるクラスで再利用できるようにしたいと述べました｡

70
00:05:38,750 --> 00:05:47,040
‫例えば､ ポーン（塔）があれば､ その塔は独自のヘルスコンポーネントを持ち､ さらにタンクも独自のヘルスコンポーネントを持つことができるわけです｡

71
00:05:47,060 --> 00:05:52,340
‫さて､ 射線がこれらのいずれかと相互作用するとき､ たとえば､ これらのものに当たったときにヒットイベントが発生すると､

72
00:05:52,340 --> 00:06:00,830
‫ポーンはヘルスコンポーネントの機能を起動し､ ヘルス値を変更することができます｡

73
00:06:00,830 --> 00:06:07,820
‫例えば､ ポーンの基底クラスにヘルス機能を置き､ それをタンクやタワーに継承させるといった方法と比べると､

74
00:06:07,820 --> 00:06:13,760
‫ヘルス機能をコンポーネントに置き､ そのコンポーネントをクラスに追加することには､

75
00:06:13,760 --> 00:06:17,520
‫いくつかの利点があります｡

76
00:06:17,540 --> 00:06:26,420
‫これにより､ タンクとタワーのクラスを小さくして､ それらのクラスの特定の機能のみを扱うことができるようになりましたね｡

77
00:06:26,420 --> 00:06:33,800
‫一方､ ヘルスコンポーネントは､ タンクやタワーのように動作しないものなど､ 他のアクターに追加することができます｡

78
00:06:33,800 --> 00:06:39,950
‫例えば､ 破壊可能な壁を作り､ 十分なダメージを受けたらすぐに破壊されるようにすることができます｡

79
00:06:39,950 --> 00:06:43,910
‫では､ どうすれば今すぐ実現できるのか､ 少しお話ししましょう｡

80
00:06:43,910 --> 00:06:50,810
‫Unreal Engine にはダメージ機能が組み込まれており､ そのダメージ システムも実は非常に洗練されています｡

81
00:06:50,810 --> 00:06:58,490
‫このゲームのアクターは､ いくつかのダメージイベントを継承しており､ そのうちの1つはダメージを受けたときに呼び出されます｡

82
00:06:58,490 --> 00:07:03,440
‫コンポーネントヒット時と同様､ マルチキャストデリゲートです｡

83
00:07:03,470 --> 00:07:08,360
‫これからポーンにヘルスコンポーネントを追加していきますが､ これらはUに基づいています｡

84
00:07:08,360 --> 00:07:09,860
‫健康部品クラス｡

85
00:07:09,860 --> 00:07:16,550
‫ポーンがこのon take any damageデリゲートを継承することが分かっているので､ ヘルスコンポーネントクラスで独自のカスタム関数を作成すれば､

86
00:07:16,550 --> 00:07:25,940
‫この関数をコールバックとして使用し､ on take any damageデリゲートにバインドすることができるのです｡

87
00:07:25,940 --> 00:07:37,460
‫そのため､ ダメージイベントが発生するたびに､ ダメージデリゲートがブロードキャストし､ その呼び出しリストでそれにバインドされている関数が呼び出されることになります｡

88
00:07:37,460 --> 00:07:42,320
‫そこで次の問題は､ そのデリゲートを実際にブロードキャストさせるにはどうしたらいいか､ ということです｡

89
00:07:42,320 --> 00:07:45,080
‫ダメージイベントを発生させる方法が必要です｡

90
00:07:45,080 --> 00:07:52,070
‫ゲームプレイのスタティックには､ それを実現する機能があり､ 「ダメージを与える」と呼ばれています｡

91
00:07:52,070 --> 00:08:02,180
‫このゲームプレイのスタティック関数を使用してダメージを与える場合､ ダメージを与えるアクターを含むいくつかのパラメータを取ります｡

92
00:08:02,180 --> 00:08:11,720
‫つまり､ apply damageを呼び出すと､ take any damageデリゲートでアクターが起動し､ その応答としてコールバック関数が呼び出されることになります｡

93
00:08:11,720 --> 00:08:15,830
‫つまり､ ダメージを与えるということは､ ダメージイベントを発生させるということです｡

94
00:08:15,830 --> 00:08:19,520
‫そこで､ これらすべてをセットアップするために､ 3つのステップを用意しました｡

95
00:08:19,520 --> 00:08:25,760
‫まず､ コールバック関数を作成します｡ この関数は､ on take any damageにバインドされるため､ 正しい入力パラメータを持つ必要があり､

96
00:08:25,760 --> 00:08:33,950
‫on take any damageがこれを呼び出し､ ダメージイベントに関するすべての関連情報を渡します｡

97
00:08:34,130 --> 00:08:37,970
‫ステップ2は､ このコールバックをデリゲートにバインドすることです｡

98
00:08:38,000 --> 00:08:43,850
‫この方法は､ on component hitデリゲートでadd dynamic関数を使用することで確認しました｡

99
00:08:43,850 --> 00:08:45,530
‫こちらも同じようにやっていきます｡

100
00:08:45,530 --> 00:08:52,670
‫そして3つ目のステップは､ you game playのスタティック関数､ applied damageを呼び出してダメージイベントを発生させることです｡

101
00:08:52,670 --> 00:08:56,210
‫それでは､ コードに戻り､ この設定を始めましょう｡

102
00:08:56,600 --> 00:08:56,880
‫なるほど｡

103
00:08:56,960 --> 00:09:01,910
‫ここではhealthコンポーネントで､ コールバック関数を追加しています｡

104
00:09:01,910 --> 00:09:05,810
‫さて､ これはvoidでもいいし､ 好きなように呼んでもいい｡

105
00:09:05,960 --> 00:09:08,450
‫これをダメージテイクと呼ぶことにする｡

106
00:09:08,450 --> 00:09:16,280
‫また､ デリゲートにバインドしているので､ そのデリゲートに適した正しい入力パラメータを持つ必要があります｡

107
00:09:16,310 --> 00:09:23,240
‫on take any damageデリゲートにバインドされる関数では､ 入力パラメータリストは次のようにする必要があります｡

108
00:09:23,240 --> 00:09:30,830
‫1つ目は､ Damaged Actorというアクターポインターで､ このような音がします｡

109
00:09:30,830 --> 00:09:33,320
‫ダメージを受けるのは役者です｡

110
00:09:33,350 --> 00:09:38,480
‫次にdamageというfloatがあり､ これが実際のダメージ量になります｡

111
00:09:38,510 --> 00:09:45,950
‫さて､ 次にダメージタイプというコストユーのポインターです｡

112
00:09:46,220 --> 00:09:52,430
‫そして､ この入力パラメータがあるのは､ Unreal Engineにダメージタイプの概念があるからです｡

113
00:09:52,430 --> 00:10:01,100
‫カスタムダメージは､ ダメージの種類によって異なる処理を行うための追加データを作成することができます｡

114
00:10:01,100 --> 00:10:02,000
‫火災による被害

115
00:10:02,000 --> 00:10:03,260
‫毒のダメージ

116
00:10:03,320 --> 00:10:05,570
‫爆発的なダメージなど｡

117
00:10:05,570 --> 00:10:13,430
‫また､ ダメージタイプごとにカスタム機能を実装したい場合は､ 独自のカスタムダメージタイプに実装することになります｡

118
00:10:13,460 --> 00:10:19,040
‫独自のダメージタイプを作成するわけではありませんが､ この関数をon take any damageデリゲートにバインドするため､

119
00:10:19,040 --> 00:10:22,940
‫これらの入力パラメータを持つ必要があります｡

120
00:10:22,940 --> 00:10:24,380
‫だから､ ここに収録しているのです｡

121
00:10:24,410 --> 00:10:33,330
‫さて､ 次のパラメータはAコントローラのポインタで､ これはinstigatorとUnreal Engine Damage Systemと呼ばれるものです｡

122
00:10:33,350 --> 00:10:38,050
‫インスティゲーターとは､ 損害の原因となるコントローラーのことです｡

123
00:10:38,060 --> 00:10:46,820
‫つまり､ 最終的にポーンを操作しているプレイヤーが被害を受けたのであれば､ そのポーンを所持しているコントローラーが発案者となるわけです｡

124
00:10:46,850 --> 00:10:49,600
‫今は､ 必ずしも扇動者がいる必要はないのです｡

125
00:10:49,610 --> 00:10:52,580
‫もしなかったら､ これは単にNULLになるだけです｡

126
00:10:52,580 --> 00:11:00,410
‫そして､ 赤い四角が表示されたので､ ここの括弧の中でAコントローラクラスを前方に宣言して､ 関数にすることができます｡

127
00:11:00,440 --> 00:11:06,980
‫さて､ 最後のパラメータはアクターポインターで､ これはダメージコーザと呼ばれています｡

128
00:11:07,010 --> 00:11:10,370
‫これが､ 実際に被害を与えている役者です｡

129
00:11:10,370 --> 00:11:13,220
‫これは投射物そのものでしょう｡

130
00:11:13,310 --> 00:11:20,670
‫このダメージ取得コールバック関数は､ 他のヒット時のコールバック関数と同じように宣言されています｡

131
00:11:20,690 --> 00:11:22,970
‫これはu関数でなければならない｡

132
00:11:22,970 --> 00:11:30,620
‫そこで､ この関数にマクロを追加して､ on take any damage delegateにバインドしたときに動作することを確認します｡

133
00:11:30,950 --> 00:11:35,680
‫そして､ 宣言ができたので､ CPPファイルに定義する準備ができました｡

134
00:11:35,690 --> 00:11:38,540
‫だから､ ここ健康部品では､ CPP｡

135
00:11:38,630 --> 00:11:46,970
‫下の方では､ この関数にボディを付けて､ クラス名で関数を完全に修飾します｡

136
00:11:46,970 --> 00:11:49,400
‫そして､ 今度はコールバックです｡

137
00:11:49,400 --> 00:11:52,400
‫では､ これをデリゲートにバインドする必要があります｡

138
00:11:52,400 --> 00:11:59,180
‫しかし､ デリゲートはヘルスコンポーネントに存在するのではなく､ アクターに特化して存在するのです｡

139
00:11:59,180 --> 00:12:05,970
‫このコンポーネントを所有するポーンの､ ダメージを受けたときのデリゲートにバインドしたい｡

140
00:12:05,990 --> 00:12:11,570
‫では､ このコンポーネントのオーナーにアクセスして､ そのデリゲートのひとつにバインドするにはどうすればよいのでしょうか｡

141
00:12:11,570 --> 00:12:17,270
‫さて､ こうしてプレイを始めるわけですが､ コンポーネントのオーナーにアクセスする方法は､

142
00:12:17,270 --> 00:12:19,460
‫gitのオーナー関数です｡

143
00:12:19,460 --> 00:12:23,530
‫これにカーソルを合わせると､ アクターポインターが返されることがわかります｡

144
00:12:23,540 --> 00:12:27,620
‫コンポーネントを所有するアクターへのポインタです｡

145
00:12:27,620 --> 00:12:32,990
‫コンポーネントはポーンによって所有することができ､ それらはアクターによって所有することができるので､

146
00:12:32,990 --> 00:12:35,630
‫アクターポインターの形で所有者を返します｡

147
00:12:35,810 --> 00:12:42,890
‫コールバック関数ができたので､ 2番目のステップとして､ ヘルスコンポーネントを所有するポーンに発生するダメージを受けるためのデリゲートに､

148
00:12:42,890 --> 00:12:46,640
‫コールバック関数をバインドすることにします｡

149
00:12:46,790 --> 00:12:55,100
‫コールバックをデリゲートにバインドした経験があるので､ これがヘルスコンポーネントクラスでの課題となるわけです｡

150
00:12:55,100 --> 00:13:04,190
‫Begin Playでは､ コンポーネントのオーナーに存在するon take any damage delegateに､ 被ダメージをバインドすることになります｡

151
00:13:04,190 --> 00:13:08,090
‫つまり､ get owner関数でそのデリゲートにアクセスすることになります｡

152
00:13:08,090 --> 00:13:13,640
‫言い換えれば､ あなたは､ 所有者を取得し､ そこから､ 任意の損傷を取るにアクセスするつもりだ呼び出すつもりです｡

153
00:13:13,640 --> 00:13:20,660
‫それから､ コールバックをデリゲートにバインドする方法は､

154
00:13:20,660 --> 00:13:31,790
‫add dynamicを使用すればわかります｡

155
00:13:35,000 --> 00:13:35,360
‫なるほど｡

156
00:13:35,360 --> 00:13:40,610
‫ヘルスコンポーネントに戻り､ コールバック関数のバインディングを行う準備が整いました｡

157
00:13:40,610 --> 00:13:47,390
‫git owner関数を使ってオーナーにアクセスし､ そこから矢印演算子を使ってonと呼ばれるデリゲートにアクセスし､

158
00:13:47,390 --> 00:14:01,520
‫take any damageでダイナミック関数を追加し､ ユーザーオブジェクトと関数名を取るだけです｡

159
00:14:01,520 --> 00:14:05,240
‫ここで､ ユーザーオブジェクトは､ 関数をバインドするオブジェクトです｡

160
00:14:05,240 --> 00:14:10,130
‫これはコールバック関数を持つクラスで､ このようになる予定です｡

161
00:14:10,190 --> 00:14:14,420
‫そして最後にコールバック関数を用意します｡ これはあなたになる予定です｡

162
00:14:14,420 --> 00:14:16,790
‫受けた健康成分ダメージ｡

163
00:14:16,790 --> 00:14:23,690
‫ここで､ operatorのアドレスを覚えておく必要があります｡ なぜなら､ これは実際には関数のアドレスを取るからです｡

164
00:14:23,690 --> 00:14:31,460
‫つまり､ damage takenはon take any damageにバインドされ､ そのデリゲートの呼び出しリストに追加されます｡

165
00:14:31,460 --> 00:14:40,970
‫そのため､ ダメージイベントが発生すると､ このデリゲートからブロードキャストされ､ その結果､ ダメージを受ける関数が呼び出されることになります｡

166
00:14:41,570 --> 00:14:50,540
‫要約すると､ 独自のヘルス コンポーネントを作成し､ これをタンク設計図とタワー設計図の両方に追加しました｡

167
00:14:50,660 --> 00:14:58,130
‫Damage Takenというコールバック関数を作成し､ on take any damageデリゲートにバインドしました｡

168
00:14:58,130 --> 00:15:05,150
‫次のステップでは､ ダメージイベントを生成して､ take any damageデリゲートをブロードキャストし､

169
00:15:05,150 --> 00:15:10,640
‫コールバック関数damage takenが呼び出されるようにします｡

170
00:15:10,640 --> 00:15:13,520
‫そして､ 次のビデオでそれを設定します｡

171
00:15:14,240 --> 00:15:15,140
‫また､ お会いしましょう｡

