﻿1
00:00:04,320 --> 00:00:05,040
‫こんにちは､ ようこそ｡

2
00:00:05,040 --> 00:00:11,940
‫今回の講義のテーマは､ アクターのテイクダメージ機能とその呼び方についてです｡

3
00:00:11,940 --> 00:00:14,700
‫早速､ 潜入してその全貌を探ってみましょう｡

4
00:00:15,770 --> 00:00:22,250
‫つまり､ 何かにダメージを与えるためには､ 実際にダメージを与えることができるものが必要なのです｡

5
00:00:22,370 --> 00:00:29,480
‫では､ コンテンツブラウザのルートで､ BPシューターのキャラクターを1人連れてきてみましょう｡

6
00:00:29,810 --> 00:00:36,170
‫なぜなら､ 実際に起こることは､ シーンにキャラクターを持ち込むと､ 自動的にUnrealはこのキャラクターをAI制御にして､

7
00:00:36,170 --> 00:00:43,190
‫プレイヤーのスタート地点でスポーンするものはプレイヤー制御になってしまうからです｡

8
00:00:43,190 --> 00:00:44,660
‫だからすごいんです｡

9
00:00:44,660 --> 00:00:45,890
‫それこそ､ 私たちが望む行動です｡

10
00:00:45,890 --> 00:00:54,080
‫このままalt pを押すと､ 実はスポーンポイントが違うので､ この2番目のプレイヤースタートを削除したいかもしれません｡

11
00:00:54,080 --> 00:00:57,110
‫今､ alt pを押せば､ 正しい位置になる｡

12
00:00:57,110 --> 00:00:58,610
‫私の敵がいる｡

13
00:00:58,610 --> 00:01:00,050
‫敵に向かって撃つことができる

14
00:01:00,050 --> 00:01:01,190
‫ヒット効果を得ることができる｡

15
00:01:01,190 --> 00:01:03,140
‫でも､ 明らかにダメージがないんです｡

16
00:01:03,140 --> 00:01:04,250
‫とにかくまだです｡

17
00:01:04,700 --> 00:01:07,400
‫そして､ ダメージを与えることは､ 2つのプロセスで行われます｡

18
00:01:07,400 --> 00:01:12,650
‫前者はダメージを送ること､ 後者はそれを受けることです｡

19
00:01:12,650 --> 00:01:19,400
‫この講義では､ プレイヤーへのダメージの送信と､ それに関わる関数コールを扱います｡

20
00:01:19,820 --> 00:01:30,890
‫これから見ていくのは､ アクタードットHで､ take damageという関数呼び出しを探すのがメインです｡

21
00:01:31,340 --> 00:01:34,370
‫そして､ ここに仮想関数があるのがおわかりいただけると思います｡

22
00:01:34,370 --> 00:01:35,960
‫floatを返します｡

23
00:01:35,960 --> 00:01:41,870
‫返ってくるのは､ 実際に俳優に加えられたダメージ､ 本当に加えられた実際の量です｡

24
00:01:42,500 --> 00:01:50,810
‫そして､ そこに入るのが損害額､ 損害額イベントであり､ その詳細な情報を得ることができるのです｡

25
00:01:50,810 --> 00:01:54,590
‫起きた被害は､ 扇動者がいるんです｡

26
00:01:54,590 --> 00:01:58,730
‫それはつまり､ この被害をもたらしたコントローラーは誰だったのか､ ということですね｡

27
00:01:59,000 --> 00:02:03,770
‫そして､ 損害の原因者､ つまり､ 行為者は何の責任を負っていたのか､ ということです｡

28
00:02:03,770 --> 00:02:06,380
‫だからこの場合､ 銃かもしれない｡

29
00:02:06,380 --> 00:02:15,830
‫それとも､ 爆発した弾丸､ この場合は着弾した岩石､ 撃った銃が､ 責任を負うべき行為者になると言っているのでしょうか｡

30
00:02:15,920 --> 00:02:18,920
‫それがテイクダメージというわけです｡

31
00:02:18,950 --> 00:02:25,250
‫このダメージイベントの構造体を除けば､ ほとんどは簡単に組み立てることができるはずです｡

32
00:02:25,250 --> 00:02:26,510
‫しかも､ それがちょっと複雑なんです｡

33
00:02:26,510 --> 00:02:32,120
‫では､ このダメージイベントの構造を見て､ 何ができるのかを見てみましょう｡

34
00:02:32,150 --> 00:02:34,160
‫どのような構成になるのでしょうか？

35
00:02:34,160 --> 00:02:36,020
‫これをどうまとめるか？

