‫こんにちは､ お帰りなさい｡
‫さて､ 投射物クラスはすでに作成されているので､ レベル内で投射物を生成し､
‫塔に向けて発射し､ 最終的に塔を破壊する準備が整いました｡
‫さて､ アクターの生成には､ アクターのスポーン関数が必要です｡
‫そこで､ このビデオでは､ その仕組みを学びます｡
‫では､ 投射物のスポーンについて説明します｡
‫これは､ C++側からやってみたいことです｡
‫C++の関数を呼び出して､ 世界に新しいオブジェクトを動的に生成するのです｡
‫今は C++ 側からスポーンしていますが､ projectile クラスのブループリントに基づいたオブジェクトをスポーンしたいと思います｡
‫A Projectile C++ クラスをベースにした設計図があり､ その中に追加情報が含まれているからです｡
‫具体的には､ そのメッシュのプロパティが設定されています｡
‫静止画のメッシュ部品には､ このメッシュを選びました｡
‫だから､ C++版を産み出すわけにはいかない｡
‫そのメッシュを得るために､ ブループリント版をスポーンする必要があるのです｡
‫そこで問題は､ C++で､ 設計図に基づいたオブジェクトをどのように生成するかです｡
‫さて､ これからPT Subclassというものを学びますが､ これはテンプレートです｡
‫また､ 多くのテンプレートと同様に､ 角括弧は型が必要になります｡
‫そのため､ PTのサブクラスを使用するには､ 型パラメータが必要です｡
‫そして､ これによってUクラスと呼ばれるものを格納する変数を持つことができるのです｡
‫U クラスはクラスタイプを表しますが､ アンリアル エンジンのリフレクション システムと相互作用する機能も持っています｡
‫リフレクションというのは､ C++側とブループリント側で情報をやりとりすることです｡
‫のPTサブクラスは､ その名の通り､ 渡す型に基づいたクラスを表す変数や､ この選んだ型のサブクラスを格納することができる｡
‫つまり､ ある型を選び､ その型やその型から派生した型を表すuクラスを保持することができるtサブクラスを選ぶことができるのです｡
‫そして､ これにはタイプに応じた設計図が含まれます｡
‫では､ このtのサブクラスとやらがどのように機能するのか見てみましょう｡
‫なるほど｡
‫ベースポッドに戻ったのは､ この弾丸をタンクとタワーの両方のクラスに配置したいからです｡
‫そのどちらのクラスも投射物を産み出すことになる｡
‫だから､ ここにtサブクラスの変数が欲しい｡
‫そこで､ t sub class ofと言い､ 角括弧の中に型を渡す必要があります｡
‫これで､ このように角括弧の中でも前方宣言ができるようになりました｡
‫そして､ タイプを投射型にする｡
‫そして､ その理由は､ projectileクラスを作り､ その型がprojectileであるからです｡
‫そこで､ この変数を作成し､ projectile classと呼ぶことにします｡
‫これで､ クラスタイプを表すC++変数を持つことができ､ タイプは投射物､ さらにはこれに基づくブループリントのクラスタイプに基づくことができます｡
‫今度はU字型のプロパティを付与します｡
‫そして､ 少なくともデフォルトのブループリントではこれを編集できるようにしたいので､ この編集をデフォルトにすることにします｡
‫今だからこそ､ これにカテゴリーを与えることができるのです｡
‫戦闘というカテゴリーに入れます｡
‫では､ これをコンパイルしてみましょう｡
‫さて､ エディタに戻って､ blueprints フォルダから Pons フォルダに移動してみます｡
‫そして､ BP -- tankを開いて､ フルブループリントエディタを開きます｡
‫さて､ 詳細パネルを見ると､ コンバットを探すことができます｡
‫これです｡
‫そして､ これがprojectileクラスの変数です｡
‫これは､ 射影機クラスと呼ばれるもののサブクラスである｡
‫ここで､ ドロップダウンを使って設定することができることに注意してください｡
‫そして､ ドロップダウンをクリックすると､ 3つのオプションが表示されます｡
‫デフォルトではnoneに設定されていますが､ これは基本的にnullポインターであることを意味します｡
‫あるいは､ 投射型やBP投射型に設定することもできます｡
‫このサブクラスでできることは､ この射影機クラスを射影機に基づいて特定のタイプに設定することです｡
‫今度はここに投射します｡
‫これは､ C++のprojectileというクラスです｡
‫投射物ですが､ BP投射物はC++の投射物クラスをベースにしたブループリントで､ これを選択することができます｡
‫そして､ projectile classはBP projectile typeに設定されました｡
‫さて､ これはコンポーネントでもなければ､ BPプロジェクタイルオブジェクトでもない｡
‫そういうことではないんです｡
‫型､ より具体的にはUを格納する｡
‫クラスタイプです｡
‫そして､ 私が言ったように､ あなたのクラスには､ C++とブループリントの間でリフレクションが機能するような機能が組み込まれています｡
‫C++と設計図の間で情報を流すことができる｡
‫BP projectile blueprint typeに設定されたPTのサブクラスであるprojectile classを用意しました｡
‫では､ なぜわざわざ変数のサブクラスを作る必要があるのでしょうか？
‫さて､ アクターのスポーン機能の仕組みについて説明する必要があります｡
‫スポーンアクターは､ 新しい世界観に属する機能です｡
‫だから､ 世界を手に入れれば､ スポーンアクターを呼ぶことができるのです｡
‫また､ Spawn actorもテンプレート機能の一つで､ デフォルトのサブオブジェクトを作成するのと同じように､ 新しいオブジェクトを作成するように設計されています｡
‫しかし､ create default sub objectはコンポーネントを作成するために設計されており､ 特定のクラスのコンストラクタでしか使用できません
‫spawn actorはゲーム実行中に呼び出すことができ､ アクターを作成することができます｡
‫今はテンプレートなので､ 型が必要です｡
‫投射物を生成したい場合は､ C++のクラスタイプに投射物を渡します｡
‫これは､ C++のspawn actor関数から返されるC++クラスです｡
‫ここで､ 括弧はUクラスを含むいくつかのパラメータを取ります｡
‫現在､ この関数には､ 異なる入力パラメータを取る複数のオーバーロードが存在します｡
‫最もシンプルなのは､ Uクラス､ Aロケーション､ ローテーションを取るバージョンでしょう｡
‫ザ・ユー｡
‫クラスは､ スポーンするタイプを表すものです｡
‫これは､ 実際に生成されるオブジェクトのタイプです｡
‫これは設計図クラスかもしれません｡
‫location はオブジェクトを生成する場所を指定する F vector で､ rotation はその回転を指定する｡
‫ですから､ 構文の例は次のようになります｡
‫クラスタイプを指定してspawn actorを呼び出し､ そのuクラスの情報を位置ベクトルと回転ローテータとともに渡します｡
‫では､ 少しクラスの話をしましょう｡
‫さて､ これまで述べてきたように､ クラスはクラス型を表します｡
‫Spawn actorを呼び出すときに､ Uクラスを渡して､ spawn actor関数にスポーンするオブジェクトに関する情報を提供します｡
‫確かに､ 角括弧の中に型を渡しましたが､ これは単にSpawn actorに作成するC++の型を伝えるだけです｡
‫youクラスがより多くの情報を含んでいるのに対して
‫例えば､ 発射体をベースにしたブループリントを作成し､ ブループリント内で､ スタティックメッシュコンポーネントのスタティックメッシュを選択するなど､
‫いくつかのプロパティを設定したとします｡
‫ここで､ 単に生のC++クラスを生成する場合､ その静的メッシュは､ 新しく生成された投射物には設定されません｡
‫本質的には､ 目に見えない新しいアクターを生み出すだけなのです｡
‫しかし､ 新しいクラス変数は､ ブループリント・クラスを表すことができます｡
‫御社のクラスでは､ C++側で､ ブループリント､ クラスタイプ､ スポーンを表す変数を持たせることができます｡
‫アクターはそのクラスを入力引数として受け取り､ その新しいクラスで表されるブループリントに基づいて新しいオブジェクトを生成することができます｡
‫つまり､ 新しい投射物には静的メッシュ プロパティが設定されます｡ これは､ 生の C++ クラスではなく､ ブループリントに基づいて新しいオブジェクトを生成しているためです｡
‫このため､ 新しいクラスを格納できるサブクラスを作成し､ BP -- tank ブループリントから
‫BP projectile と等しいものを設定することができました｡
‫さて､ これでアクターのスポーン方法はわかりましたね｡
‫スポーンアクターは､ 新しいワールドクラスに属しています｡
‫つまり､ get worldを呼び出して､ 単純にSpawn actorを呼び出すと､
‫この関数の入力要件は､ C++の型を角括弧で､ 位置と回転を括弧で渡します｡
‫では､ 今回の課題である発射体の生成ですが､ これはfire関数で行います｡
‫そこで､ get world spawn アクタを呼び出し､ 角括弧の中に投射物を渡します｡
‫つまり､ projectile用のヘッダーファイルをインクルードする必要があるのです｡
‫だからそれを忘れずに､ 新しい変数projectile classを括弧内のUクラスの入力パラメータとして使用します｡
‫あとは､ 場所と回転です｡
‫位置と回転の両方に投射物のスポーンポイントを使用することになります｡
‫発射体スポーンポイントコンポーネントから｡
‫これらの値にアクセスするには､ get component location と get component rotation を呼び出すことができます｡
‫そこで､ ビデオを一時停止して､ 今すぐfire関数でspawn actorを呼び出します｡
‫なるほど｡
‫では､ fire関数が定義されているBase Pond CPに入りましょう｡
‫ここでデバッグ球を描きます｡
‫もう､ 本当に必要ないんです｡
‫そこで､ この関数呼び出しを削除して､ 代わりにここでSpawnアクターを呼び出すことにします｡
‫これで､ すでに投射物のスポーンポイントの位置が判明しました｡
‫このローカル変数の名前を単純にlocationに変更し､ 新しいFローテーターを作成することにします｡
‫ローテーションと呼ばれる
‫そして､ これも同様に投射物のスポーンポイントから取得することにしています｡
‫つまり､ 射的のスポーンポイントがコンポーネントの回転を取得することになります｡
‫これで､ 投射物を発生させる場所と回転が決まりました｡
‫次に､ アクターのスポーン（spawn）を呼び出して､ ワールドの取得を呼び出せるようにする必要があります｡
‫そして､ この関数で得た世界から､ スポーンアクターを呼び出すことができます｡
‫さて､ これには山括弧と括弧がありますね？
‫だから､ 角括弧の中で､ 射影機を使う必要があるんです｡
‫また､ 投射物を使用するので､ そのためのヘッダーを含める必要があります｡
‫そこで､ ここでは､ デバッグヘルパーの描画を削除して､ projectileに置き換えます｡
‫だから､ 今はそのタイプを搭載しています｡
‫次にUクラスが必要ですが､ Hがprojectileクラスを持っていることから､ それをUクラスとして使用することができます｡
‫そこで､ projectile クラスを渡すことにします｡
‫さて､ 最後に位置と回転を渡すと､ これでアクターのスポーン機能を満たすことができます｡
‫では､ これをコンパイルして､ エディタに戻り､ テストプレイをしてみましょう｡
‫というわけで､ さっそくクリックして確認してみることにします｡
‫新しい弾丸を産み落としました｡
‫樽の先端に弾丸を発射しているのですが､ 空中に浮いているような感じで､ 見た目が悪いんです｡
‫でも､ それでいいんです｡
‫これがステップ1です｡
‫まず､ 投射物を生成し､ 次のステップとして投射物のように動作させる必要があります｡
‫つまり､ 要約すると､ 投射物を産み出すようになったということです｡
‫これは大きな節目です｡
‫しかし､ まだ投射物とは言えない｡
‫ただそこに止まっているだけで､ 投射物は空中を飛ぶことになっている｡
‫次のビデオでは､ 投射物を実際に空中を飛ばし､ 投射物のように動作させる方法について説明します｡
‫また､ お会いしましょう｡