﻿1
00:00:03,980 --> 00:00:05,900
‫こんにちは､ お帰りなさい｡

2
00:00:05,930 --> 00:00:10,610
‫これで､ 移動はもちろん､ 砲塔を回転させることもできる戦車が完成しました｡

3
00:00:10,610 --> 00:00:18,830
‫そして､ タンクから継承した機能の一部をベースポッドクラスから継承したタワークラスを作成する準備が整いました｡

4
00:00:19,100 --> 00:00:26,000
‫さて､ 塔のクラスを作成したら､ 砲塔も回転できるようにtick関数をオーバーライドしてみましょう｡

5
00:00:26,030 --> 00:00:32,080
‫そこで､ 砲塔を回転させて､ 常に戦車を見るようにすることが目標です｡

6
00:00:32,090 --> 00:00:39,020
‫こうすれば､ 相手が弾を撃ち始めても､ 戦車が素早く移動していない限り､ たまに当たるようになります｡

7
00:00:39,630 --> 00:00:43,740
‫そして､ どうすればタンクを手に入れられるかも考えよう --｡

8
00:00:43,770 --> 00:00:49,380
‫そうすれば､ 戦車をターゲットにして､ 塔の砲塔を戦車のほうに回転させることができる--｡

9
00:00:49,410 --> 00:00:52,350
‫投擲戦闘の準備中です｡

10
00:00:52,650 --> 00:00:59,910
‫そこで､ エディターで tune tanks フォルダに移動し､ ベースとなる -- タンククラスがある場所に移動してみます｡

11
00:01:00,270 --> 00:01:04,650
‫さて､ ベースとなる -- クラスをもとに､ タワークラスを作りたいと思います｡

12
00:01:04,770 --> 00:01:07,850
‫さて､ 戦車クラスでのやり方は､ 私たちの言うとおりでした｡

13
00:01:07,860 --> 00:01:14,430
‫base -- をクリックし､ create C++ class derived from based upon を選択しました｡ 別の方法としては､

14
00:01:14,430 --> 00:01:18,210
‫tools から new C++ class を選択します｡

15
00:01:18,540 --> 00:01:24,630
‫そしてここから､ すべてのクラスというタブをクリックし､ ベース--を検索します｡

16
00:01:24,750 --> 00:01:27,270
‫そして､ ここにベースとなるクラスがあります｡

17
00:01:27,480 --> 00:01:33,050
‫これを選択して次へをクリックすると､ 今度はbase --を元にした新しいクラスが作成されます｡

18
00:01:33,060 --> 00:01:38,910
‫他のC++クラスと同じパスに置いて､ これをtowerと呼ぶことにする｡

19
00:01:39,210 --> 00:01:41,070
‫それでは､ 「クラスの作成」をクリックしてみましょう｡

20
00:01:41,610 --> 00:01:44,720
‫というわけで､ 新しいタワーエイジとタワードットをご紹介します｡

21
00:01:44,790 --> 00:01:53,520
‫CP さて､ まず必要なのはtick関数です｡ 塔は砲台を回転させて--に向かいたいからです｡

22
00:01:53,730 --> 00:01:56,640
‫そこで､ ここではtick関数をオーバーライドすることにします｡

23
00:01:56,640 --> 00:02:03,930
‫そこで､ 新しいパブリックセクションを作り､ デルタタイムというフロートを受け取るvirtual void tickをタイプし､

24
00:02:03,930 --> 00:02:07,560
‫これはオーバーライドすることにします｡

25
00:02:07,560 --> 00:02:18,600
‫virtualとoverrideについては今後のビデオで詳しく説明しますが､ 基本的には継承されたtick関数の新しい実装を作成することになります｡

26
00:02:18,600 --> 00:02:23,520
‫では､ この tick 機能を､ ここ Tower CP で実装してみましょう｡

27
00:02:23,550 --> 00:02:29,370
‫ここで､ tick関数名の前にタワーとダブルコロンが必要です｡

28
00:02:29,370 --> 00:02:34,950
‫そして､ いつものようにスーパーダニを呼んで､ デルタタイムでパスする必要があるのです｡

29
00:02:34,950 --> 00:02:42,390
‫さて､ ここでやりたいことは､ 戦車の砲塔を回転させ､ 塔が戦車を威嚇し､ 弾丸を発射できるようにすることです｡