36
00:02:36,020 --> 00:02:42,350
‫さて､ すぐにはわからないのですが､ このダメージイベントには､ 実は2つのサブタイプがあります｡

37
00:02:42,350 --> 00:02:47,360
‫実際には､ EFダメージイベントを作るのではなく､ EFポイントダメージイベントを作ったり､

38
00:02:47,360 --> 00:02:54,410
‫EFラジアルダメージイベントを作ったりすることになると思います｡

39
00:02:54,410 --> 00:02:58,310
‫Unrealに存在する主なダメージの種類はこの2つです｡

40
00:02:58,310 --> 00:03:03,500
‫自分のカスタム用にもっと違うタイプのダメージを作ることもできます｡ 例えば､ 火事のダメージと別のパラメータを持つこともできますが､

41
00:03:03,500 --> 00:03:11,990
‫その場合､ EF放射状のラジアルダメージとポイントダメージに興味がありますね｡

42
00:03:11,990 --> 00:03:18,380
‫半径方向は､ 手榴弾が爆発するような場合､ 半径はどのくらいか､ 落下地点はどこか､

43
00:03:18,380 --> 00:03:21,020
‫といった具合です｡

44
00:03:21,020 --> 00:03:28,310
‫ポイントダメージは､ 銃のようなものに適しているように聞こえますが､ そのようなものばかりです｡

45
00:03:28,400 --> 00:03:40,280
‫EFポイント・ダメージ・イベントを作成し､ そのコンストラクタを探します｡

46
00:03:40,310 --> 00:03:41,720
‫またダメージ量を取っている｡

47
00:03:41,720 --> 00:03:43,400
‫そこで､ ちょっと繰り返しになりますが｡

48
00:03:43,610 --> 00:03:48,620
‫このポイントダメージが発生する原因となったヒット結果が出ているのです｡

49
00:03:48,860 --> 00:03:51,380
‫それから､ インショットの演出をしてもらっています｡

50
00:03:51,380 --> 00:03:51,680
‫素晴らしい｡

51
00:03:51,680 --> 00:03:52,880
‫それはもう計算済みです｡

52
00:03:52,880 --> 00:03:59,540
‫前回の講義でやったときに､ ちょっと先のことを考えていたんですが､ このダメージタイプのサブクラス｡

53
00:03:59,540 --> 00:04:09,500
‫これは､ より多くの情報を渡すために使用することができます｡

54
00:04:09,500 --> 00:04:16,220
‫だから､ その場合､ ダメージタイプのようなものは必要ないので､ ファイヤータイプなどを用意してもいいかもしれませんね｡

55
00:04:16,220 --> 00:04:21,080
‫火属性ダメージとか､ あの毒属性ダメージみたいな余計なことはしないんだ｡

56
00:04:21,080 --> 00:04:25,310
‫そこで､ 代わりにヌルポインタを渡します｡

57
00:04:25,310 --> 00:04:32,330
‫では､ この中から一つを選んで組み立て､ そのダメージを受けるイベントを呼び出すことにしましょう｡

58
00:04:32,990 --> 00:04:41,510
‫そこでまず､ 型を貼り付けて､ ダメージイベントと呼ぶことにして､ それを構築します｡

59
00:04:41,510 --> 00:04:45,860
‫で､ まずダメージ量なんですが､ まあ､ 銃の方はまだないんですよ｡

60
00:04:45,860 --> 00:04:48,140
‫どれくらいのダメージがあるかはわからない｡

61
00:04:48,140 --> 00:04:51,050
‫そこで､ 先にいくつかの情報を作成しておきます｡

62
00:04:51,050 --> 00:04:52,730
‫もう､ 最大射程距離があるんですよ｡

63
00:04:52,730 --> 00:04:54,740
‫ここにもう少し物件を増やしてほしい｡

64
00:04:54,770 --> 00:05:00,440
‫どこでも編集で､ フロートダメージと言えるようになりそうです｡

65
00:05:00,440 --> 00:05:01,400
‫どれだけのダメージを与えるか？

66
00:05:01,400 --> 00:05:05,750
‫10のダメージを与えて､ これをC++の上で使えるようにするんです｡

67
00:05:05,750 --> 00:05:09,320
‫そこで､ 最初の引数として渡すのがdamageです｡

68
00:05:09,440 --> 00:05:11,510
‫2枚目はそのヒット結果ですか？

69
00:05:11,510 --> 00:05:13,670
‫まあ､ 幸いなことに､ ヒットというヒット実績がありますからね｡

70
00:05:14,470 --> 00:05:23,290
‫次に､ 撮影方向ですが､ これはすでにエミッターの位置で計算済みです｡

