‫こんにちは｡
‫ようこそ｡
‫この講義では､ グラボをより信頼性の高いものにすることを目指します｡
‫また､ 掴んだコンポーネントをドロップできるようにすることで､ コンポーネントを投げたり､ 一般的にもう少し便利に使えるようにする予定です｡
‫では､ どのように行われるのか､ 潜入してみましょう｡
‫さて､ このガーゴイルを拾えないことが多いのは､ パフォーマンスのために物理シミュレーションを行っているコンポーネントが､
‫一定時間静止するとスリープしてしまうからです｡
‫そして､ それを見ているのです｡
‫このガーゴイルの物理シミュレーションは眠りに入っていて､ 物理ハンドルでくっつけても起きないんです｡
‫そこで､ 私たちが身につけるべきは､ 球体トレースで叩くと目が覚めるということです｡
‫さて､ ここまで見てきたユープリミティブコンポーネントのドキュメントを見てきましょう｡
‫ユー・プリミティブ・コンポーネントは､ 我々のヒット結果が返すものですが､ 実際にプリミティブ・コンポーネントは何でしょうか？
‫つまり､ プリミティブコンポーネントとは､ 何らかのジオメトリを含むか生成し､ レンダリングしたりコリジョンデータとして使用するシーンコンポーネントであると､
‫このドキュメントには書かれているのです｡
‫つまり､ 一般的にプリミティブなコンポーネントとは､ 物理シミュレーションができるものを指します｡
‫ですから､ ここには物理シミュレーションの手法も出てくることが予想されます｡
‫そして､ これから探すのは､ wakeというキーワードが入った関数です｡
‫これからいくつかの関数を見て､ Wake all rigid bodiesという関数を探します｡
‫リジッドボディとは本来､ 物理をシミュレートするオブジェクトのことを指す物理学用語です｡
‫だから､ 空洞があるのがわかるんです｡
‫戻り値型は引数を取らない｡
‫だから､ アタッチしようとするときに､ これを呼び出せばいいはずだ｡
‫つまり､ if文の中のgrab a CPで､ このコンポーネントにヒットしたら､ それを取得するところです｡
‫まず､ このプリミティブコンポーネントを格納するための変数を作る必要があります｡
‫そこで､ ヒットコンポーネントというプリミティブコンポーネントのポインタを用意し､ ヒット結果であるドットゲットコンポーネントと等しくなるように設定します｡
‫そして､ そのヒットコンポーネントポインターを使用して､ すべての剛体を矢印で起こして､ 最後に括弧とセミコロンを付けます｡
‫つまり､ 物理ハンドルに反応するように､ このコンポーネントを起動させればいいのです｡
‫では､ ヒット・リザルトを行ったところを置き換えてみましょう｡
‫コンポーネントの位置を取得するための物理ハンドルの呼び出しでコンポーネントを取得しないでください｡ なぜなら､ そのための変数ができたので､
‫それが終わったらリコンパイルしましょう｡
‫さっそく再生を押して､ ガーゴイルをとりあえず床に少し座らせて寝かせてから､
‫拾ってみましょう｡
‫そして､ 手に取ったり､ 床に寝かせたり､ 何の問題もないことにお気づきでしょう｡
‫大丈夫です､ それらの物理剛体を起こして､ 持ち上げたり掴んだりできるようにシミュレーションを開始します｡
‫さて､ お気づきかもしれませんが､ 現在､ 物理ハンドルを解放することができませんので､
‫release関数でそれを行うことがあなたの課題となるでしょう｡
‫つまり､ その物理ハンドルにreleaseコンポーネントを呼び出すわけだ｡
‫それは､ 物理ハンドルのポインターで利用できる機能です｡
‫まず､ get grabbedのコンポーネントがあるかどうかを確認することになります｡
‫そのため､ grabコンポーネントへのポインタを返すgrabコンポーネントを取得した場合､ 物理ハンドルが現在何も掴んでいなければ､
‫そのポイントはnullになります｡
‫つまり､ 何か掴んでいるかどうかをチェックして､ 現在何かを掴んでいる場合のみリリースするという使い方ができるわけです｡
‫そして､ おまけに､ もう一度目標を設定できるかどうか､ 試してみることができます｡
‫何か掴んでいるときだけですが､ ビデオを見てやってみてください｡
‫お帰りなさい｡
‫では､ さっそくカップを手に取ってみましょう｡
‫リリース機能に入り､ リリースログを削除するつもり｡
‫そして､ この中にif文を入れて､ ifと言いながら､ 物理ハンドルを手に入れる必要があるのです｡
‫まず最初に､ 物理ハンドルと呼ぶコンポーネントポインタを取得し､
‫物理ハンドルの取得と等しくなるように設定します｡
‫物理ハンドルがヌルポインターと等しい場合は､ 何もできず､ 何も解放できないので､
‫先に進んで戻りたいと思います｡
‫物理ハンドルが全くない場合は､ 現在物理ハンドルで何かを掴んでいるかどうかをチェックしたい｡
‫例えば､ 物理ハンドルの矢印が掴まれたコンポーネントの括弧がヌルポインタと等しくない場合､ このif文の本体の中では､
‫現在掴まれているものがあることを意味します｡ では､
‫物理ハンドルの矢印の解放コンポーネントを作成します｡
‫コンポーネントを解放する前に､ get grabbed components
‫を呼び出して､ コンポーネントをつかむ前と同じように weak all rigid bodies
‫を追加しておくとよいでしょう｡
‫なぜなら､ 仮に部品を育てて少しの間動かさないと､ 部品も眠ってしまうかもしれないからです｡
‫だから､ それを公開しても何の意味もないのです｡
‫物理ハンドルが現在何もつかんでいない場合､ tick でターゲット位置を設定しないようにするためです｡
‫そこで､ このティックコンポーネントの中に､ 全く同じ内容のif文を入れます｡
‫物理ハンドルの矢印が掴まれたコンポーネントがヌルポインタに等しくないということになります｡
‫そして､ if文の本文では､ ターゲット位置の計算とターゲット位置の設定を､ その物理ハンドルにも入れることにしています｡
‫再コンパイルして試してみましょう｡
‫さっそく再生ボタンを押してみましょう｡
‫そして､ ガーゴイルを掴んでみてください｡
‫そして､ マウスを離すと､ また床に落ちてしまうのです｡
‫それで､ 起きているか寝ているかには影響されないようです｡
‫私たちは､ 基本的に毎回拾っていようがいまいが､ 起こしているようです｡
‫ということで､ 思い通りに動いているようです｡
‫引っかからないんです｡
‫ちょうどいい感じになってきましたね｡
‫ただ､ 少し不思議なのは､ その中に移動すると､ 実際にプレーヤーと衝突しているため､ 奇妙なジッターが発生しているのがわかります｡
‫詳細ペインでガーゴイルに移動して､ すべてのカテゴリを選択し､ コリジョンまでスクロールダウンして､
‫カスタムコリジョンのプリセットとオブジェクトレスポンスの下を見て､ これをほんの少し修正できます｡
‫これについては､ 後ほどもう少し詳しく見ていきます｡
‫ポーン オブジェクトの応答があります｡
‫これは基本的に､ ポーンにぶつかるべきかどうか､ ということです｡
‫ポーンにどう対応すればいいのでしょうか？
‫まあ､ ポーンと重なるように設定するんですけどね｡
‫つまり､ ぶつかっても基本的に無視されるんです｡
‫そしてもうひとつ､ これは実際には2つの静的メッシュで構成されているため､ それぞれにコリジョン設定を行う必要があります｡
‫土のマウンドに降り立つ｡
‫ガーゴイルの下にあるのがそれです｡
‫そして､ ここでは物事を単純化するために､ 実際に行っていることです｡
‫土留めの部分を作るつもりで､ 衝突がない｡
‫そこで､ ノーコリジョンのプリセットに切り替えてみることにします｡
‫そして､ 再生ボタンを押して､ 床に落ちているガーゴイルを掴みます｡
‫そして､ これで走らせてみると､ プレイヤーのコリジョンメッシュと衝突しようとしないので､
‫奇妙なグリッチが発生しないことがわかります｡
‫素晴らしい内容です｡
‫この講義では､ グラブの信頼性を高める方法と､ グラブのコンポーネントを解放する方法について学びました｡
‫素晴らしい内容です｡
‫それでは､ 次回の講義でお会いしましょう｡