﻿1
00:00:04,120 --> 00:00:04,510
‫ねえ｡

2
00:00:04,510 --> 00:00:05,440
‫お帰りなさい｡

3
00:00:05,470 --> 00:00:11,740
‫これで､ ダメージを受けたときのコールバック関数がデリゲートにバインドされるように設定されました｡

4
00:00:11,830 --> 00:00:16,210
‫そして最後のステップは､ 実際にそのダメージイベントを発生させることです｡

5
00:00:16,210 --> 00:00:19,690
‫そして､ 弾丸が何かにぶつかったときに､ これを実行したいのです｡

6
00:00:19,690 --> 00:00:25,540
‫このデリゲートをブロードキャストすれば､ ヒットしたものにダメージを与えることができるのです｡

7
00:00:25,540 --> 00:00:32,830
‫そして､ ゲームプレイの静止画クラスに属する適用ダメージを使用して､ このイベントを放送するつもりです｡

8
00:00:32,860 --> 00:00:36,310
‫では､ 応用ダメージ機能を見てみましょう｡

9
00:00:36,400 --> 00:00:44,050
‫ダメージの適用に関するドキュメントです｡

10
00:00:44,050 --> 00:00:47,590
‫つまり､ これはダメージを与えるための汎用的な機能なのです｡

11
00:00:47,590 --> 00:00:52,510
‫そして､ この代表のための放送に対して何をするかは､ 私たち次第です｡

12
00:00:52,540 --> 00:00:59,140
‫ここで､ ゲームプレイの静止画を含める必要があることがわかります｡ また､ 構文にはいくつかの入力パラメータがあります｡

13
00:00:59,140 --> 00:01:02,110
‫これで､ 実際にパラメータの説明ができるようになりました｡

14
00:01:02,110 --> 00:01:13,660
‫下にスクロールしていくと､ damaged actorは､ damaged base damageは､ ここで本当に説明的な文書を適用するための基本的なダメージであることがわかります｡

15
00:01:13,690 --> 00:01:14,170
‫ありがとうございます｡

16
00:01:14,170 --> 00:01:19,930
‫Epicイベントインスティゲーターは､ この損害を引き起こす原因となったコントローラーです｡

17
00:01:19,930 --> 00:01:23,020
‫そして､ 例えば武器を撃ったプレイヤーも書いてある｡

18
00:01:23,020 --> 00:01:26,260
‫プレーヤーと書いてあるのは､ そのコントローラーのことです｡

19
00:01:26,260 --> 00:01:31,120
‫そして､ 実際に損害を与えた行為者である損害原因者がいます｡

20
00:01:31,120 --> 00:01:33,160
‫爆発した手榴弾のことが書いてある｡

21
00:01:33,160 --> 00:01:35,980
‫私たちの場合は､ 爆発した弾丸になります｡

22
00:01:35,980 --> 00:01:43,000
‫そして最後に､ ダメージの種類を記述するクラスであるダメージタイプクラスです｡

23
00:01:43,000 --> 00:01:49,690
‫さて､ 構文セクションに戻って､ これらの入力の型を見ると､ damage type classはofのサブクラスであり､

24
00:01:49,690 --> 00:01:57,550
‫TW subclass ofがU class型の入力パラメータを満たすことは前に見たとおりである｡

25
00:01:57,550 --> 00:02:04,360
‫さて､ apply damageを呼び出すとき､ 使用したいダメージタイプを表すUクラスを渡すことができます｡

26
00:02:04,360 --> 00:02:09,280
‫では､ この入力パラメータをどのように満たすかについて､ これから説明します｡

27
00:02:09,280 --> 00:02:15,190
‫つまり､ 色相ゲームプレイ静的関数､ 適用されたダメージは､ いくつかの入力パラメータを取ることになるのです｡

28
00:02:15,190 --> 00:02:24,100
‫この関数を呼び出すときに､ どのように適切な値を渡すか戦略を練りましょう｡ まず､ 破損したアクターが必要なことがわかりました｡

29
00:02:24,310 --> 00:02:30,220
‫さて､ ダメージを与えるといいたいところですが､ 投射型CPに戻りましょう｡

30
00:02:30,220 --> 00:02:34,660
‫ここはオンヒットでやりたいので､ このログはもう必要ない｡

31
00:02:34,660 --> 00:02:43,450
‫このコールバックが呼び出されると､ いくつかの入力が渡されることに注意してください｡

32
00:02:43,450 --> 00:02:49,240
‫on component hit delegateがブロードキャストされると､ 他のアクターがいることがわかります｡

