‫こんにちは､ ようこそ｡
‫この講義では､ C++で新しいコンポーネント､ このトリガーボックスを作成します｡ このトリガーボックスは､ 私たちがアルコーブの中に入ったり､
‫アルコーブの中にオブジェクトを置いたりすると､ 私たちに報告してくれるものです｡
‫左上に小さな設計図のメッセージが表示されているのがわかると思います｡
‫そのためには､ オーバーラップやブロック､ さまざまなコリジョン レスポンスが Unreal でどのように動作するのかを理解する必要があります｡
‫潜入して確かめてみよう｡
‫さて､ トレース・チャンネルの仕組みについては､ すでにお馴染みとなりました｡
‫この低木のように､ シーン内のさまざまなオブジェクトにトレース反応を持たせることができることが分かっています｡
‫ここでは､ ウェポントレースには無視の対応をしているが､ ビジビリティートレースはブロックしていることがわかる｡
‫それから､ この防弾ガラスの例もあります｡
‫武器はブロックするが､ 視界は通すレンガの壁と､ 両方をブロックするレンガの壁｡
‫つまり､ トレースチャンネルを使ったこのシステムの仕組みがわかるわけです｡
‫では､ どのオブジェクトがお互いに重なり､ どのオブジェクトが通過し､ どのオブジェクトがブロックするかを決めようとするとどうなるでしょうか｡
‫それは少し複雑になりますね｡
‫これは､ ガーゴイルとポーンを重ね合わせようとしたときに､ すでに見た光景です｡
‫さて､ その仕組みはこうだ｡
‫基本的には､ これらのオブジェクトタイプを使用します｡
‫各オブジェクトは､ 特定のオブジェクトタイプに属することができます｡
‫そして､ これはC++の型システムのようなものとは異なる｡
‫これらは､ コリジョン（衝突）タイプです｡
‫オブジェクトAとオブジェクトBがあり､ それぞれの設定で､ 例えばガーゴイルの設定を見てみると､
‫それぞれのオブジェクトタイプを持っていることがわかります｡
‫こちらは世界の静物ですが､ さらにその下には､ 他の種類の物体に対する反応も用意されているそうです｡
‫つまり､ このオブジェクトは他のワールドのスタティックをブロックし､ 他のワールドのダイナミクスをブロックし､
‫ポーンのタイプに重なり､ 物理ボディをブロックし､ 他のあらゆるタイプをブロックすることがわかります｡
‫そして､ BPプレイヤーを探しに行けば､ 当然ポーンそのものがあります｡
‫そして､ カプセルコンポーネントの詳細を見て､ コリジョンのプリセットがあるところまでスクロールしてください｡
‫Pawn Collisionのプリセットを展開すれば､ 編集はできないが､ 何をしているかはわかる｡
‫そして､ 世界の静止画に対して独自の対応をしていることがわかります｡
‫だから､ 世界の静電気に対する対応は､ それをブロックすることになる｡
‫つまり､ ここには2種類のオプションがあるのです｡
‫ポーンはワールドスタティックをブロックすると言っていますが､ ガーゴイルはポーンをオーバーラップさせると言っています｡
‫では､ どうすればいいのか｡
‫さて､ ここでこの表の出番です｡ このブログ記事へのリンクは､ 講義資料で全文を読みたい方のために用意しました｡
‫つまり､ 両者の間で最もブロッキングの少ないインタラクションが必要であることがおわかりいただけると思います｡
‫つまり､ オブジェクトAがポーンで､ おい､ あのガーゴイルをブロックしろと言っているのに､ ガーゴイルのオブジェクトBで､ おい､
‫あのポーンに重なるようにしろと言っているとします｡
‫だから､ その中で一番ブロックがかからず､ 重なり合うことになるんです｡
‫つまり､ 2つのものが互いにブロックし合うには､ 両者がそれを望んでいることに同意する必要があるということです｡
‫では､ ここで別の例を見てみましょう｡
‫プレイヤーはポーンというオブジェクトタイプで､ 他のポーンに対するオブジェクトの反応はブロック､ 世界の静的オブジェクトに対する反応はブロックとなります｡
‫レンガの壁は､ ワールドスタティックオブジェクトです｡
‫ポーンをブロックしたり､ ワールドスタティックをブロックしたりすることができます｡
‫だから､ この2つは互いに同意することになる｡
‫さて､ シュラフも世界静止ですが､ ポーンが重なります｡
‫ガーゴイルによく似ていますが､ 世界の静止画をブロックします｡
‫ポーンが茂みを通り抜けようとすると､ ブロックが最も少ないオーバーラップという選択肢を取るので､
‫オーバーラップイベントが発生し､ コードやブループリントでフックすることができます｡
‫では､ なぜここまで深入りするのか｡
‫というのも､ この壁の中に基本的に見えないオブジェクトを入れて､ ガーゴイルをここに置くことができるようにし､
‫それが起こったときにイベントを取得したいのです｡
‫だから､ ガーゴイルはイベントを立ち上げて､ 「おい､ 俺と何かが重なってるぞ」と言うのです｡
‫では､ なぜこのようなことが重要なのでしょうか｡
‫なぜなら､ 見えないけれどガーゴイルと重なるオブジェクトを置いて､ その事実を知らせたいからです｡
‫その後､ C++から問い合わせることもできますし､ Blueprintでイベントを取得することもできます｡
‫そして､ その方法は､ まず､ このダンジョンの壁からブループリントを作成します｡
‫詳細ペインでブループリント・ボタンをクリックし､ 新しいサブクラスを作成します｡
‫名前をbeep､ アンダースコアのsecret wallとし､ selectを押して作成し､ メインウィンドウにドケットを作成します｡
‫また､ ここに追加したいのは､ ボックスコリジョンと呼ばれるコンポーネントです｡
‫そこで､ ボックスコリジョンをクリックすると､ 完全に見えなくなるのがわかると思います｡
‫このボックスにガーゴイルを配置すると､ どこにでも受け入れられるように､
‫ボックスの大きさを変更できます｡
‫そして､ この下には衝突のオプションがあることがわかります｡
‫デフォルトとしてオーバーラップオールダイナミックを用意していますが､ デフォルトのプリセットとして｡
‫しかし､ カスタムをクリックすると､ オブジェクトの種類を変更でき､ ここでさまざまなものに反応する方法を変更できることがわかります｡
‫そして､ 最も重要なことは､ ご覧のように､ ほとんどのオブジェクトタイプに重なるように設定されていることだと思います｡ つまり､
‫ワールドダイナミックに重なるように設定されていなくても､ 重なるように設定されているのです｡
‫何も遮るものがない
‫これでガーゴイルをここに配置できそうです｡
‫そこで､ そのコンポーネントをシーンから削除します｡ なぜなら､ このボックスコリジョンをもとに､
‫C++で新しいコンポーネントを作成したいからです｡
‫このボックスで､ デフォルトのプリセットであるオーバーラップオールダイナミックに戻し､
‫チェックするか､ すでにチェックされているオーバーラップイベントを生成するをチェックすると､ このようになります｡
‫次に､ イベントグラフに移動して､ ここを右クリックし､ 重なりを探します｡
‫そして､ 右上にボックスのためのアドオンコンポーネントが重なり始めるのが見えます｡
‫これをクリックして､ 実際にボックスコンポーネントの名前をトリガーエリアに変更してみましょう｡
‫そうすると､ 基本的にトリガー領域と重なった場合､ 重なっているもののプロパティのリストを取得することになるので､
‫それを利用することができます｡
‫重なっていますね｡
‫その名前を知ることができた｡
‫つまり､ 表示名を取得すると､ ノードの名前になります｡
‫そして､ その結果文字列をプリントして､ それを実行ピンにフックすれば､ そのまま再生ボタンを押すことができます｡
‫そして､ その部分に近づいてみると､ ビーププレイヤーというのが重なっているのがわかると思います｡
‫今はその辺りが暗くて見えません｡
‫スポットライトコンポーネントを追加して､ この小さな床の間に置き､
‫下向きに回転させて､ オブジェクトがあるスペースを照らします｡
‫今､ そのシーンでは､ それがはっきりと見えています｡
‫では､ 再生ボタンを押して､ あの床の間まで歩いて行ってみましょう｡
‫重ねてみると､ ビーププレイヤーが重なっていると表示されます｡ 新しく作ったグラバーを使って､
‫このセルからガーゴイルを取りに行って､ そのガーゴイルをこのエリアに配置することができます｡
‫しかし､ オーバーラップイベントは発生しないようです｡ これは､ 私たちが必要としているように､ 衝突の当事者が2人いるからです｡
‫また､ オーバーラップイベントを発生させるために､ 2つのパーティがあります｡
‫そのため､ ボックスコンポーネントでこの機能を有効にしても､ そこに移動するガーゴイルが実際にオーバーラップイベントを警告するわけではありません｡
‫だから､ ガーゴイルのところに行き､ チェックし､ オーバーラップイベントも発生させなければならない｡
‫そうすると､ オーバーラップする事象が起こるはずです｡
‫ガーゴイルを拾って､ 床の間まで連れて行き､ 刺してみよう｡
‫そして今､ イベントが控えているのです｡
‫そうなると､ ガーゴイル像が確かに登録されていることになる｡
‫さて､ 今回はブループリント・イベントを使用することはありません｡
‫そこで､ トリガー・エリア・コンポーネントをC++のコンポーネントに変換し､ ガーゴイル像がすでにあるのかないのかを評価できるようにしたいと思います｡
‫この方法は､ コンポーネントの追加で､ 新しいC++コンポーネントを作成します｡
‫そして､ 親クラスとして､ アクティブコンポーネントやシーンコンポーネントを選択するのではなく､
‫すべてのクラスに移動して､ 代わりにボックスコンポーネントを検索することにします｡
‫そして､ シェイプコンポーネント､ ボックスコンポーネント､ 必要なものが表示されているので､ 先に進んで次をクリックします｡
‫では､ 親クラスの設定方法を紹介したので､ このコンポーネントの作成に挑戦してみたいと思います｡
‫そこで､ トリガーコンポーネントと名付け､ 同じように設定されていないため､ これまで作成した他のコンポーネントからいくつかコピーする必要があります｡
‫別の親から派生しているので､ youクラスの行をコピーする必要があります｡
‫その行全体は､ あなたが作成するトリガーコンポーネント上では基本的に空です｡
‫そのため､ グラバーまたはムーバーのどちらかからコピーします｡ そうしないと､ コンポーネントをブループリントに追加することができません｡
‫そこで､ この新しいトリガーコンポーネントを使用して､ 現在のボックスコンポーネントを置き換え､ Begin Playから何かをプリントする必要があります｡
‫繰り返しますが､ プレイ中の大きな設定は自動的に行われませんので､ 設定するには他のコンポーネントのヘッダーファイルとC++ファイルからコピーする必要があります｡
‫ビデオを一時停止して､ 試してみてください｡
‫なるほど｡
‫お帰りなさい｡
‫そこで､ トリガー部品と呼ぶことにします｡
‫すべて一言で､ クラスを作るために打つ｡
‫また､ エディタでBP secret wallに移動して､ このコンポーネントを追加し､
‫トリガーを検索しても､ 何も表示されないことがわかります｡
‫この理由は､ grab a dot Hでuse classの行を見ると､ ここにblueprint spawn
‫able componentと書かれているのがわかるからです｡
‫だから決定的に､ これをコピーする必要があるのです｡
‫また､ クラスグループも持っています｡
‫このコンポーネントをブループリントで作成し､ トリガー コンポーネントのクラス行として貼り付けることができるため､
‫全体をコピーすることもできます｡
‫そしてもうひとつ､ grabに移動すると､ 大きなplayがあるのがわかりますが､
‫これは保護されたセクションの中にあります｡ begin play関数の定義をコピーして､ トリガーコンポーネントにコピーし､
‫grabberにあったように､ 生成した本体のすぐ下に置きます｡
‫そして､ grab a CPに入り､ どれだけ大きなインプレイが定義されたかを確認することができます｡
‫この中に､ 実は重要なクールからスーパービッグまでの遊びがあることがわかります｡
‫これをコピーして､ トリガー・コンポーネントに移動します｡
‫CP そして､ you grab a colon コロンをyou trigger component, begin playに変えます｡
‫そして､ この中にyou logを入れて､ trigger component aliveのような簡単なメッセージを書いて､
‫先に進んでコンパイルします｡
‫ヘッダーファイルにかなり大きな変更を加えているため､ 少し時間がかかるかもしれません｡
‫それが終わったら､ BPのシークレットウォールに入り､ 「追加」から「トリガー」を検索します｡
‫そして､ この中にトリガー部品があるのがわかると思います｡
‫これで追加できるようになりました｡
‫以前設定したトリガーエリアを削除することができます｡
‫ただ､ それを削除して､ まだ削除したいことを確認してください｡
‫これは基本的に､ 作成したこのイベントを無効にするもので､ もし見るのであれば､ トリガーで衝突が思い通りに設定されていることを確認できます｡
‫しかし､ すべてのダイナミックにオーバーラップし､ オーバーラップイベントが発生するように設定されています｡
‫最後に､ このイベントを置き換える必要があります｡ ここでは､ トリガーを右クリックして､
‫トリガーの衝突の追加イベントを展開し､ コンポーネントの重なりの開始を追加します｡
‫以前はそれを使っていたのです｡
‫アクティブピンを引っ掛け､ 実行ピンを引っ掛けるとダンジョンレベルに向かいます｡
‫ガーゴイルを拾ってきて､ 床の間に貼り付けてみると､ うまくいかないことに気づきます｡
‫これでトリガーが設定されたわけです｡
‫ビューポートに移動してみると､ 実はトリガーが十分な大きさになっていないことがわかると思います｡
‫正しい位置づけができていない｡
‫そこで､ アルコーブの中央に配置して､ ボックスの範囲のプロパティを増やして､ このアルコーブ領域の内側に置くものをすべて捕捉できるようにしましょう｡
‫少し大きめで､ 安全マージンを与えてくれて､ ダンジョンに入ってプレイを押して､ 床の間に足を踏み入れることができれば問題ないのです｡
‫そして案の定､ BPプレイヤーがその床の間に入ってきたことを検知するのです｡
‫素晴らしい内容です｡
‫この講義では､ オブジェクト型とオブジェクト型レスポンスについて学び､ それを使ってこのトリガーコンポーネントをセットアップしました｡
‫それでは､ 次回の講義でお会いしましょう｡