30
00:02:42,390 --> 00:02:45,870
‫でも､ 戦車が範囲内にいるときだけ､ これをやりたいんです｡

31
00:02:46,170 --> 00:02:53,750
‫さて､ 戦車の射程内かどうかを知るには､ 砲塔から戦車までの距離を知る必要があります｡

32
00:02:53,760 --> 00:02:57,510
‫さて､ ここに世界の原点を表す小さなギズモがあります｡

33
00:02:57,510 --> 00:03:01,470
‫つまり､ X､ Y､ Zがゼロとなる空間上の点である｡

34
00:03:01,470 --> 00:03:08,970
‫さて､ アクターの位置といえば､ 原点からその位置までのベクトルのことです｡

35
00:03:08,970 --> 00:03:17,430
‫アクターの位置を取得することで､ タワーの位置とタンクの位置を取得することができます｡

36
00:03:17,430 --> 00:03:21,930
‫そして､ その2つの位置が分かれば､ その間の距離を計算することができる｡

37
00:03:21,930 --> 00:03:28,470
‫さて､ これをベクトル数学で行うこともできますが､ Fベクトルクラスにはdistという関数があり､

38
00:03:28,470 --> 00:03:33,810
‫この関数は位置ベクトルを受け取り､ それらの間の距離を返します｡

39
00:03:33,810 --> 00:03:41,940
‫そこで､ このtower CPファイルのtick関数の中に､ 何をすべきかわかるように､ いくつかの注意事項を書いておきます｡

40
00:03:41,940 --> 00:03:58,170
‫まず､ 戦車との距離を測り､ 戦車との距離を確認し､ 範囲内であれば戦車に向かって砲塔を回転させます｡

41
00:03:59,070 --> 00:04:00,960
‫というわけで､ ここでいくつか注意点があります｡

42
00:04:01,140 --> 00:04:05,820
‫さて､ 水槽までの距離を求めるには､ 水槽を手に入れる必要があります｡

43
00:04:05,850 --> 00:04:08,640
‫さて､ そんな時におすすめなのが「Begin Play」です｡

44
00:04:08,640 --> 00:04:13,350
‫そこで､ tick関数に加え､ Begin Playをオーバーライドして行きましょう｡

45
00:04:13,380 --> 00:04:17,580
‫さて､ Hタンクでは､ ビギンプレイがプロテクトされたセクションにあることに注目してください｡

46
00:04:17,580 --> 00:04:21,210
‫タワー内でもしっかり保護します｡

47
00:04:21,210 --> 00:04:28,380
‫そこで､ publicのすぐ下にprotectedセクションを配置し､ tickのすぐ下でbegin playを実装することにします｡

48
00:04:28,380 --> 00:04:35,580
‫それでは､ Tower Dot､ CP､ implement､ begin playで､ 関数名を完全に修飾してみましょう｡ ご推察の通り､

49
00:04:35,580 --> 00:04:38,670
‫Super Begin Playとします｡

50
00:04:38,790 --> 00:04:44,310
‫さて､ タンクを取得して変数に格納するためには､ tank型の変数が必要です｡

51
00:04:44,310 --> 00:04:49,200
‫そこで､ それをこのタワーズHのプライベートセクションに配置することにしました｡

52
00:04:49,200 --> 00:04:55,290
‫これはAタンクになります｡ これはポインターで､ 単純にこのタンクを呼べばいいのです｡

53
00:04:55,290 --> 00:05:03,000
‫そして､ ここでHタンクを入れる必要がないように､ その重要性を確認したことを前倒しで宣言することができるのです｡

54
00:05:03,360 --> 00:05:09,540
‫これで､ このタンクポインタができました｡ タンクにアクセスする方法がわかれば､ このタンクポインタに格納し､

55
00:05:09,540 --> 00:05:11,970
‫再生を開始できます｡

56
00:05:12,000 --> 00:05:18,510
‫まず､ Tank Hをインクルードすることで､ 実際にその型を使うことができるようになりますね｡

57
00:05:18,510 --> 00:05:20,580
‫では､ どのようにタンクにアクセスするのか｡

58
00:05:20,580 --> 00:05:26,220
‫さて､ アンリアルエンジンのドキュメントに､ get player pawnという便利な関数が紹介されています｡