33
00:02:49,240 --> 00:02:56,740
‫つまり､ 弾丸が当たったアクタにアクセスすることができ､ これがダメージを与えたいアクタです｡

34
00:02:56,740 --> 00:02:59,320
‫これで､ 最初の入力パラメータは解決です｡

35
00:02:59,320 --> 00:03:01,390
‫そのほかの俳優になるんです｡

36
00:03:01,390 --> 00:03:10,360
‫次に､ ダメージ量が必要です｡ つまり､ 発射物にはダメージ変数が必要で､ これにより適用するダメージ量を知ることができます｡

37
00:03:10,510 --> 00:03:17,650
‫そこで､ プロジェクタイルFXにダメージ変数を追加し､ これをfloatにするのはどうでしょう｡

38
00:03:17,650 --> 00:03:23,770
‫このdamageを単純に呼び出して､ 値を初期化することができます｡ 例えば50Fのような値です｡

39
00:03:24,040 --> 00:03:32,860
‫これはおそらく実験したいことなので､ Uプロパティを与えて公開し､ どこでも編集できるようにします｡

40
00:03:32,860 --> 00:03:37,780
‫これで､ take damageを呼び出すときに､ ダメージ量を渡すことができるようになったわけです｡

41
00:03:38,080 --> 00:03:44,140
‫次のパラメータはインスティゲータで､ これはタイプAのコントローラであることを確認しました｡

42
00:03:44,140 --> 00:03:46,870
‫では､ どうやってコントローラーを手に入れるのか？

43
00:03:46,870 --> 00:03:53,470
‫さて､ get owner関数で特定のコンポーネントのオーナーを取得できることを確認しました｡

44
00:03:53,470 --> 00:04:00,820
‫そしてこれは､ 特定のコンポーネントを所有するアクターを返します｡ これらの投射物は動的に生成されます｡

45
00:04:00,820 --> 00:04:08,410
‫つまり､ get ownerを呼び出す場合は､ ownerがセットされていることを確認する必要があります｡

46
00:04:08,410 --> 00:04:10,390
‫だから､ ベースポーンに入れば｡

47
00:04:10,600 --> 00:04:18,880
‫CP ここでアクターをスポーンしていますが､ Spawn Actor はスポーンされたアクターへのポインターも返すので､

48
00:04:18,880 --> 00:04:22,690
‫これをローカル変数に格納することができます｡

49
00:04:22,690 --> 00:04:29,220
‫例えば､ auto projectile と言って､ spawn actor から返される値を代入することができます｡

50
00:04:29,230 --> 00:04:36,790
‫autoをよく知らない人は､ コンパイラがこの新しい変数に割り当てるべき型を判断できるようにするものです｡

51
00:04:36,790 --> 00:04:45,610
‫その上にカーソルを置くと､ タイプAの発射体ポインタが表示されます｡ これは､ アクターのスポーン関数からサインしているものだからです｡

52
00:04:45,610 --> 00:04:54,400
‫つまり､ ここに投射物ポインタを置くと､ 新たに生成された投射物にアクセスできるのと同じことです｡

53
00:04:54,400 --> 00:04:57,820
‫その理由は､ そのオーナーを設定したいからです｡

54
00:04:57,820 --> 00:05:02,710
‫そのオーナーが､ それを生み出したポーンに設定されていることを確認したいと思います｡

55
00:05:02,920 --> 00:05:04,930
‫だから射影機と言えるのです｡

56
00:05:04,930 --> 00:05:08,010
‫そして､ そのための機能として､ セットオーナーというものがあります｡

57
00:05:08,020 --> 00:05:18,250
‫ポーンが弾丸を発射するたびに､ その弾丸のオーナーが設定されるようにします｡

58
00:05:18,250 --> 00:05:25,700
‫そうすれば､ この先､ get owner を呼び出したときに､ その発射体を所有しているクラスのインスタンスを取得することができます｡

59
00:05:25,720 --> 00:05:33,910
‫このように､ projectile DHCPでは､ get owner関数が呼び出され､ これをローカル変数に格納することができます｡

60
00:05:33,940 --> 00:05:41,590
‫もう一度autoを使って､ これをmy ownerと呼び､ get ownerが返す結果に設定します｡

61
00:05:41,920 --> 00:05:47,570
‫これで､ オーナーの値を格納するローカルアクターポインタができました｡

62
00:05:47,590 --> 00:05:52,190
‫これで､ このアクターからインスティゲーターコントローラーにアクセスできるようになりました｡

63
00:05:52,210 --> 00:05:57,640
‫さて､ その前に､ 私のオーナーがNULLでないことを確認しておくとよいでしょう｡