71
00:05:24,060 --> 00:05:29,730
‫次にサブクラスを見ますが､ これは単なるヌルポインターになりそうです｡

72
00:05:30,230 --> 00:05:31,800
‫さて､ これで完成です｡

73
00:05:31,800 --> 00:05:36,060
‫次は､ ダメージを与えようとしている俳優を手に入れるだけです｡

74
00:05:36,060 --> 00:05:38,620
‫それは､ あなたのやっているヒットからすると､ かなりわかりやすいですね｡

75
00:05:38,670 --> 00:05:41,610
‫ヒットドットゲットアクターはこちら

76
00:05:42,090 --> 00:05:48,630
‫なぜなら､ ダメージを与えようとするアクターがNULLのままでは､

77
00:05:48,630 --> 00:05:52,620
‫クラッシュしてしまうからです｡

78
00:05:53,100 --> 00:05:58,800
‫つまり､ アクターがNULLであるかどうかをチェックするテイクダメージ関数を呼び出すことが課題になります｡

79
00:05:58,830 --> 00:06:04,690
‫まず､ Nullのアクターはいらないので､ take damageを呼んで､ コンパイルできるかどうかを確認します｡

80
00:06:04,710 --> 00:06:06,360
‫ビデオを一時停止して､ 試してみてください｡

81
00:06:08,480 --> 00:06:08,720
‫なるほど｡

82
00:06:08,720 --> 00:06:09,470
‫お帰りなさい｡

83
00:06:09,620 --> 00:06:12,260
‫そこで､ ゲスト俳優をお招きしました｡

84
00:06:12,300 --> 00:06:15,710
‫私はこれを......小さな変数と呼ぶことにします｡

85
00:06:15,710 --> 00:06:23,960
‫アクターポインターがヒットアクターとなり､ ここでif文を実行して､

86
00:06:23,960 --> 00:06:37,970
‫ヒットアクターがヌルポインターと等しくない場合､ このヒットアクターにダメージを与える関数を呼び出します｡

87
00:06:38,390 --> 00:06:43,040
‫そして､ ここにある損害額をやるのが第一引数です｡

88
00:06:43,040 --> 00:06:44,630
‫2つ目は何だったのでしょうか？

89
00:06:44,630 --> 00:06:49,250
‫テイクダメージにナビゲートして､ ちょっと見てみる｡

90
00:06:49,250 --> 00:06:54,650
‫では次に､ 今回の被害イベントをまとめた構造についてです｡

91
00:06:54,650 --> 00:06:56,660
‫ちょっと入れてみましょうか｡

92
00:06:56,660 --> 00:07:00,800
‫次に､ これを作成したコントローラを見てみましょう｡

93
00:07:00,800 --> 00:07:02,450
‫まあ､ それがうちのコントローラーなんですけどね｡

94
00:07:02,450 --> 00:07:05,210
‫ダメージを与えるのは､ 銃のコントローラーです｡

95
00:07:05,210 --> 00:07:11,210
‫そして､ この「扇動者」は､ 「ダメージを受ける」の最後のパラメータです｡

96
00:07:11,210 --> 00:07:19,010
‫また､ この構造体は､ if actor not equal to null pointer

97
00:07:19,010 --> 00:07:23,750
‫の内部でのみ構築する必要があると思われます｡

98
00:07:24,410 --> 00:07:28,760
‫それでは､ コンパイルして､ これがうまくいくかどうか見てみましょう｡

99
00:07:28,760 --> 00:07:30,290
‫それで､ ログにエラーが出たんです｡

100
00:07:30,290 --> 00:07:31,880
‫見てみよう｡

101
00:07:31,880 --> 00:07:33,680
‫あ､ セミコロンが足りませんね｡

102
00:07:33,680 --> 00:07:34,820
‫まあ､ 簡単なことです｡

103
00:07:34,820 --> 00:07:37,040
‫俳優を手に入れた後に修正するもの｡

104
00:07:37,040 --> 00:07:38,330
‫もう一度､ 挑戦してみよう｡

105
00:07:38,870 --> 00:07:39,320
‫かっこいい｡

106
00:07:39,320 --> 00:07:46,760
‫すべて正常にコンパイルされたので､ このままプレイして､ 撮影がヌルエラーを出したり､

107
00:07:46,760 --> 00:07:52,220
‫エンジンをクラッシュさせたりしないかどうか確認できます｡

108
00:07:52,250 --> 00:07:53,900
‫大丈夫そうだな｡

109
00:07:53,990 --> 00:08:02,810
‫では､ 次の講義では､ レベルに配置したこのアクターにダメージを与えてみることにしましょう｡

110
00:08:02,810 --> 00:08:03,560
‫では､ そこのあなた｡

