﻿1
00:00:04,260 --> 00:00:05,890
‫こんにちは､ お帰りなさい｡

2
00:00:05,910 --> 00:00:11,130
‫さて､ 投射物クラスはすでに作成されているので､ レベル内で投射物を生成し､

3
00:00:11,130 --> 00:00:15,660
‫塔に向けて発射し､ 最終的に塔を破壊する準備が整いました｡

4
00:00:15,660 --> 00:00:19,950
‫さて､ アクターの生成には､ アクターのスポーン関数が必要です｡

5
00:00:19,950 --> 00:00:22,470
‫そこで､ このビデオでは､ その仕組みを学びます｡

6
00:00:22,470 --> 00:00:25,290
‫では､ 投射物のスポーンについて説明します｡

7
00:00:25,320 --> 00:00:29,130
‫これは､ C++側からやってみたいことです｡

8
00:00:29,130 --> 00:00:34,590
‫C++の関数を呼び出して､ 世界に新しいオブジェクトを動的に生成するのです｡

9
00:00:34,590 --> 00:00:43,110
‫今は C++ 側からスポーンしていますが､ projectile クラスのブループリントに基づいたオブジェクトをスポーンしたいと思います｡

10
00:00:43,110 --> 00:00:51,030
‫A Projectile C++ クラスをベースにした設計図があり､ その中に追加情報が含まれているからです｡

11
00:00:51,030 --> 00:00:54,270
‫具体的には､ そのメッシュのプロパティが設定されています｡

12
00:00:54,270 --> 00:00:57,780
‫静止画のメッシュ部品には､ このメッシュを選びました｡

13
00:00:57,780 --> 00:01:00,510
‫だから､ C++版を産み出すわけにはいかない｡

14
00:01:00,510 --> 00:01:04,590
‫そのメッシュを得るために､ ブループリント版をスポーンする必要があるのです｡

15
00:01:04,590 --> 00:01:10,650
‫そこで問題は､ C++で､ 設計図に基づいたオブジェクトをどのように生成するかです｡

16
00:01:10,650 --> 00:01:15,810
‫さて､ これからPT Subclassというものを学びますが､ これはテンプレートです｡

17
00:01:15,810 --> 00:01:20,730
‫また､ 多くのテンプレートと同様に､ 角括弧は型が必要になります｡

18
00:01:20,730 --> 00:01:24,480
‫そのため､ PTのサブクラスを使用するには､ 型パラメータが必要です｡

19
00:01:24,480 --> 00:01:29,790
‫そして､ これによってUクラスと呼ばれるものを格納する変数を持つことができるのです｡

20
00:01:29,790 --> 00:01:37,350
‫U クラスはクラスタイプを表しますが､ アンリアル エンジンのリフレクション システムと相互作用する機能も持っています｡

21
00:01:37,350 --> 00:01:43,290
‫リフレクションというのは､ C++側とブループリント側で情報をやりとりすることです｡

22
00:01:43,320 --> 00:01:54,870
‫のPTサブクラスは､ その名の通り､ 渡す型に基づいたクラスを表す変数や､ この選んだ型のサブクラスを格納することができる｡

23
00:01:54,870 --> 00:02:02,880
‫つまり､ ある型を選び､ その型やその型から派生した型を表すuクラスを保持することができるtサブクラスを選ぶことができるのです｡

24
00:02:02,880 --> 00:02:06,360
‫そして､ これにはタイプに応じた設計図が含まれます｡

25
00:02:06,360 --> 00:02:09,090
‫では､ このtのサブクラスとやらがどのように機能するのか見てみましょう｡

26
00:02:09,090 --> 00:02:09,380
‫なるほど｡

27
00:02:09,390 --> 00:02:17,880
‫ベースポッドに戻ったのは､ この弾丸をタンクとタワーの両方のクラスに配置したいからです｡

28
00:02:17,880 --> 00:02:20,910
‫そのどちらのクラスも投射物を産み出すことになる｡