64
00:05:57,640 --> 00:06:04,460
‫だから､ 私は私の所有者がNULLイコールNULLポインタである場合､ 私は単に返すつもりだと言うつもりです｡

65
00:06:04,480 --> 00:06:11,890
‫さて､ このようにifボディに1つのステートメントがある場合､ ご存じない方のために中括弧を付けずに同じ行に配置することができます｡

66
00:06:11,890 --> 00:06:19,470
‫そして､ ヌルポインターとは､ C++のキーワードで､ ポインターがヌルポインターであるかどうかを確認することができる｡

67
00:06:19,480 --> 00:06:25,760
‫ですから､ もし私のオーナーがNULLであれば､ 早めに関数から戻り､ それ以上何もしないことになります｡

68
00:06:25,780 --> 00:06:35,500
‫さて､ 先ほど申し上げたように､ 私のオーナーからインスティゲータ・コントローラを取得することができます｡

69
00:06:36,400 --> 00:06:40,590
‫そして､ この上にカーソルを置くと､ Aコントローラのポインタが返されることがわかります｡

70
00:06:40,600 --> 00:06:48,250
‫単純にautoを使い､ これをオーナーインスティゲーターと呼ぶローカル変数に格納することにします｡

71
00:06:50,660 --> 00:06:54,460
‫これで､ 扇動者として何を通せばいいのかがわかったわけです｡

72
00:06:54,470 --> 00:07:00,800
‫次の入力は､ damage causerで､ これは投射物にダメージを与えるアクターです｡

73
00:07:00,800 --> 00:07:02,930
‫単純にこれだけになりそうです｡

74
00:07:02,930 --> 00:07:07,490
‫そして､ 最後の入力パラメータであるダメージタイプが残ります｡

75
00:07:07,490 --> 00:07:12,740
‫のサブクラスであることがわかりましたが､ これはつまり､ 適切な使用クラスを渡す必要があるということです｡

76
00:07:12,740 --> 00:07:17,960
‫N さて､ ここからはアンリアル・エンジンのドキュメントで､ あなたのダメージタイプについて説明します｡

77
00:07:17,960 --> 00:07:28,370
‫ダメージタイプは､ 特定の形態のダメージを定義して記述し､ さまざまなソースからのダメージへの対応をカスタマイズするための手段を提供することを目的としているという｡

78
00:07:28,370 --> 00:07:30,890
‫さて､ ダメージのカスタマイズはしない｡

79
00:07:30,890 --> 00:07:40,070
‫入力パラメータを満たすだけで良いので､ このyou damage type classを表すU classの値が必要です｡

80
00:07:40,310 --> 00:07:51,020
‫さて､ C++では､ ダメージタイプのような特定のクラスのYOUクラスを取得したい場合､ static classと呼ばれる関数を呼び出すことができます｡

81
00:07:51,020 --> 00:07:54,140
‫you オブジェクトクラスから継承されます｡

82
00:07:54,170 --> 00:07:58,070
‫もちろん､ ここではダメージタイプを使用しているので､ ヘッダーが必要です｡

83
00:07:58,310 --> 00:08:05,690
‫そして､ この静的クラス関数がUクラスポインタを返し､

84
00:08:05,960 --> 00:08:17,780
‫この新しいクラスが新しいダメージタイプのC++クラスを表していることがわかります｡

85
00:08:17,780 --> 00:08:23,510
‫さて､ ダメージ タイプに基づいてブループリントを作成し､ 追加データを設定するわけではないので､ 実際には variable

86
00:08:23,510 --> 00:08:26,030
‫のサブクラスは必要ではありません｡

87
00:08:26,150 --> 00:08:32,750
‫そこで､ この場合､ static classを使用すると､ この型を表すUクラスが返されます｡

88
00:08:32,750 --> 00:08:38,480
‫そして､ これを変数に格納することができます｡ これをダメージタイプクラスと呼ぶことにします｡

89
00:08:40,390 --> 00:08:45,520
‫そして､ これがダメージを与えるための最後のパラメータとして渡せるものです｡

90
00:08:45,520 --> 00:08:51,250
‫これで､ ダメージの適用関数に渡すべき情報はすべて揃ったことになります｡

91
00:08:51,250 --> 00:08:58,000
‫しかし､ その前に､ この関数を呼び出すことが適切かどうか､ いくつかのチェックを入れておきたいと思います｡

92
00:08:58,000 --> 00:09:00,090
‫そこで､ ここでif文を作ってみることにする｡