59
00:05:26,310 --> 00:05:29,100
‫ゲームプレイのスタティックに存在する｡

60
00:05:29,160 --> 00:05:35,910
‫せっかくなので､ ゲームプレイ静止画のインクルードをコピーして､ 構文を見てみましょう｡

61
00:05:35,910 --> 00:05:39,060
‫ワールドコンテキストオブジェクトの2つの入力があります｡

62
00:05:39,470 --> 00:05:42,950
‫その対処法も､ プレイヤーインデックスもすでに知っています｡

63
00:05:42,950 --> 00:05:49,310
‫そして､ 今回のような一人用のゲームでは､ プレイヤーインデックスは常にプレイヤー0となり､

64
00:05:49,310 --> 00:05:53,660
‫プレイヤー0に対応するポーンにアクセスすることができます｡

65
00:05:54,050 --> 00:05:57,650
‫そこで､ この関数をTower Dot CPで呼び出してみましょう｡

66
00:05:57,680 --> 00:06:04,850
‫ゲームプレイ統計のincludeを貼り付けて､ begin playでtankをゲームプレイ統計のget

67
00:06:04,850 --> 00:06:12,290
‫playerと同じにします -- world contextオブジェクトに｡

68
00:06:12,290 --> 00:06:17,910
‫これを渡すと､ プレーヤー・インデックスにはゼロを渡すことができます｡

69
00:06:17,930 --> 00:06:19,970
‫今度は､ 赤いスクイグリーをご覧ください｡

70
00:06:19,970 --> 00:06:26,120
‫タイプAのポーンの値をタイプAのタンクに割り当てることはできないと書かれています｡

71
00:06:26,150 --> 00:06:35,810
‫これは､ Aプレイヤーコントローラを呼び出し､ コントローラを取得し､ その結果をAプレイヤーコントローラに格納しようとしたときに遭遇した問題とまったく同じです｡

72
00:06:35,870 --> 00:06:42,200
‫戦車はポーンの子なので､ 子ポインタに親型を格納することはできないのです｡

73
00:06:42,200 --> 00:06:43,370
‫そうしなければならないのです｡

74
00:06:44,150 --> 00:06:46,060
‫ご想像のとおり､ キャスティングをしなければならない｡

75
00:06:46,070 --> 00:06:51,830
‫そこで､ ここから返された値をキャスト関数呼び出しの中に入れることにします｡

76
00:06:51,830 --> 00:06:56,000
‫そこで､ キャストと言って､ タンクにキャストしています｡

77
00:06:56,000 --> 00:07:02,300
‫そして､ キャストに渡すのは､ この「プレイヤーズポンドを手に入れよう」という呼びかけになるのです｡

78
00:07:02,300 --> 00:07:04,850
‫そこで､ それをそのまま括弧の中に入れてしまいましょう｡

79
00:07:04,850 --> 00:07:09,260
‫そして､ キャストの後は水槽にアクセスできるようになります｡

80
00:07:09,380 --> 00:07:16,310
‫そこで､ 水槽にアクセスできるようになったので､ 水槽までの距離を求めると､ 距離とは浮き輪のことである｡

81
00:07:16,310 --> 00:07:20,240
‫そこで､ distanceというローカルなfloat変数を作ることができます｡

82
00:07:20,600 --> 00:07:27,380
‫そして､ これに等しい値を設定するのは､ Fベクトルの静的関数distを呼び出した結果です｡

83
00:07:27,410 --> 00:07:31,700
‫さて､ distはFベクトル型の2つの入力パラメータを受け取ります｡

84
00:07:31,880 --> 00:07:34,850
‫ここで､ 空間上の2点間の距離を求める｡

85
00:07:34,850 --> 00:07:37,010
‫1つはタワーの位置です｡

86
00:07:37,010 --> 00:07:43,190
‫タワークラスなので､ get actor locationを呼び出すと､ タワーの位置がわかります｡

87
00:07:43,190 --> 00:07:44,660
‫しかし､ タンクはどうでしょう？

88
00:07:44,660 --> 00:07:50,870
‫戦車に電話して､ 俳優の位置情報を入手し､ その距離を知ることができます｡

89
00:07:50,870 --> 00:07:57,110
‫さて､ 唯一の問題は､ タンクポインタがヌルでないことを最初に確認することなく使用していることです｡

