‫こんにちは､ ようこそ｡
‫この講義では､ ライントレースを設定して､ 壁を撮影して､ これらのデバッグポイントが表示されるのを確認できるようにします｡
‫そして､ 新しい機能であるチャンネル別ライントレースを使って､
‫この作業を行います｡
‫さっそく潜入してみましょう｡
‫ビルディングエスケープでは､ ライントレースを使っていましたが､ ここではこの機能､ オブジェクトタイプ別ライントレースを使っています｡
‫そして､ これは私たちが使いたいものなのでしょうか？
‫さて､ オブジェクトタイプによるライントレースと､ そのごく近い兄弟であるチャンネルによるライントレースとの違いは何でしょうか？
‫オブジェクトタイプは､ この行を検索して､ このタイプに一致するオブジェクトがあるかどうかを確認したい､ と言っています｡
‫そのため､ エスケープを構築する際に使用したのは､ 物理ボディ・オブジェクト・タイプのようなもので､ これは素晴らしい､
‫物理ボディをヒットさせます｡
‫でも､ 急に「他のものを打ってほしい」と思っても､ 選択肢はあまり残らない｡
‫チャンネルは､ 独自のチャンネルを定義し､ どのようなオブジェクトがそのチャンネルを透過し､ どのようなオブジェクトがそれをブロックするかを定義できるため､
‫その点では優れています｡
‫というのも､ ブッシュは弾丸を防げないが､ 壁は弾丸を防げるが､ ダメージは受けない､
‫しかし､ それは後で対処できる､ というようなことが可能になるからです｡
‫つまりチャンネルはこれから行くルートであり､ ここで制御を行うことで正しい方法を見つけることができるのです｡
‫P ところで､ 最近知ったのですが､ ACTシンボルを使うと､ このファイルや他のファイルの中のシンボルを検索できるのですが､
‫ファイルを開いておくと､ もっと早く検索できますよ｡
‫そして､ ライントレースのように､ 関数やクラス､ 変数などのすべてのシンボルのリストを表示し､
‫ライン､ トレース､ テストライン､ トレース､ チャンネル､ オブジェクトタイプごとにシングルで検索することができます｡
‫最初の1行トレース､ シングルBIチャンネル､ これはヒットしたものに対するアウトパラメータを持つことになります｡
‫開始点､ 終了点､ コリジョントレースチャンネルについては後ほど説明します｡ また､ いくつかのクエリーパラメーターはデフォルトで設定されているので､
‫実際に心配する必要はありません｡
‫つまり､ 最初の数項目､ Outhit Start､ End､ Trace Channelが気になるところです｡
‫Traceチャンネルを設定してみましょう｡
‫これについては､ 設定とプロジェクトの設定に行くことになります｡
‫そして､ エンジンの下には､ 衝突の危険性のある場所を探しています｡
‫この下には､ オブジェクトチャンネルとトレースチャンネルがあるのがわかると思います｡
‫オブジェクトチャンネルは､ 実はオブジェクトの種類を表す別の表現に過ぎません｡
‫ですから､ ポーンなどのデフォルトのオブジェクトセットだけでなく､ 新しいカテゴリーのオブジェクトを用意したい場合は､
‫オブジェクトチャンネルを利用することができます｡
‫でも､ トレースを使えば､ 逆に､ 弾丸を持っていて､ どんなものに当たるのか､ ということを定義することができます｡
‫そこで､ このルートで新しいトレースチャンネルを追加し､ このチャンネルをbulletと呼ぶことにします｡
‫と既定路線のような対応になりそうです｡
‫BLOCK つまり､ 基本的にすべてのオブジェクトタイプがそうなるということです｡
‫BLOCK 特に指定がなければ､ このまま進めて､ プリセットを見ることができます｡
‫これを展開すると､ プリセットには､ 適用できるさまざまなものがあることがわかります｡
‫たとえば､ これを物理アクタにしたい場合､ オブジェクトの種類は､ 定義済みのオブジェクトチャンネルである物理ボディになるでしょう｡
‫しかし､ これを拡大すると､ ここにあるさまざまな種類のトレースに対して､ どのような反応を示すかがわかります｡
‫トレースタイプのカメラ､ 弾丸の可視性､ これらすべてをブロックし､ さらにオブジェクトタイプも持っています｡
‫ポーンや乗り物など､ 他のオブジェクトと物理的にどのように相互作用するかということですね｡ それは､ オブジェクトによるライントレースとの相互作用ではありません｡
‫それは若干わかりにくいし､ 以前も混乱したことがある｡
‫トレースタイプは興味深いもので､ ここに目を通すと､ コリジョンしないように設定されていることがわかります｡
‫だから､ 弾丸もそれとぶつからないようにしよう｡
‫プリセットのいくつかをオーバーライドするだけで､ 弾丸が期待通りに動作するようになり､ たとえば､ オーバーラップオールは基本的に弾丸と重なるはずです｡
‫そして､ おそらく見えない壁や見えない壁のダイナミックも､ 今回の弾丸の目的には無視されるべきでしょう｡
‫こちらもダイナミックと同じです｡
‫基本的には､ 視認性トレースに非常に似たものが出来上がることがおわかりいただけると思います｡
‫しかし､ なぜ分けておくかというと､ 「この茂みは見通せないが､ この茂みを撃ち抜くことはできる」というように､
‫ちょっとした区別をつけたい場合があるからです｡
‫そういう意味でも､ 自分たちのトレースチャンネルがあるというのは､ 本当に便利です｡
‫このトレースチャンネルをコードで使えるようにしたいのですが､ ちょっとおかしなことに､ ここには E collision
‫channel という enum があって､ F12 キーを押してその定義を見ると､ 定義済みのもの､ world static - visibility
‫などの束があるのがわかります｡ この下に､ さらにエンジントレースチャンネル1､
‫2､ ゲームトレースチャンネル1､ 2､ 3などがあります｡
‫が定義されています｡
‫これはどれでしょう？
‫ここに弾丸はないだろう？
‫実際にこのゲームトレースチャンネルの1つを使うことになりました｡
‫だから､ 本当にちょっとわかりにくいんです｡
‫どっちなんだ？
‫そのためには､ プロジェクトフォルダからconfigに移動します｡
‫そして､ デフォルトのエンジンINIをテキストエディタで開きたいのです｡
‫だから､ 好きな文章でやればいいんです｡
‫Visual Studioのコードにドラッグして､ Visual Studioのコードがそれを開くようにするのが好きです｡
‫そして､ この中で弾丸を探し､ それが何に割り当てられているかを確認したいのです｡
‫そして､ この最初の行は､ このチャンネルがゲームのトレースチャンネル1であることを物語っていると思います｡
‫ファンタスティック｡
‫だから､ ライントレースをするときには､ それを使うことになるのです｡
‫では､ このライントレースの構造を整えていきましょう｡
‫まず必要なのは､ スタート地点です｡
‫すでにあるんです｡
‫これがビューポートの位置です｡
‫また､ ライントレースの終点が必要ですが､ これは計算が少し難しいです｡
‫そこで､ 終点のFベクトルを作成しましょう｡ 停止点を使って計算し､
‫それに回転を掛けて､ 遠ざかりたい距離を計算します｡
‫回転ではなく､ 回転の方向を指すベクトルというのは､ 少し分かりにくい感じがしますが､
‫実は回転ベクトルを行うと､ この回転の方向を指すベクトルが得られます｡
‫これは､ アニメーションの設計図でベクトルから回転を得るために行っていたことと､ 逆のことをしているようなものです｡
‫これは逆も然り｡
‫位置情報＋回転ベクトル､ そして､ 基本的に最大範囲にしたいわけです｡
‫ここでは新しいプロパティを導入して､ どこでも編集できるようにし､ このようにMax Rangeというフロートにします｡
‫そして､ デフォルトで10,000とか最大1000の範囲に設定すればいいんです｡
‫100mくらい､ すみません､ 10mくらいになりますね｡
‫そして､ 回転ベクトルに最大範囲を掛け合わせたものに移行するのです｡
‫つまり､ この回転から得られるベクトルは､ サイズ1になるわけです｡
‫これに最大範囲を掛けると､ 最大範囲が何であれ､ サイズの大きなベクトルになります｡
‫そして､ それを位置情報の上に追加することで､ 終点を得ることができます｡
‫その数学の100%に従わなくとも心配はない｡
‫重要なのは､ こうやってエンドポイントにたどり着きたいということです｡
‫そして､ ここにライントレースを追加するための To Do 行を追加します｡
‫また､ 別の描画デバッグヘルパーを使用したいので､ この描画デバッグカメラを削除します｡
‫ここにあるデバッグポイントを描きたいのです｡
‫世界を取り込み､ 位置や大きさ､ 色を取り込む｡
‫そして､ それがしつこいかどうかは別として､ 私たちはおそらく､ しつこく､ 目に見えるようにしたいと思うのです｡
‫だから､ この路線でやっていけるはずです｡
‫それでは､ デバッグポイントを描画して､ ここですぐに世界を取得することにします｡
‫そして､ ビューポートの位置から始めます｡
‫そして､ セミコロンを大文字にして､ エンジンの上でコンパイルを実行し､ 再生ボタンを押して､ これが機能しているかどうかを確認することになります｡
‫そこで､ 撮影して少し後ろに下がると､ そこに点があるのがわかります｡
‫しかし､ 本当に本当に小さくて見づらい｡
‫だから､ 代わりにこれを20に増やそうというのです｡
‫その方がいいのかどうか､ 見てみましょう｡
‫コンパイルして再生する｡
‫うん｡
‫案の定､ 今はとてもとてもわかりやすい点が見えています｡
‫では､ そろそろチャンネル別のライントレースにチャレンジしてみましょうか｡
‫以前はオブジェクトタイプでやっていたので､ それを応用してチャンネルでやってみたいと思っています｡
‫そこで､ すでに定義した場所と終わりを開始と終了として使用します｡
‫if文を作成した結果の成功を確認する｡
‫そのため､ outのパラメータだけ取得したり､ ヒット結果のパラメータを取得して､ デバッグポイントだけを描画します｡
‫うまくポイントを押さえたら､ ドットINIファイルで見つけたチャンネルも使っていることを思い出してください｡
‫そこで､ ビデオを一時停止して､ これらのパラメータと引数をすべてライントレースに整理して､
‫ライントレースでヒットしたデバッグポイントを描画できるかどうかを確認してください｡
‫さて､ この段階では､ プレイヤーアクターを無視するようなスマートなことはしていません｡
‫そのため､ ライントレースがプレイヤーに当たってしまうことがありますが､ 今回のチャレンジでは問題ありません｡
‫ビデオを一時停止する｡
‫行ってみてください｡
‫なるほど｡
‫お帰りなさい｡
‫では､ さっそく潜入してみましょう｡
‫まずは世界を手に入れ､ そこに矢を放つことをやる｡
‫これからチャンネルごとのライントレース単体で行っていきます｡
‫それなら､ ヒットする結果が必要だ｡
‫そこで､ パラメータとして､ まず､ ヒット結果構造体を宣言し､ outパラメータとして渡す必要があります｡
‫これをhitと呼び､ 第1引数として渡します｡
‫それから､ 場所が必要です｡
‫そして､ 終わりも必要です｡
‫それから？
‫次に来るのは？
‫EコリジョンEコリジョンチャンネル｡
‫Eコリジョンチャンネルになるわけですね｡
‫コロン
‫そして､ e cとなるはずですが､ どうでしたっけ？
‫それでは､ デフォルトのエンジンで見てみましょう｡
‫Any e cc game trace channel oneは､ デフォルトのanyで設定されているものです｡
‫ここに必要な議論はあるのか？
‫一緒に行きましょう｡
‫コリジョンパラメーターはデフォルトで用意されていますね｡
‫だから､ ここには何もいらない｡
‫そして､ このために必要なのは､ ブーリアン演算の結果です｡
‫だからB成功｡
‫そして､ とても参考になりそうです｡
‫成功ではないのですか？
‫仮にifが成功するとしよう｡
‫そのデバッグポイントを描きたいのです｡
‫そこで､ これを下に移動させます｡
‫Altキーを押しながら､ 矢印でこのように線を移動させ､ コントロールキーとキーボードの右角括弧でインデントすると､
‫このような形になります｡
‫そして今度は､ 開始点である位置の代わりに､ 実際にヒットした位置が欲しいのです｡
‫だから､ それはそうやってドットロケーションを打つことになる｡
‫そして､ この行の最後にセミコロンが抜けているように見えます｡
‫それを作ってやってみよう｡
‫それができたら､ 再生ボタンを押して､ 世界に出て､ 壁に向かって撃ってみよう｡
‫これでよしとする｡
‫ちょうど私が撮影した位置で､ 壁にポイントが表示されているのがわかると思います｡
‫何度でもできる｡
‫壁から遠く離れると当たるようです､ うちの最大射程がかなり短いので全く当たりません｡
‫そして､ 最大範囲内に入ると､ ヒットし､ ポイントが描画されるのがわかると思います｡
‫ということで､ 無事チャレンジ完了です｡
‫特定のポイントへの表示とライントレースができるようになりました｡
‫次のステップでは､ パーティクル効果を実際に表示させる予定です｡ これは､ 単にデバッグポイントを描くよりもずっとクールなものになるでしょう｡
‫それでは､ 次回の講義でお会いしましょう｡