‫こんにちは､ ようこそ｡
‫このレクチャーでは､ 実際にガーゴイル像を手にして､ 目の前で持ち運べるようにグラボをセットアップしていきます｡
‫では､ どのように行うのか､ 潜入してみましょう｡
‫それでは､ そろそろこのグラブ部品を回転させて位置で呼び出すことにしましょう｡
‫さて､ 先ほども言いましたが､ 実はこれには2つのパートがあるんです｡
‫コンポーネントを掴んで､ 後でターゲットの位置と回転を設定し､ 動き回るようにする必要があるのです｡
‫まず最初に､ grab関数で､ 物理ハンドルへのポインタを取得する必要があります｡
‫Begin Playの行をコピーして､ グラバーに移動し､ ここに配置します｡
‫そして､ これがヌルくならないように自分を守るために｡
‫さて､ どうなることでしょう？
‫まあ､ 実際､ やりたいことは何もないんですけどね｡
‫物理のハンドルがなければ､ 何もつかめません｡
‫そこで､ このgrab関数の本体全体をif文に入れることもできますが､ ちょっと面倒なことになります｡
‫そこで代わりにできるのが､ いわゆるアーリーリターンというものです｡
‫本来は､ 物理のハンドルがあれば､ というだけなのですが｡
‫イコールNULLポインタに等しい｡
‫ここに二重の等号を入れなければならない｡
‫それ以外は課題です｡
‫そして､ 下に降りてブレースを作り､ ここにリターンを入れればいいのです｡
‫つまり､ 物理ハンドルにヌルポイントがあった場合､
‫すぐに戻り､ 関数の残りの部分を実行しないようにします｡
‫だから､ それを実行するのです｡
‫ヒットしているところに潜り込む｡
‫このログメッセージはもう必要ないのでは？
‫だから､ alt文を削除する｡
‫if文の本文から基本的にすべてを削除して､ グラボを使うことにします｡
‫そこで､ 物理ハンドルの矢印グラブコンポーネントを回転を伴う位置で行うことにします｡
‫そして､ 掴もうとしているコンポーネントを提供しなければならない｡
‫見てもらうとわかるのですが､ 期待しているのはyouプリミティブコンポーネントなんです｡
‫ヒットした結果にそれらしいものがあるかどうか見てみましょう｡
‫プリミティブコンポーネントのドキュメントページを開くと､ get componentがヒットしたプリミティブコンポーネントを返してくれることが分かります｡
‫それこそ､ 私たちに必要なことです｡
‫そこで､ ヒットした結果のドットゲットコンポーネントを探すと､ 第1引数に欲しいものが出てくる｡
‫さて次は､ 骨のFネームです｡
‫今､ 私たちは実際に特定の骨で何かをつかみたいわけではありません｡
‫これはスケルトンメッシュがあればの話ですが､ そうではありません｡
‫静的メッシュなので､ name, underscore noneでOKです｡
‫また､ 一般的に骨の話をするFネームでは､ この話がよく出てきます｡
‫何も入れたくない場合は､ name, underscore noneを使用します｡
‫次に､ それをつかむ場所を指定します｡
‫そして､ 私たちはすでに､ このことを調べたと言いました｡
‫ヒット結果のドットインパクトポイントと､ それから回転､ まあ､ そのコンポーネントの現在の回転でもいいし､ アクターの現在の回転でもいいし､
‫好きなほうを選んでください｡
‫だから､ ヒット結果には部品がつく｡
‫これは､ コンポーネントの回転を取得するためのポインタなので､ そのヒット結果を取得するコンポーネントドット矢印をつかむつもりです｡
‫そこで､ 閉じ括弧を別の行に置き､ セミコロンを置いてステートメントを終了させれば､
‫コンポーネントの取得に効果的なはずです｡
‫さて､ 次のパズルはティックコンポーネントで､ 再び物理ハンドルを使用することになります｡
‫ということで､ とりあえずコードをコピーしてみます｡ 3箇所にコードをコピーするのはちょっと多すぎるので､
‫それを再利用するために関数に引っ張り出すことを考えたほうがいいかもしれません｡
‫しかし､ インテークコンポーネントは､ 我々は物理ハンドルを使用するつもりだ､ 我々は物理ハンドルを取得することができない場合は､
‫早期に返すつもりだ｡
‫そして､ これから行うのは､ その目標位置を設定しようとすることです｡
‫そこで､ 物理演算､ 矢のターゲット位置の設定と回転を処理することにします｡
‫そして､ このことについて少し考えてみましょう｡
‫どのようなターゲットロケーションの設定に興味があるのだろうか？
‫まあ､ 基本的にはエンドポイントのときと同じになるんですけどね｡
‫現在地から､ 前方向の外側に一定距離だけ移動させるのです｡
‫今度は､ これが設定可能になる｡
‫最大つかみ距離を使うこともできますが､ 実際には遠すぎると感じています｡
‫そこで､ Hのグラブで､ Edit Anywhereという新しい使用プロパティを作成し､ ホールドディスタンスというフロートにすることにします｡
‫そして､ これを200に設定する｡
‫だから､ よりプレーヤーに近い存在になるのです｡
‫さて､ CPのグラブに入ると､ ティック関数に入り､ このターゲット位置を作ってみることができます｡
‫つまり､ 目標位置というFベクトルになるわけです｡
‫これは､ コンポーネントの位置を取得し､ 前方ベクトルを取得し､ 保持距離を掛けたものに等しくなるように設定します｡
‫そうすると､ それを目標地点にすればいいわけです｡
‫これが最初の引数で､ 次にターゲット回転が必要です｡
‫そのためには､ 現在のコンポーネントの回転を使用します｡ 周りを見渡すと､ オブジェクトがビューとともに回転するので､
‫コンポーネントの回転を取得して､ 現在のグラバーシーンコンポーネントの回転を取得すればよいのです｡
‫では､ その行の最後にセミコロンを付けて再コンパイルし､ この動作を確認してみましょう｡
‫さて､ コンパイルが成功したら､ ガーゴイルを選択して､ 移動力をSTARTから変更することだけは確認しておこう｡
‫物理に反応して動く必要があるので､ movableにこだわって､ 物理をシミュレートしていることを確認しましょう｡
‫物理のカテゴリーに移動して､ 物理シミュレーションのボタンをチェックしよう｡
‫再生ボタンを押して､ ピックアップしてみよう｡
‫だから､ 今のところ起きていると思うのですが､ 床の中で止まっているようなので､ 理想的ではありませんね｡
‫床の中で動かないように､ 少し持ち上げてみましょう｡
‫そうやって床に落として､ 今度は拾ってみてください｡
‫今､ また床の中で詰まっているようなので､ 2回目もやってみましょう｡
‫なるほど｡
‫だから､ ちょっと頼りなくて､ まっすぐ捕まえるとガーゴイルをうまく拾ってくれて､
‫そのまま拾えることもあるんです｡
‫回転が正しくないことに気づいたのですが､ これは物理コンポーネントをつかむところで間違ったものを使ってしまったからです｡
‫ガーゴイルの回転を手に入れたので､ 今度はその回転を維持するために
‫実際に使う必要があったのは､ グラボの回転を選ぶ際に使っている回転です｡
‫そこで､ これを変更して再コンパイルし､ もう一度再生ボタンを押して､ データを取得することにしましょう｡
‫これでよしとする｡
‫今度は私が握ったので､ 正確な回転を得ることができました｡
‫そして､ バネでつかんでいるように見えるのがおわかりいただけると思います｡
‫壁を突き破ろうとすると､ なるべく壁を通らないようにするんです｡
‫最終的には壁を突き破って飛び出すのですが､ 私が動かすことで物理を観察しようとしているのです｡
‫そこで､ 私は今､ get physics handleという新しい機能を引き出すことに挑戦したいのです｡
‫プライベートになりそうです｡
‫Uを返すはずです｡
‫物理的にコンポーネントを扱うので､ オーナーを取得し､ クラスによってコンポーネントを見つける必要があるこの重複したコードは削除されるはずです｡
‫可能かどうか潜在的にコンストしてログ化することも可能です｡
‫物理ハンドルコンポーネントがない場合は､ それが表示され､ 何か間違ったことをしたことがわかるように､ 警告ログを与えてください｡
‫ビデオを一時停止して､ 試してみてください｡
‫なるほど｡
‫お帰りなさい｡
‫まず､ ファイルの先頭に行き､ privateの部分にこれを入れるのですが､
‫Qのプロパティの下に､ Uの物理ハンドルコンポーネントを返すようにして､ ここにアスタリスクを付けます｡
‫さて､ ここではこのタイプをヘッダーで使用しているので､ 実際にインクルードを取ってグラボから切り出す必要があります｡
‫だから､ 物理ハンドルに関しても含まれていて､ グラボhの中で､ 生成したものの上に置く必要があるんだ｡
‫H ヘッダーファイルの中でいつも最後にあるものですね｡
‫また､ なぜCPでも必要ないのでしょうか？
‫まあ､ グラボhも含めてだから｡
‫つまり､ grab a Hに入れたものは､ 自動的にC pに入るので､ そこにincludeを入れればいいのです｡
‫さて､ この関数を定義するところまで行って､ このような括弧のペアを物理ハンドル取得と呼ぶことができます｡
‫そして､ この関数を呼び出しても､ グラボには何の変化もないはずです｡
‫Uグラバーコロン､ コロンを先頭に貼り付けて､ セミコロンを削除し､
‫中括弧のペアを追加しているところです｡
‫そこで､ この "get over "ラインをカットして､ "get physics
‫"に置き換えるのです｡
‫このように処理します｡
‫そして､ get physics handleで､ get owner find component by classなどを返すだけでよいのです｡
‫これをティックコンポーネントに置き換えて､ 物理ハンドルを手に入れることができます｡
‫その小さなコードを物理ハンドルを取得するために置き換えてみましょう｡
‫しかし､ この時点の練習と､ これからログメッセージを追加してプレイを始めるという事実のために､
‫間違いなく価値があります｡
‫実際には物理を処理させる必要は全くないので､ そこのコードを削除します｡
‫しかし､ これから行うのは､ ログメッセージを追加することです｡
‫ここで結果を格納するために変数を作成します｡ なぜなら､ もしリターンを行ってからログメッセージを表示しようとすると､
‫うまくいかないからです｡
‫そこで､ resultという新しい物理ハンドルコンポーネントを用意することにした｡ なぜなら､ ここから返すのはresultだからだ｡
‫そして､ もし結果がヌルポインターと等しい場合は､ 警告やエラーとしてログに記録する必要があります｡
‫そして､ grab aにはU物理ハンドルコンポーネントが必要で､ if文の後にと言うことになります｡
‫だから､ こうなるのです｡
‫nullであろうとなかろうと､ 結果を返します｡
‫では､ これをコンパイルして､ すべて動作することを確認しましょう｡
‫シーン内で左クリックすると､ 青いオーブやデバッグオーブが描画されます｡
‫素晴らしい内容です｡
‫この講義では､ グラブを使ってガーゴイル像をつかむことができましたが､ 少し不安定なこともあります｡
‫そして､ これからの講義でこれを整理していくのです｡
‫では､ 現地でお会いしましょう｡