90
00:07:57,290 --> 00:08:06,860
‫そこで､ まずifタンクと言い､ 次にこの関数呼び出しをif文の中にドラッグするのです｡

91
00:08:06,860 --> 00:08:13,190
‫したがって､ タンクが有効であれば､ get actor locationでその位置にアクセスすることができる｡

92
00:08:13,190 --> 00:08:14,030
‫素晴らしい｡

93
00:08:14,030 --> 00:08:19,130
‫このif文の中で作業しているので､ 他のコメントをその中に移動させます｡

94
00:08:19,130 --> 00:08:24,410
‫タンクが有効な範囲にあるかどうかを確認することはできません｡

95
00:08:24,590 --> 00:08:28,790
‫そこで､ 砲塔を戦車のほうに回転させることに挑戦してみたいと思います｡

96
00:08:28,790 --> 00:08:33,020
‫さて､ 戦車が射程距離にある場合のみ､ この処理を行いたいのですが､ 距離はわかっています｡

97
00:08:33,020 --> 00:08:35,240
‫そこで今度は､ 火気範囲の変数が必要です｡

98
00:08:35,240 --> 00:08:40,490
‫そこで､ towerクラスでfire rangeというfloatを作成し､ これをプロパティで公開します｡

99
00:08:40,490 --> 00:08:42,980
‫これをエディターから編集できるようにしたい｡

100
00:08:43,010 --> 00:08:45,890
‫今度は､ タンクが範囲内にあるかどうかを確認するのです｡

101
00:08:45,890 --> 00:08:50,630
‫タレットを回転させ､ タレットを回転させるということは､ ターゲットを見る必要があります｡

102
00:08:50,630 --> 00:08:53,180
‫戦車の位置でパスするんですね｡

103
00:08:53,180 --> 00:08:56,660
‫だから､ ビデオを一時停止して､ 今すぐこの動作を実装してください｡

104
00:09:00,030 --> 00:09:00,420
‫なるほど｡

105
00:09:00,420 --> 00:09:02,370
‫そこで､ 火力範囲の変数が必要です｡

106
00:09:02,370 --> 00:09:05,940
‫そこで､ ここTower Hでは､ プライベートセクションを設けています｡

107
00:09:05,940 --> 00:09:07,680
‫フロートを作るんです｡

108
00:09:08,340 --> 00:09:16,650
‫ここでは火力発電と呼び､ 例えば300Fという値で初期化します｡

109
00:09:16,650 --> 00:09:21,030
‫でも､ あなたの物件になるのだから､ 実験してみよう｡

110
00:09:21,240 --> 00:09:22,860
‫つまり､ あなたの財産です｡

111
00:09:22,860 --> 00:09:29,910
‫そして､ 全ての戦車に同じ射程を持たせたいので､ これとデフォルトのみとします｡

112
00:09:29,910 --> 00:09:33,270
‫そうすれば､ デフォルトのブループリント上でのみ編集が可能になります｡

113
00:09:33,300 --> 00:09:38,940
‫もし､ どこでも編集できるようにしたり､ インスタンスのみ編集できるようにしたりしても､ まったく問題ありません｡

114
00:09:38,940 --> 00:09:42,090
‫本当に好みの問題で､ 後から変更することも可能です｡

115
00:09:42,090 --> 00:09:46,710
‫これもカテゴリーを与えて､ このカテゴリーを戦闘と呼ぶことにします｡

116
00:09:46,740 --> 00:09:50,820
‫タワーCPに入りましょう､ ここで次のポイントがあります｡

117
00:09:50,820 --> 00:09:59,160
‫戦車が射程内にあるかどうか､ つまり距離が射程以下かどうかを確認する必要がある｡

118
00:09:59,160 --> 00:10:04,860
‫フレームごとに､ あるフレームでは射程距離より大きく､ 次のフレームでは射程距離より小さくなることがあるため､

119
00:10:04,860 --> 00:10:11,970
‫単に等しいだけでなく､ 等しいかより小さくしています｡

120
00:10:11,970 --> 00:10:15,870
‫だから､ 実は射程距離と全く同じになることはないかもしれません｡

121
00:10:15,870 --> 00:10:20,820
‫実際､ 浮動小数点数では､ 2つの浮動小数点が完全に等しいことは非常に稀です｡

