‫こんにちは､ ようこそ｡
‫この講義では､ プルトリガーのリファクタリングを行い､ より多くのコードを追加できるようにします｡
‫現時点では､ 本当に手に負えなくなっていたので､ このような小さな関数にリファクタリングして､
‫本当にずっと素直に読めるようにするつもりです｡
‫では､ このリファクタリングをどのように行うのか､ 実際に見てみましょう｡
‫なるほど｡
‫そこで､ ゲームに音を入れたいのですが､ それを実現するのが､ 射撃時の銃の中です｡
‫それが最初の寄港地です｡
‫ショット音やインパクト音のようなものがあるといいと思います｡
‫ただ問題は､ プルトリガー機能に戻ったとき､ それが突飛に大きくなっていることに気づいたことです｡
‫一画面に収まらない｡
‫また､ この機能をどこに配置するのか､ ちょっと読みにくいですね｡
‫ですから､ この機能が何であるかを実際に理解する努力をする一方で､ 簡単なリファクタリングや､
‫他のメソッドにこのようなものを引き出して､ 読みにくくならないようにする価値があるかもしれませんね｡
‫さて､ このコードを見て､ 基本的なことが何であるかを考えてみてください｡
‫このコードの大部分は､ 実は私たちの行のために用意されたものです｡
‫この塊を28行目から43行目まで辿ってみてください｡
‫そして､ 私たちは何をしているのでしょうか？
‫さて､ オーナーポーンを取得し､ オーナーのコントローラを取得することを確認し､ そこからビューポートを取得し､
‫最大範囲に基づいて終了位置を取得しています｡
‫そして､ いくつかのヒットパラメータを渡して､ いろいろなものを無視するようにしています｡
‫これらはすべてライントレースのために用意されたもので､ これを独自の関数に取り出してみてはどうでしょう｡
‫下の方に新しいプライベート関数を作ります｡
‫なぜなら､ successを返すこの呼び出しを､ 単にヒットした結果を返すものに置き換えたいからです｡
‫そこで､ これをガントレース関数と呼んで､ いくつかのアウトパラメータを持つようにします｡
‫すなわち､ どちらかがヒットする結果になるのです｡
‫そこで､ ヒット・リザルト､ アンパサンドでリファレンスにする｡
‫そして､ 定数参照ではないので､ アウトパラメータであることがわかる｡
‫私たちはこれをヒットと呼んでいます｡
‫そして､ 実はもうひとつ必要なものがあるのかもしれません｡
‫つまり､ このコードの塊から回転が発生していることがわかりますが､ 実際にはその回転を否定しているのです｡
‫そこで気になるのが､ 撮影の方向性です｡
‫だから､ それを目指していく必要があるのかもしれません｡
‫そこで､ Fベクトルアウトパラメータを作成します｡ Fベクトルアンパサンドで､ 撮影方向とします｡
‫この2つが､ ガントレースから得られる出力です｡
‫では､ ここで実装を作成してみましょう｡
‫そして､ このコードをすべてそこにコピーすることです｡
‫その様子をご覧ください｡
‫そして､ この撮影の確認も行いたい｡
‫方向性
‫それを外に持ち出して､ 終了間際に突き刺す｡
‫あるいは､ プレイヤーのビューポートを作成した後に､ ショットの方向が回転のマイナスと等しくなるように設定することもできます｡
‫しかし､ ここで重要なのは､ 実はローカル変数の設定ではないことに注意することです｡
‫つまり､ ここにタイプを入れると､ ローカルショットの方向性を設定することになるわけです｡
‫これを削除して､ パラメータに撮影方向を設定するようにします｡ つまり､ この関数を呼び出す際に渡す予定の撮影方向を設定するということです｡
‫ヒットも同様です｡
‫このローカルヒットを削除して､ チャンネルごとのライントレースに渡されるヒットが､ ガントレースに渡されたヒットとなるようにする必要があります｡
‫そして最後に､ 今必要とされていない行を行うために､ また､ これは成功である何かはありますか？
‫まあ､ チャンネルごとのライントレース信号の結果を返していればいいんですけどね｡
‫それは､ 私たちのガン・トレースが成功したかどうかということになるでしょう｡
‫ということで､ このインデントを少し小さくすることに成功しました｡
‫今は1画面に収まるようになり､ 「ああ､ これは全部､ 銃の痕跡を得ることに関係しているんだな」と少し理解しやすくなりました｡
‫銃のCPに移動し､ Bの成功をここに設定することができます｡
‫つまり､ bool B successをガントレースとして設定する必要があり､ ここでいくつかのアウトパラメータを渡す必要があるのです｡
‫そのため､ ヒット・リザルトの場合は､ やはりどこかでそれらを宣言する必要があります｡
‫そのうちのひとつになりそうです｡
‫ヒットを呼ぶだけです｡
‫そしてもうひとつは､ ショットディレクションというFベクトルになる予定でした｡
‫そして､ それらが通されることになるのです｡
‫だから､ まずヒット､ 次にショットの方向性を決めてもらう｡
‫そして､ そこの最後にセミコロン｡
‫だから､ それがちょっとだけ楽になるんです｡
‫しかし､ オーナーコントローラも必要なことに気づき､ ガントレースでオーナーコントローラを担当したり､ オーナーコントローラを忘れたりすることがないようにしたいです｡
‫それはガントレースの責任ではないような気がするのですが｡
‫ヒットしても大丈夫そうですね｡
‫撮影の方向性が決まるのは大丈夫そうですね｡
‫でも､ オーナーコントローラを手に入れるのは､ 一線を画すつもりです｡
‫そこで､ このコードをすべて別の関数に入れ､ その関数の中で両者が呼び出すことができるようにします｡
‫つまり､ これはコントローラを返す関数になるわけです｡
‫スター
‫そして､ それをゲットオーバーコントローラーと呼んで､ コンサートにすることができるのです｡
‫ご存知のように､ これは銃のクラスの変数を変更するものではありません｡
‫その実装を作成してみましょう｡
‫ガントレースから実装を持ってきて､ 必要であればインデントを修正し､ 先に進んでオーナーコントロールを単純に返します｡
‫だから､ ここでNULLチェックをする必要はない｡
‫このNULLチェックは､ それを使用する関数で行う必要があります｡
‫そこで､ そのことを持ち出す｡
‫また､ ここでは変数を設定する必要はありません｡
‫そのまま帰ればいいんです｡
‫だから､ かなりわかりやすいものになると思います｡
‫コントローラーに乗りますが､ 完全ではありません｡
‫そして､ ガントレースで変数を設定するのです｡
‫オーナーコントローラーは､ このようにオーナーコントローラーを取得することになるわけです｡
‫ところで､ ガン・トレースはブール値を返すので､ ブール値を返す必要があります｡
‫オーナコントローラを取得できなければ､ ガントレースもできないので､ ここでfalseを返します｡
‫だから､ 何も当たらないはずはないのです｡
‫そして､ さらに上にあるオーナーコントローラも必要です｡
‫ヒットアクターがいるところでは､ このテイクダメージを行っています｡
‫そして､ 基本的にここでやりたいことは､ オーナー・コントローラーをヒット・アクタの中に入れることです｡
‫だから､ アクターに当たってしまった場合は､ もう一度オーナーコントローラを取得します｡
‫さて､ ガントレーサーの呼び声が少し聞こえてきましたね｡
‫コントローラーを取得して､ アクターに当たったらまたやる｡
‫でも､ それは役者に当たるたびに起こることでしかない｡
‫なぜなら､ 同期が取れなくなる可能性のある変数や状態を保存する必要がなく､
‫コードの可読性が少し向上するだけだからです｡
‫それでは､ どうぞ｡
‫ダメージを受けるために必要なオーナーコントローラを手に入れ､ プルトリガーもだいぶ良くなってきました｡
‫というわけで､ 今回の講義はここまで｡
‫早速ですが｡
‫次の講義で良いベースができるように､ 引き金をリファクタリングするだけです､ そこでお会いしましょう｡
‫それと､ ゲットオーナーコントローラーでちょっと失敗したみたいです｡
‫試しにコンパイルしてみると､ この戻り値は実際にはポインタを返していないため､ 何もできない｡
‫そこで､ この場合は素直にヌルポインタを返したい｡
‫基本的にポーンが手に入らなければ､ コントローラも手に入りません｡
‫そこで､ NULLポインタを返します｡