29
00:02:20,910 --> 00:02:23,700
‫だから､ ここにtサブクラスの変数が欲しい｡

30
00:02:23,700 --> 00:02:30,930
‫そこで､ t sub class ofと言い､ 角括弧の中に型を渡す必要があります｡

31
00:02:30,930 --> 00:02:34,740
‫これで､ このように角括弧の中でも前方宣言ができるようになりました｡

32
00:02:34,740 --> 00:02:37,440
‫そして､ タイプを投射型にする｡

33
00:02:37,440 --> 00:02:42,690
‫そして､ その理由は､ projectileクラスを作り､ その型がprojectileであるからです｡

34
00:02:42,690 --> 00:02:47,940
‫そこで､ この変数を作成し､ projectile classと呼ぶことにします｡

35
00:02:47,940 --> 00:02:59,670
‫これで､ クラスタイプを表すC++変数を持つことができ､ タイプは投射物､ さらにはこれに基づくブループリントのクラスタイプに基づくことができます｡

36
00:02:59,670 --> 00:03:02,100
‫今度はU字型のプロパティを付与します｡

37
00:03:02,730 --> 00:03:09,060
‫そして､ 少なくともデフォルトのブループリントではこれを編集できるようにしたいので､ この編集をデフォルトにすることにします｡

38
00:03:09,060 --> 00:03:12,540
‫今だからこそ､ これにカテゴリーを与えることができるのです｡

39
00:03:13,530 --> 00:03:16,170
‫戦闘というカテゴリーに入れます｡

40
00:03:16,200 --> 00:03:18,240
‫では､ これをコンパイルしてみましょう｡

41
00:03:18,270 --> 00:03:24,330
‫さて､ エディタに戻って､ blueprints フォルダから Pons フォルダに移動してみます｡

42
00:03:24,330 --> 00:03:29,580
‫そして､ BP -- tankを開いて､ フルブループリントエディタを開きます｡

43
00:03:29,580 --> 00:03:32,910
‫さて､ 詳細パネルを見ると､ コンバットを探すことができます｡

44
00:03:32,910 --> 00:03:33,840
‫これです｡

45
00:03:33,840 --> 00:03:36,540
‫そして､ これがprojectileクラスの変数です｡

46
00:03:36,540 --> 00:03:40,410
‫これは､ 射影機クラスと呼ばれるもののサブクラスである｡

47
00:03:40,410 --> 00:03:44,250
‫ここで､ ドロップダウンを使って設定することができることに注意してください｡

48
00:03:44,250 --> 00:03:47,910
‫そして､ ドロップダウンをクリックすると､ 3つのオプションが表示されます｡

49
00:03:47,910 --> 00:03:53,340
‫デフォルトではnoneに設定されていますが､ これは基本的にnullポインターであることを意味します｡

50
00:03:53,340 --> 00:03:57,960
‫あるいは､ 投射型やBP投射型に設定することもできます｡

51
00:03:57,990 --> 00:04:08,880
‫このサブクラスでできることは､ この射影機クラスを射影機に基づいて特定のタイプに設定することです｡

52
00:04:08,880 --> 00:04:10,140
‫今度はここに投射します｡

53
00:04:10,140 --> 00:04:14,520
‫これは､ C++のprojectileというクラスです｡

54
00:04:14,520 --> 00:04:22,920
‫投射物ですが､ BP投射物はC++の投射物クラスをベースにしたブループリントで､ これを選択することができます｡

55
00:04:22,920 --> 00:04:27,870
‫そして､ projectile classはBP projectile typeに設定されました｡

56
00:04:27,870 --> 00:04:32,610
‫さて､ これはコンポーネントでもなければ､ BPプロジェクタイルオブジェクトでもない｡

57
00:04:32,610 --> 00:04:33,540
‫そういうことではないんです｡

58
00:04:33,540 --> 00:04:36,480
‫型､ より具体的にはUを格納する｡

59
00:04:36,480 --> 00:04:37,260
‫クラスタイプです｡