93
00:09:00,100 --> 00:09:03,550
‫まず､ other actor が null でないことを確認したい｡

94
00:09:03,550 --> 00:09:06,490
‫そこで､ ここに他の俳優を配置することにしました｡

95
00:09:06,490 --> 00:09:13,450
‫他のアクターがこのアクターと等しくないことを確認するために､ ここに AND を配置することにします｡

96
00:09:13,450 --> 00:09:24,640
‫自分が弾丸になった場合､ 自分にダメージを与えたくないので､ 別の端を置き､ その別の役者が自分の持ち主と同等でないことを確認します｡

97
00:09:24,760 --> 00:09:28,930
‫その弾が持ち主にダメージを与えるようではダメでしょう｡

98
00:09:28,930 --> 00:09:36,550
‫そして､ このif文の中に入れば､ apply damageを呼び出すことが適切であることがわかるので､ そうすることができるのです｡

99
00:09:36,550 --> 00:09:38,290
‫そして､ それがあなたのチャレンジになるのです｡

100
00:09:38,290 --> 00:09:45,070
‫そこで､ 新しいif文では､ on hit関数でyou game play statics apply damage関数を呼び出します｡

101
00:09:45,070 --> 00:09:52,450
‫つまり､ ゲームプレイの静止画のために正しいヘッダーを含める必要があり､ どの入力パラメータを渡せばいいのかがわかるということです｡

102
00:09:52,570 --> 00:09:58,660
‫そこで､ ビデオを一時停止して､ 今すぐオンヒット関数でダメージを適用する関数呼び出しを追加します｡

103
00:10:02,740 --> 00:10:03,250
‫なるほど｡

104
00:10:03,250 --> 00:10:11,020
‫Applied Damage Documentation のページで､ インクルードが kismet

105
00:10:11,020 --> 00:10:17,260
‫slash gameplay statics であることが確認できます｡

106
00:10:17,980 --> 00:10:22,330
‫これを貼り付けて､ ダメージの適用を呼び出す準備が整ったわけです｡

107
00:10:22,330 --> 00:10:28,060
‫だから､ ゲームプレイのスタティックはダメージを適用すると呼ぶことにしているんだ｡

108
00:10:28,810 --> 00:10:35,800
‫現在では､ この開始括弧を入力するとすぐに､ 必要な入力パラメータを思い出させるポップアップが表示されるようになっています｡

109
00:10:35,800 --> 00:10:40,360
‫そして､ 1人目はダメージを受けた役者で､ 他の役者になるんです｡

110
00:10:40,360 --> 00:10:42,760
‫そこで､ 次はother actorと入力することにします｡

111
00:10:42,760 --> 00:10:50,410
‫ダメージ量が必要なので､ projectile FXでこのダメージフロートを追加し､ 50に設定しました｡

112
00:10:50,410 --> 00:10:53,170
‫だから､ 次はダメージエンドをパスするつもりです｡

113
00:10:53,170 --> 00:10:56,920
‫私たちには扇動者が必要で､ 私のオーナー扇動者がいます｡

114
00:10:56,920 --> 00:11:00,010
‫だから､ オーナーインスティテーターで合格するんです｡

115
00:11:00,010 --> 00:11:01,960
‫次に､ ダメージの原因者です｡

116
00:11:01,960 --> 00:11:05,500
‫そしてもちろん､ 投射物自体がダメージの原因となっているのです｡

117
00:11:05,500 --> 00:11:07,210
‫だから､ この中で合格を目指す｡

118
00:11:07,210 --> 00:11:14,860
‫そして最後に､ ダメージタイプのサブクラスが必要ですが､ Uクラスポインタがそれを満たしてくれることが分かっているので､

119
00:11:14,860 --> 00:11:17,980
‫ダメージタイプクラスがあるのです｡

120
00:11:17,980 --> 00:11:21,910
‫そこで､ ダメージタイプクラスでパスしてみましょう｡

121
00:11:21,910 --> 00:11:25,570
‫そして､ それをもって､ 私たちは今､ ダメージを適用すると呼んでいます｡

122
00:11:25,720 --> 00:11:33,040
‫このイベントを呼び出すと､ damageイベントが発生し､ on take any damageデリゲートがこれに応答してブロードキャストします｡

123
00:11:33,040 --> 00:11:39,010
‫つまり､ healthコンポーネントのdamage takenが呼び出されます｡

124
00:11:39,010 --> 00:11:42,580
‫だから､ ここはダメージテイクで何とかすればいいんです｡

125
00:11:42,580 --> 00:11:47,440
‫まあ､ このダメージを受けて､ その分を体力から引くというのは理にかなっているのでしょうけど｡

