﻿1
00:00:04,470 --> 00:00:06,110
‫こんにちは､ ようこそ｡

2
00:00:06,120 --> 00:00:10,980
‫この講義では､ 銃を作成し､ このゲームの銃をどのように設計していくか､

3
00:00:10,980 --> 00:00:18,360
‫スワップ可能で､ 異なるタイプの銃に異なるプロパティを持たせることができるかを学びます｡

4
00:00:18,360 --> 00:00:25,920
‫ファーストパーソンやサードパーティーのシューティングゲームでは､ 一般的にこのようなアーキテクチャが採用されています｡

5
00:00:27,060 --> 00:00:27,330
‫なるほど｡

6
00:00:27,330 --> 00:00:30,860
‫というわけで､ ちょっと久しぶりにプロジェクト計画を確認してみました｡

7
00:00:30,870 --> 00:00:33,310
‫プランに辿り着いた時には､ 必ずムーブメントが起きています｡

8
00:00:33,330 --> 00:00:39,420
‫アニメーションはとりあえず完成したので､ 次は撮影に集中します｡

9
00:00:39,600 --> 00:00:47,280
‫さて､ ここで少し混乱するのは､ このメッシュにはすでに銃があるように見えますが､ 実はこの銃は使いたくないということです｡

10
00:00:47,280 --> 00:00:49,280
‫違う使い方をしたい｡

11
00:00:49,680 --> 00:00:59,370
‫シューティングゲームの場合､ 武器を持ち替えたり､ キャラクターごとに武器を持ち替えたりしたいと思うことが多いからです｡

12
00:00:59,370 --> 00:01:05,850
‫そして､ 一番簡単な方法は､ 銃をキャラクターと別物にして､ どう撃つかに責任を持てるように､

13
00:01:05,850 --> 00:01:09,750
‫入れ替えられるようにアーキテクチャすることです｡

14
00:01:09,810 --> 00:01:15,000
‫ロケットランチャーならともかく､ ショットガンやライフルでは､ やり方が違う｡

15
00:01:15,420 --> 00:01:20,970
‫さて､ では銃のコンポーネントを作って､ その銃のコンポーネントをメッシュの下に貼り付ければいいじゃないかと言われるかもしれませんが､

16
00:01:20,970 --> 00:01:31,350
‫そうすると､ 銃に複数のコンポーネントを追加できるモジュール性が失われてしまうのです｡

17
00:01:31,350 --> 00:01:39,810
‫そこで､ 私たちが本当にやりたいことは､ シューターというキャラクターに対して､ 子供っぽい銃の役者を用意することです｡

18
00:01:39,810 --> 00:01:43,860
‫さて､ これは今までになかったことですが､ 次のような仕組みになっています｡

19
00:01:44,280 --> 00:01:53,070
‫シューターキャラクターとその子である銃を持つことができ､ シューターキャラクターは互いに子IDとなる複数のコンポーネントを持つことができます｡

20
00:01:53,070 --> 00:02:01,920
‫つまり､ カプセルがあり､ 現時点ではカプセルの子としてメッシュがあり､ 銃のコンポーネントはその子IDにすることができるのです｡

21
00:02:01,920 --> 00:02:05,940
‫そのため､ メッシュはキャラクターのメッシュに子IDを取得します｡

22
00:02:06,030 --> 00:02:13,290
‫また､ 銃口のパーティクルエフェクトなど､ 他のコンポーネントがある場合は､ メッシュに追加することもあります｡

23
00:02:13,290 --> 00:02:19,650
‫このように､ これらの階層は独立しています｡ 右側にはシーンコンポーネントとトランスフォームを持つコンポーネントがあり､

24
00:02:19,650 --> 00:02:25,830
‫これらはある特定の階層に入ることができます｡

25
00:02:25,830 --> 00:02:31,350
‫そして､ アクターの階層は､ 実際にはシーンコンポーネントの階層に従います｡

26
00:02:31,350 --> 00:02:33,270
‫役者には上下関係がないんです｡