60
00:04:37,260 --> 00:04:45,390
‫そして､ 私が言ったように､ あなたのクラスには､ C++とブループリントの間でリフレクションが機能するような機能が組み込まれています｡

61
00:04:45,390 --> 00:04:48,690
‫C++と設計図の間で情報を流すことができる｡

62
00:04:48,690 --> 00:04:55,710
‫BP projectile blueprint typeに設定されたPTのサブクラスであるprojectile classを用意しました｡

63
00:04:55,710 --> 00:04:59,790
‫では､ なぜわざわざ変数のサブクラスを作る必要があるのでしょうか？

64
00:04:59,790 --> 00:05:03,750
‫さて､ アクターのスポーン機能の仕組みについて説明する必要があります｡

65
00:05:04,200 --> 00:05:08,400
‫スポーンアクターは､ 新しい世界観に属する機能です｡

66
00:05:08,400 --> 00:05:12,120
‫だから､ 世界を手に入れれば､ スポーンアクターを呼ぶことができるのです｡

67
00:05:12,120 --> 00:05:21,060
‫また､ Spawn actorもテンプレート機能の一つで､ デフォルトのサブオブジェクトを作成するのと同じように､ 新しいオブジェクトを作成するように設計されています｡

68
00:05:21,060 --> 00:05:28,260
‫しかし､ create default sub objectはコンポーネントを作成するために設計されており､ 特定のクラスのコンストラクタでしか使用できません

69
00:05:28,260 --> 00:05:36,360
‫spawn actorはゲーム実行中に呼び出すことができ､ アクターを作成することができます｡

70
00:05:36,360 --> 00:05:39,450
‫今はテンプレートなので､ 型が必要です｡

71
00:05:39,480 --> 00:05:45,780
‫投射物を生成したい場合は､ C++のクラスタイプに投射物を渡します｡

72
00:05:45,810 --> 00:05:52,590
‫これは､ C++のspawn actor関数から返されるC++クラスです｡

73
00:05:52,620 --> 00:05:57,060
‫ここで､ 括弧はUクラスを含むいくつかのパラメータを取ります｡

74
00:05:57,060 --> 00:06:02,190
‫現在､ この関数には､ 異なる入力パラメータを取る複数のオーバーロードが存在します｡

75
00:06:02,190 --> 00:06:07,590
‫最もシンプルなのは､ Uクラス､ Aロケーション､ ローテーションを取るバージョンでしょう｡

76
00:06:07,590 --> 00:06:08,010
‫ザ・ユー｡

77
00:06:08,010 --> 00:06:11,280
‫クラスは､ スポーンするタイプを表すものです｡

78
00:06:11,310 --> 00:06:16,020
‫これは､ 実際に生成されるオブジェクトのタイプです｡

79
00:06:16,050 --> 00:06:18,300
‫これは設計図クラスかもしれません｡

80
00:06:18,330 --> 00:06:25,890
‫location はオブジェクトを生成する場所を指定する F vector で､ rotation はその回転を指定する｡

81
00:06:25,890 --> 00:06:28,710
‫ですから､ 構文の例は次のようになります｡

82
00:06:28,710 --> 00:06:38,820
‫クラスタイプを指定してspawn actorを呼び出し､ そのuクラスの情報を位置ベクトルと回転ローテータとともに渡します｡

83
00:06:38,820 --> 00:06:41,160
‫では､ 少しクラスの話をしましょう｡

84
00:06:41,160 --> 00:06:44,970
‫さて､ これまで述べてきたように､ クラスはクラス型を表します｡

85
00:06:44,970 --> 00:06:53,550
‫Spawn actorを呼び出すときに､ Uクラスを渡して､ spawn actor関数にスポーンするオブジェクトに関する情報を提供します｡

86
00:06:53,910 --> 00:07:01,860
‫確かに､ 角括弧の中に型を渡しましたが､ これは単にSpawn actorに作成するC++の型を伝えるだけです｡

87
00:07:01,860 --> 00:07:04,890
‫youクラスがより多くの情報を含んでいるのに対して