126
00:11:47,440 --> 00:11:52,510
‫その前に､ ダメージが0以下でないことを確認したいのですが｡

127
00:11:52,810 --> 00:11:59,170
‫F ダメージを記録する前に､ ゼロやマイナスといった意味のない値を適用しないように､

128
00:11:59,170 --> 00:12:02,890
‫こうしたチェックをすることは意味があります｡

129
00:12:02,890 --> 00:12:05,740
‫ということであれば､ 単に戻るだけです｡

130
00:12:05,740 --> 00:12:12,700
‫もちろん､ CPでprojectileでやったような巧妙なやり方であれば､ そこにリターンを配置することも可能です｡

131
00:12:12,700 --> 00:12:21,460
‫さて､ このラインを超えるとダメージはプラスになるので､ ヘルスをとってマイナスイコールでダメージとすることができます｡

132
00:12:21,550 --> 00:12:25,750
‫また､ 念のため､ ここにeuyログを置いてみてはいかがでしょうか｡

133
00:12:25,750 --> 00:12:40,840
‫だから､ Yuiログログ､ temp警告テキスト､ 我々は単純にパーセントFとhealthの値を表示することができますし､ これでコンパイルすることができます｡

134
00:12:40,870 --> 00:12:47,980
‫コンパイルが成功したら､ エディタに戻って出力ログを開き､ 再生ボタンを押してみましょう｡

135
00:12:47,980 --> 00:12:51,010
‫では､ 投擲物が当たるかどうか見てみましょう｡

136
00:12:51,010 --> 00:12:52,120
‫そして､ そこに行く｡

137
00:12:52,150 --> 00:12:58,810
‫体力が50になり､ また被弾すると､ あっという間に何度も弾を打ち上げるので､

138
00:12:58,810 --> 00:13:02,410
‫かなりの数の被弾イベントが発生しました｡

139
00:13:02,410 --> 00:13:05,770
‫しかし､ 私たちの健康はきちんと文書化されていることがわかります｡

140
00:13:05,770 --> 00:13:11,620
‫そのため､ 体力がゼロになったときの死亡時の動作を正しく実装する必要があります｡

141
00:13:11,620 --> 00:13:17,290
‫しかし､ このヒットイベントが何度もスパムにならないようにすることも必要です｡

142
00:13:17,290 --> 00:13:23,560
‫投射物は何かにぶつかると破壊されることが分かっているので､ ヒットイベントのスパムを防ぐには､

143
00:13:23,560 --> 00:13:26,800
‫投射物を破壊するのが一番良い方法です｡

144
00:13:26,800 --> 00:13:29,290
‫というわけで､ この動画はこれで最後です｡

145
00:13:29,290 --> 00:13:38,050
‫ですから､ ダメージを与えた直後の投射に戻ると､ 投射を自滅させることができ､ これ以上ないほど簡単です｡

146
00:13:38,050 --> 00:13:41,110
‫単にdestroy関数を呼び出すだけです｡

147
00:13:41,110 --> 00:13:49,330
‫このエディターでもう1回コンパイルして､ 弾丸に当たっているところを見ましょう｡

148
00:13:49,330 --> 00:13:51,520
‫弾丸が消えた｡

149
00:13:51,520 --> 00:13:55,360
‫だから､ ダメージを与えたら､ 消えてしまう｡

150
00:13:55,360 --> 00:14:04,570
‫もちろん､ タワーに弾丸をぶつけて､ その命中イベントが発生するかどうかもテストしています｡

151
00:14:04,570 --> 00:14:10,750
‫見ての通り､ 大量の弾丸を投げることができ､ このかわいそうなタワーの体力が､

152
00:14:10,750 --> 00:14:16,390
‫とてもとてもマイナスになっているのがわかると思います｡

153
00:14:16,540 --> 00:14:25,030
‫まとめると､ apply damage関数を呼び出すと､ on take any damageデリゲートのブロードキャストが発生するということです｡

154
00:14:25,030 --> 00:14:30,130
‫ヘルスコンポーネントにヘルスを記録し､ プロジェクタイルを破壊しました｡

155
00:14:30,130 --> 00:14:32,350
‫だから､ 今はダメージケアに徹しています｡

156
00:14:32,350 --> 00:14:34,390
‫私たちはまだ､ 死を引き受けていないのです｡

157
00:14:34,390 --> 00:14:38,860
‫ですから､ それは今後のビデオで取り上げるもののひとつになるでしょう｡

158
00:14:39,310 --> 00:14:40,270
‫また､ お会いしましょう｡