27
00:02:33,270 --> 00:02:44,820
‫俳優の階層はなく､ シーンの構成要素の階層があるだけなのです｡

28
00:02:44,820 --> 00:02:50,490
‫シーンコンポーネントを所有するアクターがいるため､ シーンコンポーネント同士は関係があっても､

29
00:02:50,490 --> 00:02:56,190
‫実際には関係性がないため､ 結局は階層を持つことになります｡

30
00:02:56,580 --> 00:03:05,400
‫ということで､ まず最初に､ C++のガンアクタを作成することにします｡

31
00:03:05,550 --> 00:03:11,760
‫そして､ この場合､ 駒やキャラクターなどにはならないのです｡

32
00:03:11,760 --> 00:03:14,470
‫ビヘイビアは必要ないので､ 素直にアクターを使うだけです｡

33
00:03:14,470 --> 00:03:15,510
‫所持している必要はありません｡

34
00:03:15,510 --> 00:03:16,340
‫何もしなくていいんです｡

35
00:03:16,350 --> 00:03:18,060
‫まさにシンプル､ シンプルな俳優です｡

36
00:03:18,270 --> 00:03:19,740
‫では､ そのようにしましょう｡

37
00:03:19,740 --> 00:03:21,090
‫実は､ ちょっとしたチャレンジがあるんです｡

38
00:03:21,090 --> 00:03:26,460
‫そのC++のアクターを作ってきて､ ちょっとしたミニチャレンジができるはずのもの､ それを試してみてください｡

39
00:03:26,790 --> 00:03:27,070
‫なるほど｡

40
00:03:27,120 --> 00:03:34,500
‫そして､ 戻って､ 新しいC++クラスで行うつもりです､ そして､ 我々は､ 参照してください､ アクターを持つ必要はありません｡

41
00:03:34,500 --> 00:03:42,300
‫このクラスを作成するのは簡単なので､ 先に進んでこれを銃と呼ぶことにします｡

42
00:03:42,630 --> 00:03:48,190
‫これが完了すると､ コード エディタにポップアップ表示されますが､ まだ何もする必要はありません｡

43
00:03:48,190 --> 00:03:53,370
‫なぜなら､ 最初にやりたいことはブループリントのサブクラスを作成することだからです｡

44
00:03:53,370 --> 00:04:03,000
‫コンテンツブラウザでクラスを右クリックして､ My Gunと呼ぶ代わりに､ なぜか自動的にアンダースコアの銃がデフォルトになります｡

45
00:04:03,000 --> 00:04:04,320
‫コンテンツの根幹に据えるつもりです｡

46
00:04:04,320 --> 00:04:04,410
‫4つです｡

47
00:04:04,410 --> 00:04:06,660
‫あとは､ クラスが増えたら､ 少し再編成してみましょう｡

48
00:04:06,660 --> 00:04:09,810
‫前にも言いましたが､ Blueprint クラスを作成します｡

49
00:04:09,810 --> 00:04:10,950
‫ご覧の通り､ 完全に空っぽです｡

50
00:04:10,950 --> 00:04:12,720
‫このデフォルトのシーンルートがあるんです｡

51
00:04:12,720 --> 00:04:14,490
‫それを直したいと思っています｡

52
00:04:14,530 --> 00:04:20,520
‫今回はC++のコースなので､ 実際にC++でコンポーネントを追加してみたいと思います｡

53
00:04:20,520 --> 00:04:24,210
‫C++でコンポーネントを追加する筋トレを実践してみよう｡

54
00:04:24,240 --> 00:04:30,840
‫また､ C++のコード内からそれらのコンポーネントにアクセスし､ そこで操作したりコードを書いたりすることができるようになるということです｡

55
00:04:30,840 --> 00:04:36,300
‫さて､ このセットアップでは､ シーンのルートコンポーネントを用意します｡ これは単にシーンコンポーネントとなり､

56
00:04:36,300 --> 00:04:39,510
‫その子であるメッシュを用意します｡

57
00:04:39,510 --> 00:04:40,290
‫なぜ､ それを望むのか？

