‫こんにちは､ ようこそ｡
‫この講義では､ 銃を作成し､ このゲームの銃をどのように設計していくか､
‫スワップ可能で､ 異なるタイプの銃に異なるプロパティを持たせることができるかを学びます｡
‫ファーストパーソンやサードパーティーのシューティングゲームでは､ 一般的にこのようなアーキテクチャが採用されています｡
‫なるほど｡
‫というわけで､ ちょっと久しぶりにプロジェクト計画を確認してみました｡
‫プランに辿り着いた時には､ 必ずムーブメントが起きています｡
‫アニメーションはとりあえず完成したので､ 次は撮影に集中します｡
‫さて､ ここで少し混乱するのは､ このメッシュにはすでに銃があるように見えますが､ 実はこの銃は使いたくないということです｡
‫違う使い方をしたい｡
‫シューティングゲームの場合､ 武器を持ち替えたり､ キャラクターごとに武器を持ち替えたりしたいと思うことが多いからです｡
‫そして､ 一番簡単な方法は､ 銃をキャラクターと別物にして､ どう撃つかに責任を持てるように､
‫入れ替えられるようにアーキテクチャすることです｡
‫ロケットランチャーならともかく､ ショットガンやライフルでは､ やり方が違う｡
‫さて､ では銃のコンポーネントを作って､ その銃のコンポーネントをメッシュの下に貼り付ければいいじゃないかと言われるかもしれませんが､
‫そうすると､ 銃に複数のコンポーネントを追加できるモジュール性が失われてしまうのです｡
‫そこで､ 私たちが本当にやりたいことは､ シューターというキャラクターに対して､ 子供っぽい銃の役者を用意することです｡
‫さて､ これは今までになかったことですが､ 次のような仕組みになっています｡
‫シューターキャラクターとその子である銃を持つことができ､ シューターキャラクターは互いに子IDとなる複数のコンポーネントを持つことができます｡
‫つまり､ カプセルがあり､ 現時点ではカプセルの子としてメッシュがあり､ 銃のコンポーネントはその子IDにすることができるのです｡
‫そのため､ メッシュはキャラクターのメッシュに子IDを取得します｡
‫また､ 銃口のパーティクルエフェクトなど､ 他のコンポーネントがある場合は､ メッシュに追加することもあります｡
‫このように､ これらの階層は独立しています｡ 右側にはシーンコンポーネントとトランスフォームを持つコンポーネントがあり､
‫これらはある特定の階層に入ることができます｡
‫そして､ アクターの階層は､ 実際にはシーンコンポーネントの階層に従います｡
‫役者には上下関係がないんです｡
‫俳優の階層はなく､ シーンの構成要素の階層があるだけなのです｡
‫シーンコンポーネントを所有するアクターがいるため､ シーンコンポーネント同士は関係があっても､
‫実際には関係性がないため､ 結局は階層を持つことになります｡
‫ということで､ まず最初に､ C++のガンアクタを作成することにします｡
‫そして､ この場合､ 駒やキャラクターなどにはならないのです｡
‫ビヘイビアは必要ないので､ 素直にアクターを使うだけです｡
‫所持している必要はありません｡
‫何もしなくていいんです｡
‫まさにシンプル､ シンプルな俳優です｡
‫では､ そのようにしましょう｡
‫実は､ ちょっとしたチャレンジがあるんです｡
‫そのC++のアクターを作ってきて､ ちょっとしたミニチャレンジができるはずのもの､ それを試してみてください｡
‫なるほど｡
‫そして､ 戻って､ 新しいC++クラスで行うつもりです､ そして､ 我々は､ 参照してください､ アクターを持つ必要はありません｡
‫このクラスを作成するのは簡単なので､ 先に進んでこれを銃と呼ぶことにします｡
‫これが完了すると､ コード エディタにポップアップ表示されますが､ まだ何もする必要はありません｡
‫なぜなら､ 最初にやりたいことはブループリントのサブクラスを作成することだからです｡
‫コンテンツブラウザでクラスを右クリックして､ My Gunと呼ぶ代わりに､ なぜか自動的にアンダースコアの銃がデフォルトになります｡
‫コンテンツの根幹に据えるつもりです｡
‫4つです｡
‫あとは､ クラスが増えたら､ 少し再編成してみましょう｡
‫前にも言いましたが､ Blueprint クラスを作成します｡
‫ご覧の通り､ 完全に空っぽです｡
‫このデフォルトのシーンルートがあるんです｡
‫それを直したいと思っています｡
‫今回はC++のコースなので､ 実際にC++でコンポーネントを追加してみたいと思います｡
‫C++でコンポーネントを追加する筋トレを実践してみよう｡
‫また､ C++のコード内からそれらのコンポーネントにアクセスし､ そこで操作したりコードを書いたりすることができるようになるということです｡
‫さて､ このセットアップでは､ シーンのルートコンポーネントを用意します｡ これは単にシーンコンポーネントとなり､
‫その子であるメッシュを用意します｡
‫なぜ､ それを望むのか？
‫なぜなら､ 銃のルートに対するメッシュの位置を変更できるようにしたいので､ 基本的にメッシュごとに異なる位置にハンドルを配置できるようにしたいからです｡
‫そのため､ さまざまな銃がある場合､ このハンドルがすべて同じ場所にあることを確認し､
‫キャラクターの手に装着したときに､ ハンドルがキャラクターの手にある状態で表示されるようにすることができます｡
‫では､ どうすればいいのか？
‫Visual Studioのコードに移動して､ この下にプライベートセクションを作成し､ これから作成するさまざまなコンポーネントの新しいプロパティを格納することにします｡
‫そこで､ コンポーネントはポインタなので､ どこでも見えるようにするために､ 新しいプロパティ visible anywhere
‫を作成します｡
‫ポインターを編集できるようにはしたくないのですが､ そのポインターのプロパティを見ることができ､
‫できるようにしたいのです｡
‫そして､ そのクラスは私たちの指南役となるのです｡
‫そして､ 何が表示され､ 何が編集可能かを決定するのです｡
‫つまり､ ここで言いたいのは､ 編集可能なのはポインターではないということです｡
‫だから､ とにかく可視化を目指すわけです｡
‫とにかく､ そこでちょっとだけ修正｡
‫これはコンポーネントなので､ あなたであって欲しいのですが､ 次に欲しいのはシーンコンポーネントです｡
‫正しく入力できれば､ コンポーネントを見て､ それへのポインタであり､ これが私たちのルートコンポーネントになる予定です｡
‫そうして､ ユープロパティが欲しくなるような｡
‫また､ メッシュはどこでも見ることができます｡
‫メッシュのクラスは､ 新しい静的メッシュコンポーネントになります｡ これはスケルトンメッシュではなく､ 剛体で､
‫スケルトンやボーンを持たないからです｡
‫このポインターを使用して､ このようにメッシュを呼び出すことができます｡
‫実は､ ここで少し注意が必要なのは､ ルートコンポーネントがすでにアクターの親クラスに存在していると思うからです｡
‫だから､ 代わりにこのルートを呼ぶことにしたんだ｡
‫そして､ C++のほうにはすでにコンストラクタがあります｡
‫ここでは､ 適切なヘッダーファイルをインクルードする必要があるだけです｡
‫さて､ Visual Studioでコードを書いているときのちょっとしたコツは､ ヘッダーファイルがどこにありそうかを見つけることです｡
‫コントロールPを使って､ 検索するんですね｡
‫この場合､ 静的なメッシュを知りたいのです｡
‫静的メッシュコンポーネントのドットhを開いてタブの上にカーソルを置くと､
‫この長いパスの下にあるのがわかります｡
‫しかし､ 興味深いのは､ それがクラスの下にあることで､ そこから調べることができるのです｡
‫コンポーネント､ スタティックメッシュコンポーネントになりそうです｡
‫タブを閉じて､ 銃のインクルードのすぐ上に､ 実際にはその下に､ コンポーネントのハッシュインクルードを作成し､
‫さらに静的メッシュコンポーネントを作成します｡
‫さて､ 実は今思い出したのですが､ なぜか手に入れたメッシュは､ 実は静的なメッシュではないのです｡
‫スケルトンメッシュかもしれませんね｡
‫アセットパックに入り､ ゲームの武器を撃ち､ これらの対策を見てもらうとわかると思います｡
‫そして確かに､ カーソルを合わせると､ スケルトンメッシュであることがわかります｡
‫理由は聞かないでください｡
‫なぜかそうなっているのです｡
‫そこで､ ヘッダーファイルでタイプをスケルトンメッシュに変更したいと思います｡
‫つまり､ 静的メッシュの代わりに､ スケルトンメッシュを使用することになります｡
‫そして､ インクルードも同じで､ スケルトンになるんです｡
‫覚えておきたいメッシュ部品｡
‫ヘッダーファイルの中にあなたがいない｡
‫そして､ ここにはすでにデフォルトで含まれているコンポーネントが表示されていると思います｡
‫そこで､ そろそろ自分でメッシュ部品を追加することにチャレンジしてみませんか？
‫ルートシーンコンポーネントを作成し､ それをルートに設定し､ クラスのルートに設定し､ メッシュコンポーネントを作成し､
‫メッシュコンポーネントがそのルートシーンコンポーネントの子であるように､ 2つの間の添付ファイルを設定することにしています｡
‫ビデオを一時停止して､ 行ってみてください｡
‫では､ お帰りなさい｡
‫だから､ オーバーしてセットするんです｡
‫まず､ ルートですが､ これはタイプのデフォルトサブオブジェクトを作成することになります｡
‫コンポーネントを見て､ テキストマクロで名前をつけて､ ルートと呼び､
‫セミコロンで締めくくります｡
‫そして､ それをルートとして設定します｡
‫そのため､ ルートコンポーネントを設定すると､ アクターのルートコンポーネントとして設定されます｡
‫そこで､ rootをルートコンポーネントとして設定します｡
‫いいものですね｡
‫次に､ メッシュを作成したいと思います｡
‫meshはデフォルトのサブオブジェクトに相当し､ クラスとして必要なスケルトン・メッシュ・コンポーネントを作成し､
‫テキスト・マクロはそれをmeshと呼び､ 最後にセミコロンを追加するだけです｡
‫そして､ アタッチメントを設定したいと思います｡
‫だから､ メッシュの矢印が設定されることになる｡
‫アタッチメントを設定し､ クールなもののようにルートにアタッチしたいので､ 先に進んで保存し､
‫うまくいけばコンパイルしてビルドし､ Unrealに移動して子クラスを見てみましょう｡
‫そして案の定､ この中にルートとサブメッシュがあり､
‫さらにデフォルトのシーンルートがぶら下がっています｡
‫コンポーネントを追加する際に､ このようにダラダラしてキャッシュされてしまうことがあるのです｡
‫そして確かに､ BPガンの設計図をもう一度開いてみると､ ちょうどこの2つの部品があることがわかります｡
‫ルートとメッシュを追加しました｡ おそらく､ 先に進んで､ シューターゲームのアセットパックからスケルトンメッシュの1つにメッシュを変更したいのでしょう｡
‫ライフルもあるし､ ランチャーもある｡
‫私はこれをライフルにしようと思っています｡
‫だから､ 実際にBPガンと呼ぶのは､ ちょっと不誠実なんです｡
‫これはおそらく､ BPライフルであるべきでしょう｡
‫コンテンツブラウザでBP RifleまたはBP Gunに名前を変更します｡ アンダースコアはrifleです｡
‫今度は直接BPライフルと呼んでください｡
‫これでよしとする｡
‫そして､ そのおかげで銃が手に入りました｡
‫さて､ ここで明らかに､ C++で新しいプロパティを作成することで､ このアクターに対して､ 武器の強さ､
‫射程距離など､ あらゆる種類のプロパティを持たせることができることを意味します｡
‫そして､ このアーキテクチャを持つことの強みは､ 銃が少しずつ違うものになることです｡
‫ライフル対スナイパー対RPGなど､ 異なる射撃メカニックを用意することができます｡
‫だからすごいんです｡
‫また､ 異なるステータスを持たせることができるので､ 異なる設計図のサブクラスによって､ 強いライフルと弱いライフルを持たせることができるのです｡
‫かっこいいもの
‫さて､ 次の講義では､ 現在のキャラクターの子として､ この銃を実際に生成する方法について見ていきたいと思います｡
‫現地でお会いしましょう｡