88
00:07:04,890 --> 00:07:11,070
‫例えば､ 発射体をベースにしたブループリントを作成し､ ブループリント内で､ スタティックメッシュコンポーネントのスタティックメッシュを選択するなど､

89
00:07:11,070 --> 00:07:14,580
‫いくつかのプロパティを設定したとします｡

90
00:07:14,580 --> 00:07:22,860
‫ここで､ 単に生のC++クラスを生成する場合､ その静的メッシュは､ 新しく生成された投射物には設定されません｡

91
00:07:22,860 --> 00:07:26,250
‫本質的には､ 目に見えない新しいアクターを生み出すだけなのです｡

92
00:07:26,430 --> 00:07:30,780
‫しかし､ 新しいクラス変数は､ ブループリント・クラスを表すことができます｡

93
00:07:30,930 --> 00:07:38,730
‫御社のクラスでは､ C++側で､ ブループリント､ クラスタイプ､ スポーンを表す変数を持たせることができます｡

94
00:07:38,730 --> 00:07:48,060
‫アクターはそのクラスを入力引数として受け取り､ その新しいクラスで表されるブループリントに基づいて新しいオブジェクトを生成することができます｡

95
00:07:48,060 --> 00:07:58,560
‫つまり､ 新しい投射物には静的メッシュ プロパティが設定されます｡ これは､ 生の C++ クラスではなく､ ブループリントに基づいて新しいオブジェクトを生成しているためです｡

96
00:07:58,560 --> 00:08:05,190
‫このため､ 新しいクラスを格納できるサブクラスを作成し､ BP -- tank ブループリントから

97
00:08:05,190 --> 00:08:10,050
‫BP projectile と等しいものを設定することができました｡

98
00:08:10,050 --> 00:08:13,020
‫さて､ これでアクターのスポーン方法はわかりましたね｡

99
00:08:13,170 --> 00:08:16,020
‫スポーンアクターは､ 新しいワールドクラスに属しています｡

100
00:08:16,020 --> 00:08:22,320
‫つまり､ get worldを呼び出して､ 単純にSpawn actorを呼び出すと､

101
00:08:22,320 --> 00:08:30,750
‫この関数の入力要件は､ C++の型を角括弧で､ 位置と回転を括弧で渡します｡

102
00:08:30,750 --> 00:08:35,820
‫では､ 今回の課題である発射体の生成ですが､ これはfire関数で行います｡

103
00:08:35,820 --> 00:08:41,760
‫そこで､ get world spawn アクタを呼び出し､ 角括弧の中に投射物を渡します｡

104
00:08:41,760 --> 00:08:45,390
‫つまり､ projectile用のヘッダーファイルをインクルードする必要があるのです｡

105
00:08:45,390 --> 00:08:52,920
‫だからそれを忘れずに､ 新しい変数projectile classを括弧内のUクラスの入力パラメータとして使用します｡

106
00:08:52,920 --> 00:08:55,320
‫あとは､ 場所と回転です｡

107
00:08:55,320 --> 00:09:00,480
‫位置と回転の両方に投射物のスポーンポイントを使用することになります｡

108
00:09:00,480 --> 00:09:02,850
‫発射体スポーンポイントコンポーネントから｡

109
00:09:02,850 --> 00:09:09,000
‫これらの値にアクセスするには､ get component location と get component rotation を呼び出すことができます｡

110
00:09:09,000 --> 00:09:14,040
‫そこで､ ビデオを一時停止して､ 今すぐfire関数でspawn actorを呼び出します｡

111
00:09:16,920 --> 00:09:17,310
‫なるほど｡

112
00:09:17,310 --> 00:09:22,880
‫では､ fire関数が定義されているBase Pond CPに入りましょう｡

113
00:09:22,890 --> 00:09:25,230
‫ここでデバッグ球を描きます｡

114
00:09:25,230 --> 00:09:27,450
‫もう､ 本当に必要ないんです｡