58
00:04:40,290 --> 00:04:52,200
‫なぜなら､ 銃のルートに対するメッシュの位置を変更できるようにしたいので､ 基本的にメッシュごとに異なる位置にハンドルを配置できるようにしたいからです｡

59
00:04:52,200 --> 00:04:55,740
‫そのため､ さまざまな銃がある場合､ このハンドルがすべて同じ場所にあることを確認し､

60
00:04:55,740 --> 00:05:00,780
‫キャラクターの手に装着したときに､ ハンドルがキャラクターの手にある状態で表示されるようにすることができます｡

61
00:05:01,500 --> 00:05:02,610
‫では､ どうすればいいのか？

62
00:05:02,610 --> 00:05:13,290
‫Visual Studioのコードに移動して､ この下にプライベートセクションを作成し､ これから作成するさまざまなコンポーネントの新しいプロパティを格納することにします｡

63
00:05:13,440 --> 00:05:19,530
‫そこで､ コンポーネントはポインタなので､ どこでも見えるようにするために､ 新しいプロパティ visible anywhere

64
00:05:19,530 --> 00:05:20,670
‫を作成します｡

65
00:05:20,670 --> 00:05:25,110
‫ポインターを編集できるようにはしたくないのですが､ そのポインターのプロパティを見ることができ､

66
00:05:25,110 --> 00:05:26,370
‫できるようにしたいのです｡

67
00:05:26,570 --> 00:05:30,950
‫そして､ そのクラスは私たちの指南役となるのです｡

68
00:05:30,980 --> 00:05:34,600
‫そして､ 何が表示され､ 何が編集可能かを決定するのです｡

69
00:05:34,610 --> 00:05:38,420
‫つまり､ ここで言いたいのは､ 編集可能なのはポインターではないということです｡

70
00:05:38,420 --> 00:05:40,210
‫だから､ とにかく可視化を目指すわけです｡

71
00:05:40,640 --> 00:05:41,810
‫とにかく､ そこでちょっとだけ修正｡

72
00:05:41,840 --> 00:05:48,740
‫これはコンポーネントなので､ あなたであって欲しいのですが､ 次に欲しいのはシーンコンポーネントです｡

73
00:05:49,220 --> 00:05:56,540
‫正しく入力できれば､ コンポーネントを見て､ それへのポインタであり､ これが私たちのルートコンポーネントになる予定です｡

74
00:05:57,780 --> 00:06:01,650
‫そうして､ ユープロパティが欲しくなるような｡

75
00:06:02,370 --> 00:06:05,790
‫また､ メッシュはどこでも見ることができます｡

76
00:06:07,140 --> 00:06:16,260
‫メッシュのクラスは､ 新しい静的メッシュコンポーネントになります｡ これはスケルトンメッシュではなく､ 剛体で､

77
00:06:16,260 --> 00:06:19,920
‫スケルトンやボーンを持たないからです｡

78
00:06:19,920 --> 00:06:24,960
‫このポインターを使用して､ このようにメッシュを呼び出すことができます｡

79
00:06:25,760 --> 00:06:31,790
‫実は､ ここで少し注意が必要なのは､ ルートコンポーネントがすでにアクターの親クラスに存在していると思うからです｡

80
00:06:31,790 --> 00:06:34,550
‫だから､ 代わりにこのルートを呼ぶことにしたんだ｡

81
00:06:35,120 --> 00:06:38,870
‫そして､ C++のほうにはすでにコンストラクタがあります｡

82
00:06:38,870 --> 00:06:42,400
‫ここでは､ 適切なヘッダーファイルをインクルードする必要があるだけです｡

83
00:06:42,410 --> 00:06:46,220
‫さて､ Visual Studioでコードを書いているときのちょっとしたコツは､ ヘッダーファイルがどこにありそうかを見つけることです｡

84
00:06:46,220 --> 00:06:50,840
‫コントロールPを使って､ 検索するんですね｡

85
00:06:50,840 --> 00:06:53,120
‫この場合､ 静的なメッシュを知りたいのです｡

86
00:06:53,120 --> 00:07:01,970
‫静的メッシュコンポーネントのドットhを開いてタブの上にカーソルを置くと､