122
00:10:20,820 --> 00:10:27,630
‫そこで､ このifチェックで内側に入ったら､ 距離が射程距離以下であることを意味します｡

123
00:10:27,630 --> 00:10:33,120
‫戦車は射程距離に入ったので､ このコメントはその場で動かせるということです｡

124
00:10:33,960 --> 00:10:42,180
‫さて､ 範囲内であれば､ 砲塔を戦車の方に回転させる､ つまり､ 砲塔の回転関数を呼び出すことになります｡

125
00:10:42,390 --> 00:10:45,690
‫これがベースポッドに入れたプロテクト関数です｡

126
00:10:45,720 --> 00:10:51,060
‫今度は回転砲塔が目標物を見るので､ 戦車の位置が必要です｡

127
00:10:51,060 --> 00:10:55,410
‫それがタンクゲット・アクター・ロケーションになるわけです｡

128
00:10:55,410 --> 00:11:02,010
‫それに伴い､ 戦車が範囲内にいる場合のみ､ 砲塔を回転させるようにしました｡

129
00:11:02,010 --> 00:11:05,040
‫では､ これをコンパイルして､ どのように動作するのか見てみましょう｡

130
00:11:05,340 --> 00:11:15,120
‫エディタに戻り､ 設計図､ ポーン､ BPポーンのタレットを探し､ 設計図エディタ全体を開きます｡

131
00:11:15,120 --> 00:11:22,170
‫右上に親クラスのベースポーンがありますが､ 親クラスをタワーにしたいので､

132
00:11:22,170 --> 00:11:27,930
‫クラス設定､ 親クラス､ タワーを検索して選択します｡

133
00:11:27,960 --> 00:11:31,980
‫さて､ 私たちのポーン砲台は､ タワークラスをベースにしています｡

134
00:11:31,980 --> 00:11:34,710
‫では､ 再生ボタンを押すとどうなるか見てみましょう｡

135
00:11:35,070 --> 00:11:37,200
‫さて､ それではタンクを動かしてみます｡

136
00:11:37,200 --> 00:11:40,560
‫射程圏外なので､ 塔の動きは見えません｡

137
00:11:40,560 --> 00:11:44,100
‫でも､ もし私が射程距離に入ったら､ 見てください｡

138
00:11:44,100 --> 00:11:47,970
‫今､ 彼らは私の後をついてきて､ かなり脅威を感じているようです｡

139
00:11:48,120 --> 00:11:52,080
‫これで300台はそう遠くない｡

140
00:11:52,080 --> 00:11:55,440
‫そこで､ 私がやりたいのは､ その距離を編集することです｡

141
00:11:55,440 --> 00:12:00,840
‫だから､ ここからBP Pawn Turretで､ BP Pond Turret selfを選択するんだ｡

142
00:12:00,840 --> 00:12:02,850
‫そして､ こちらが戦闘編です｡

143
00:12:02,850 --> 00:12:06,840
‫これを700くらいに設定してきます｡

144
00:12:07,890 --> 00:12:13,350
‫今､ 再生ボタンを押すと､ ここに戻って移動している間は回転しないことがわかります｡

145
00:12:13,350 --> 00:12:16,410
‫しかし､ 私が射程距離に入ると､ 今度は彼らが私を見るようになるのです｡

146
00:12:18,180 --> 00:12:19,020
‫完璧です｡

147
00:12:20,030 --> 00:12:23,120
‫というわけで､ まとめると､ towerクラスが出来上がりました｡

148
00:12:23,120 --> 00:12:25,720
‫これで戦車の敵ができました｡

149
00:12:25,730 --> 00:12:33,770
‫また､ ティック機能でタワーの砲塔を戦車側に回転させ､ 戦車が射撃範囲内にいるときだけそうするようにしています｡

150
00:12:33,770 --> 00:12:39,650
‫また､ 火力範囲の変数を公開し､ 設計図で調整できるようにしました｡

151
00:12:39,770 --> 00:12:41,600
‫戦闘態勢はほぼ整った｡

152
00:12:41,630 --> 00:12:44,450
‫これからの動画で､ その設定を始めていきます｡

153
00:12:44,630 --> 00:12:45,620
‫また､ お会いしましょう｡