115
00:09:27,450 --> 00:09:33,270
‫そこで､ この関数呼び出しを削除して､ 代わりにここでSpawnアクターを呼び出すことにします｡

116
00:09:33,270 --> 00:09:36,750
‫これで､ すでに投射物のスポーンポイントの位置が判明しました｡

117
00:09:37,050 --> 00:09:43,770
‫このローカル変数の名前を単純にlocationに変更し､ 新しいFローテーターを作成することにします｡

118
00:09:44,430 --> 00:09:45,810
‫ローテーションと呼ばれる

119
00:09:45,900 --> 00:09:50,010
‫そして､ これも同様に投射物のスポーンポイントから取得することにしています｡

120
00:09:50,010 --> 00:09:56,670
‫つまり､ 射的のスポーンポイントがコンポーネントの回転を取得することになります｡

121
00:09:56,670 --> 00:10:01,980
‫これで､ 投射物を発生させる場所と回転が決まりました｡

122
00:10:02,430 --> 00:10:07,050
‫次に､ アクターのスポーン（spawn）を呼び出して､ ワールドの取得を呼び出せるようにする必要があります｡

123
00:10:07,050 --> 00:10:11,910
‫そして､ この関数で得た世界から､ スポーンアクターを呼び出すことができます｡

124
00:10:12,240 --> 00:10:15,780
‫さて､ これには山括弧と括弧がありますね？

125
00:10:15,780 --> 00:10:19,740
‫だから､ 角括弧の中で､ 射影機を使う必要があるんです｡

126
00:10:21,240 --> 00:10:25,640
‫また､ 投射物を使用するので､ そのためのヘッダーを含める必要があります｡

127
00:10:25,650 --> 00:10:32,760
‫そこで､ ここでは､ デバッグヘルパーの描画を削除して､ projectileに置き換えます｡

128
00:10:34,740 --> 00:10:37,260
‫だから､ 今はそのタイプを搭載しています｡

129
00:10:37,260 --> 00:10:44,070
‫次にUクラスが必要ですが､ Hがprojectileクラスを持っていることから､ それをUクラスとして使用することができます｡

130
00:10:44,070 --> 00:10:47,050
‫そこで､ projectile クラスを渡すことにします｡

131
00:10:47,070 --> 00:10:54,750
‫さて､ 最後に位置と回転を渡すと､ これでアクターのスポーン機能を満たすことができます｡

132
00:10:54,750 --> 00:11:00,420
‫では､ これをコンパイルして､ エディタに戻り､ テストプレイをしてみましょう｡

133
00:11:00,420 --> 00:11:04,080
‫というわけで､ さっそくクリックして確認してみることにします｡

134
00:11:04,080 --> 00:11:06,750
‫新しい弾丸を産み落としました｡

135
00:11:06,750 --> 00:11:15,660
‫樽の先端に弾丸を発射しているのですが､ 空中に浮いているような感じで､ 見た目が悪いんです｡

136
00:11:15,660 --> 00:11:16,430
‫でも､ それでいいんです｡

137
00:11:16,440 --> 00:11:17,700
‫これがステップ1です｡

138
00:11:17,700 --> 00:11:23,580
‫まず､ 投射物を生成し､ 次のステップとして投射物のように動作させる必要があります｡

139
00:11:23,580 --> 00:11:27,120
‫つまり､ 要約すると､ 投射物を産み出すようになったということです｡

140
00:11:27,150 --> 00:11:29,060
‫これは大きな節目です｡

141
00:11:29,070 --> 00:11:32,250
‫しかし､ まだ投射物とは言えない｡

142
00:11:32,280 --> 00:11:36,060
‫ただそこに止まっているだけで､ 投射物は空中を飛ぶことになっている｡

143
00:11:36,210 --> 00:11:43,800
‫次のビデオでは､ 投射物を実際に空中を飛ばし､ 投射物のように動作させる方法について説明します｡

144
00:11:43,830 --> 00:11:44,700
‫また､ お会いしましょう｡