87
00:07:01,970 --> 00:07:07,430
‫この長いパスの下にあるのがわかります｡

88
00:07:07,430 --> 00:07:12,410
‫しかし､ 興味深いのは､ それがクラスの下にあることで､ そこから調べることができるのです｡

89
00:07:12,410 --> 00:07:15,560
‫コンポーネント､ スタティックメッシュコンポーネントになりそうです｡

90
00:07:15,560 --> 00:07:21,950
‫タブを閉じて､ 銃のインクルードのすぐ上に､ 実際にはその下に､ コンポーネントのハッシュインクルードを作成し､

91
00:07:21,950 --> 00:07:29,210
‫さらに静的メッシュコンポーネントを作成します｡

92
00:07:29,510 --> 00:07:35,930
‫さて､ 実は今思い出したのですが､ なぜか手に入れたメッシュは､ 実は静的なメッシュではないのです｡

93
00:07:35,930 --> 00:07:38,120
‫スケルトンメッシュかもしれませんね｡

94
00:07:38,240 --> 00:07:45,020
‫アセットパックに入り､ ゲームの武器を撃ち､ これらの対策を見てもらうとわかると思います｡

95
00:07:45,020 --> 00:07:48,680
‫そして確かに､ カーソルを合わせると､ スケルトンメッシュであることがわかります｡

96
00:07:48,680 --> 00:07:49,880
‫理由は聞かないでください｡

97
00:07:49,880 --> 00:07:51,920
‫なぜかそうなっているのです｡

98
00:07:52,220 --> 00:07:56,810
‫そこで､ ヘッダーファイルでタイプをスケルトンメッシュに変更したいと思います｡

99
00:07:56,810 --> 00:08:01,550
‫つまり､ 静的メッシュの代わりに､ スケルトンメッシュを使用することになります｡

100
00:08:01,550 --> 00:08:06,260
‫そして､ インクルードも同じで､ スケルトンになるんです｡

101
00:08:07,310 --> 00:08:09,560
‫覚えておきたいメッシュ部品｡

102
00:08:09,560 --> 00:08:11,450
‫ヘッダーファイルの中にあなたがいない｡

103
00:08:12,390 --> 00:08:15,740
‫そして､ ここにはすでにデフォルトで含まれているコンポーネントが表示されていると思います｡

104
00:08:15,750 --> 00:08:20,300
‫そこで､ そろそろ自分でメッシュ部品を追加することにチャレンジしてみませんか？

105
00:08:20,310 --> 00:08:27,720
‫ルートシーンコンポーネントを作成し､ それをルートに設定し､ クラスのルートに設定し､ メッシュコンポーネントを作成し､

106
00:08:27,720 --> 00:08:35,880
‫メッシュコンポーネントがそのルートシーンコンポーネントの子であるように､ 2つの間の添付ファイルを設定することにしています｡

107
00:08:35,880 --> 00:08:37,620
‫ビデオを一時停止して､ 行ってみてください｡

108
00:08:37,710 --> 00:08:38,820
‫では､ お帰りなさい｡

109
00:08:38,820 --> 00:08:41,460
‫だから､ オーバーしてセットするんです｡

110
00:08:41,460 --> 00:08:48,510
‫まず､ ルートですが､ これはタイプのデフォルトサブオブジェクトを作成することになります｡

111
00:08:48,600 --> 00:08:56,160
‫コンポーネントを見て､ テキストマクロで名前をつけて､ ルートと呼び､

112
00:08:56,160 --> 00:08:59,520
‫セミコロンで締めくくります｡

113
00:08:59,520 --> 00:09:01,590
‫そして､ それをルートとして設定します｡

114
00:09:01,590 --> 00:09:06,210
‫そのため､ ルートコンポーネントを設定すると､ アクターのルートコンポーネントとして設定されます｡

115
00:09:06,210 --> 00:09:08,160
‫そこで､ rootをルートコンポーネントとして設定します｡

116
00:09:08,370 --> 00:09:09,480
‫いいものですね｡

