‫こんにちは､ ようこそ｡
‫この講義では､ プレイヤーの視点から物事を見ていくことになります｡
‫プレイヤーのビューポート､ カメラの位置と回転を取得し､ トリガーボタンを押したときにデバッグ用カメラを描画できるようにするためです｡
‫この赤い小さな箱型のカメラは､ ビューポートの位置を示しています｡
‫そして､ それを確認することができます｡
‫それを後で銃のレイトレーシングに利用することができます｡
‫そのすべてを､ 実際に飛び込んで見てみましょう｡
‫この講義は､ まず質問から始めましょう｡
‫このようにビューポートで照準を合わせ､ 画面の中心をD on Dコマンドセンターまたはゼロコマンドセンターに合わせようとしている場合､
‫それがどのようなものであれ､ その意味は同じです｡
‫そして､ 私は何を目指すのか？
‫何を打てばいいんだろう？
‫と言われるかもしれませんが､ そのゼロに当たることを期待しているのです｡
‫サム それは当然の答えのような気がします｡
‫まあ､ やり方､ リキャストの仕方によっては必ずしも当たるとは限りませんが｡
‫では､ リキャストの戦略を見てみましょう｡
‫一番わかりやすいのは､ 「銃から発射しているから､ 銃身をリキャストする」というものですね｡
‫ところで､ このセットアップ､ とてもとても粗末なものですが､ 基本的に私たちの三人称のセットアップなんです｡
‫後ろにカメラがあります｡
‫キャラクターも､ 銃もある｡
‫そして､ こっちの別のターゲットキャラを撃とうとしている｡
‫それで､ まあ､ まず､ あのピュアな感じで銃からリキャストしたんです｡
‫カメラが銃の向いているところに向いていないから外れるのかもしれませんが､ そうとは限りません｡
‫同じ方向を向いていても､ 微妙にずれているので､ 必ずしも同じものに当たるとは限りません｡
‫その代わり､ カメラからのリキャストを選択することもあります｡
‫つまり､ カメラが見ているものがそのまま被写体になるということで､ 一般的に三人称視点のゲームではその方が自然に感じられるのです｡
‫一人称視点のゲームでは､ 樽に非常に近い位置にいることが多いので､ 物事が少し近くなります｡
‫しかし､ 一人称視点のゲームでも､ このルールはありがちです｡
‫画面上の照準点がどこにあるのか､ 動き回らないようにしたいものです｡
‫通常､ 画面の真ん中のここに小さなUIが重なりますが､ そこを下に向けることになります｡
‫そのため､ このビューポートの下にある光線投射された武器で光線投射を行うことが多いのです｡
‫さて､ 幸運なことに､ このビューポートを取得する方法があります｡ 実際にコントローラからそれを行うことで､ コントローラのビューポートを取得できます｡
‫そのため､ キャラクタのところに行き､ そのキャラクタのコントローラを見つけ､ そのビューポートの位置と回転を見つける必要があるのです｡
‫そして､ この講義で行うのは､ そのビューポートの位置と回転が期待通りのものであることを視覚化して確認することです｡
‫そして､ デバッグヘルパーをいくつか描くことによって､ それを実現するつもりです｡
‫これで､ デバッグヘルパーはヘッダーファイルの中にあり､ ヘッダーファイルの名前はdebugとなります｡
‫助っ人
‫面白いことに､ 私は信じるか､ 描画､ デバッグヘルパーを描画します｡
‫それです｡
‫そして､ このF12を見て､ もしすでにヘッダーファイルを持っているのであれば､ ヘッダーファイルに移動して､
‫camera draw debug cameraというものを探してみましょう｡
‫そしてこれは､ 私がここで描いた図のような､ ちょっとした三角形やノスタルジーを利用したものを描画します｡
‫では､ 何を取り込むのか？
‫そのカメラの位置､ カメラの回転を世界に取り込むのです｡
‫だから､ 位置､ 回転､ 視野｡
‫まあ､ おそらくデフォルトで90度くらいに設定するんでしょうけど｡
‫目盛りがあり､ カラーデフォルトがある｡
‫これらはすべて既定値です｡
‫だから､ そのデフォルトを使えばいいんです｡
‫デバッグ用のカメラを銃の中に描き､ それをプルトリガーメソッドに入れます｡
‫まず必要なのは､ 何だったのか？
‫新しい世界だったのです｡
‫だから､ 私たちの世界を手に入れることができるのです｡
‫しかし､ 次に必要なのは､ 場所でしょう｡
‫とりあえずアクターロケーションを取得して､ アクターローテーションも取得してやりましょう｡
‫そして､ 最後に必要だったのが､ 視野角です｡
‫そこは適当に90度の視野にして､ コンパイルして､ これが表示されるかどうか見てみましょう｡
‫そして､ 再生してヒットしよう｡
‫トリガーボタン
‫何も表示されないんだけど
‫F8をやって､ 近づけるかどうかやってみよう｡
‫まだ､ ここにカメラのようなものは映っていません｡
‫本当に､ 小さいのかなと思います｡
‫そこで､ もう一つの選択肢として､ 永続的な行を用意することが考えられます｡
‫つまり､ C++でスケールを1に設定できるように､ それまでのすべてを指定する必要があるわけです｡
‫万が一､ 大きさが問題なら､ 2倍の大きさにすることも可能です｡
‫目につきやすい色､ たとえば赤を選べばいいんです｡
‫だからFカラー､ コロン､ コロン､ 赤｡
‫そして､ しつこいセリフは真に受けて､ あれこれ試してみるのもいい｡
‫そこで再びコンパイル｡
‫そして､ プレーに飛び込むこと｡
‫そして､ そこに行く｡
‫ヒットしました｡
‫きっかけは｡
‫そして､ トリガーを押すとここに小さなカメラボックスが表示され､ 銃と位置と回転が設定されているのがわかると思います｡
‫そこで､ 今度はビューポートの取得を試みたいと思います｡
‫ですから､ 先ほどから申し上げているように､ これは私たちのコントローラーに搭載されることになるのです｡
‫コントローラHを見てみましょう｡ ここでもゲームフレームワークのものが欲しいので､ ここでviewportを探します｡
‫なんですって？
‫実は､ 視点というのは私たちが探している言葉で､ ここにもいくつかあるんです｡
‫アクターアイを取得するアクターの目を通して見ることになる視点｡
‫しかし､ 実際には視点の取得プレイをしたいのです｡ アイ・コントローラーの場合は目を使いますが､ プレーヤーの場合はプレーヤーのカメラを使います｡
‫だから､ それを望んでいるのです｡
‫ゲットプレーヤーの視点が欲しい｡
‫しかし､ まずはそのコントローラーを手に入れることが先決です｡
‫シューターキャラクターのCPを開いた状態で､ Begin Playに移動すると､
‫銃の所有者をキャラクターに設定していることがわかります｡
‫つまり､ 銃の中では逆を行くことができるのです｡
‫オーナーをゲットと言えば､ シューターキャラクターが手に入るのです｡
‫今はシューターキャラクターであることがわからないようになっています｡
‫知っているのは､ 自分が俳優であるということだけだ｡
‫だから､ ここでキャストをやるしかないんです｡
‫そこで､ Aシューターキャラクターにキャストをします｡
‫しかも､ 実はシューターキャラクターであることくらい､ 何も知らなくてもいいんです｡
‫ポーンであることが分かれば十分で､ あとはシューターキャラでなくてもポーンなら誰でもこの銃を所持することができます｡
‫だから､ できるだけ非特異的であるようにする｡
‫なぜ､ ポーンである必要があるのでしょうか？
‫ポーンである必要があるのは､ コントローラーを手に入れる必要があり､ コントローラーに憑依できるのはポーンのみだからです｡
‫では､ これを変数にいれてみましょう｡
‫星マークと､ ownerが変数名となります｡
‫そして､ これがNULLでないことを確認する必要があります｡
‫もしNULLだったら､ プールトリガーから早めにリターンするというワンライナーで､
‫NULLポインターで何かを呼び出そうとするリスクを回避するために行います｡
‫そこで､ ポーン・オーナー､ ゲット・コントローラーを行い､ それをAコントローラーに保存したいと思います｡
‫星 そして､ これがオーナーになりうる｡
‫コントローラーです｡
‫そうそう｡
‫なぜなら､ これからメソッドを呼び出すので､ NULLポインタのメソッドを呼び出すことはできないからです｡
‫非現実的な､ 不幸な､ クラッシュさせるのです｡
‫ということで､ ここでオーナーコントローラーができるようになりました｡
‫そして､ そのゲットプレイに視点を呼び込むことができるはずです｡
‫そこで､ その場所と回転を設定することに挑戦です｡
‫その新しい関数を使って､ そのシグネチャを見ることができます｡
‫ここでも､ ファイルより先にコントローラHに行き､ ビューポイントを取得することを見ています｡
‫この署名から､ 描画デバッグヘルパーに渡す位置と回転を取得する方法を考えてみてください｡
‫で､ これはアウトパラメータを使っていると覚えておいてください｡
‫そこで､ アウトパラメータを修正し､ 先ほど書いたスニペットを使ってデバッグカメラを描画し､ ビューポートでテストしてみましょう｡
‫いろいろな場所でトリガーボタンを数回クリックし､ そのカメラがどこでポーズビデオを表示することになるかを確認し､
‫試してみてください｡
‫なるほど｡
‫お帰りなさい｡
‫だから､ 視点を変えて遊んでみてください｡
‫メソッド名をコピーして､ outパラメータなのでこちらに持ってきます｡
‫まず､ その値を入れる変数を宣言する必要があります｡
‫Fベクトルの位置が
‫Fローテーターローテーションを実現しました｡
‫そして､ それらを引数として渡したいのです｡
‫ちょっとインデントを直しますね｡
‫そして､ 場所､ 回転で渡すことになります｡
‫そして､ これを読むと､ ちょうどここで宣言されているので､ C++からこの点に関する構文の助けはないにもかかわらず､
‫これらが今アウトパラメータであると推測することができます｡
‫そして､ アクターの位置の代わりにこの位置を渡し､ アクティブな回転の代わりにこの回転をデバッグ用カメラの描画に渡すことができるのです｡
‫そして､ そのコンパイルをビルドして､ エディターで試してみることができるのです｡
‫さて､ コンパイルが完了したようです｡
‫遊びに行こうよ｡
‫そして､ トリガーを押すと､ 私の視点の真上にカメラが表示されるのです｡
‫それはいい兆候だ｡
‫少し後ろに下がると､ そこが見えてくる｡
‫このカメラは､ 私が見ていたところから､ まさに正しい方向を指しているんです｡
‫だから､ あのカメラの先から光線を発射して､ その時見ていたあそこの何かに当てようとするのは､
‫想像に難くないでしょう｡
‫そして､ それが次の講義で行われることになるのです｡
‫現地でお会いしましょう｡