117
00:09:09,480 --> 00:09:12,420
‫次に､ メッシュを作成したいと思います｡

118
00:09:12,420 --> 00:09:21,480
‫meshはデフォルトのサブオブジェクトに相当し､ クラスとして必要なスケルトン・メッシュ・コンポーネントを作成し､

119
00:09:21,480 --> 00:09:28,260
‫テキスト・マクロはそれをmeshと呼び､ 最後にセミコロンを追加するだけです｡

120
00:09:28,260 --> 00:09:30,090
‫そして､ アタッチメントを設定したいと思います｡

121
00:09:30,090 --> 00:09:34,380
‫だから､ メッシュの矢印が設定されることになる｡

122
00:09:35,150 --> 00:09:42,920
‫アタッチメントを設定し､ クールなもののようにルートにアタッチしたいので､ 先に進んで保存し､

123
00:09:42,920 --> 00:09:51,740
‫うまくいけばコンパイルしてビルドし､ Unrealに移動して子クラスを見てみましょう｡

124
00:09:51,740 --> 00:09:56,960
‫そして案の定､ この中にルートとサブメッシュがあり､

125
00:09:56,960 --> 00:10:02,540
‫さらにデフォルトのシーンルートがぶら下がっています｡

126
00:10:02,750 --> 00:10:07,280
‫コンポーネントを追加する際に､ このようにダラダラしてキャッシュされてしまうことがあるのです｡

127
00:10:07,280 --> 00:10:12,500
‫そして確かに､ BPガンの設計図をもう一度開いてみると､ ちょうどこの2つの部品があることがわかります｡

128
00:10:12,500 --> 00:10:21,710
‫ルートとメッシュを追加しました｡ おそらく､ 先に進んで､ シューターゲームのアセットパックからスケルトンメッシュの1つにメッシュを変更したいのでしょう｡

129
00:10:21,860 --> 00:10:23,240
‫ライフルもあるし､ ランチャーもある｡

130
00:10:23,240 --> 00:10:25,910
‫私はこれをライフルにしようと思っています｡

131
00:10:25,910 --> 00:10:30,290
‫だから､ 実際にBPガンと呼ぶのは､ ちょっと不誠実なんです｡

132
00:10:30,290 --> 00:10:32,840
‫これはおそらく､ BPライフルであるべきでしょう｡

133
00:10:32,840 --> 00:10:41,630
‫コンテンツブラウザでBP RifleまたはBP Gunに名前を変更します｡ アンダースコアはrifleです｡

134
00:10:41,630 --> 00:10:43,760
‫今度は直接BPライフルと呼んでください｡

135
00:10:44,330 --> 00:10:44,960
‫これでよしとする｡

136
00:10:44,960 --> 00:10:47,660
‫そして､ そのおかげで銃が手に入りました｡

137
00:10:47,660 --> 00:10:54,410
‫さて､ ここで明らかに､ C++で新しいプロパティを作成することで､ このアクターに対して､ 武器の強さ､

138
00:10:54,410 --> 00:11:00,980
‫射程距離など､ あらゆる種類のプロパティを持たせることができることを意味します｡

139
00:11:00,980 --> 00:11:08,060
‫そして､ このアーキテクチャを持つことの強みは､ 銃が少しずつ違うものになることです｡

140
00:11:08,060 --> 00:11:15,890
‫ライフル対スナイパー対RPGなど､ 異なる射撃メカニックを用意することができます｡

141
00:11:15,890 --> 00:11:17,450
‫だからすごいんです｡

142
00:11:17,450 --> 00:11:23,720
‫また､ 異なるステータスを持たせることができるので､ 異なる設計図のサブクラスによって､ 強いライフルと弱いライフルを持たせることができるのです｡

143
00:11:23,750 --> 00:11:24,380
‫かっこいいもの

144
00:11:24,380 --> 00:11:32,660
‫さて､ 次の講義では､ 現在のキャラクターの子として､ この銃を実際に生成する方法について見ていきたいと思います｡

145
00:11:32,690 --> 00:11:33,530
‫現地でお会いしましょう｡

