RaspberlyのブログRaspberlyのブログスマートフォン用の表示で見るRaspberlyのブログUnityネタをメインとした技術系ブログです。にゃんこ大戦争や日常なども。Questの開発ネタをやっていきます。Sなどにもそのまま応用できるかと思います。Touchコントローラーで離れた場所にあるものを掴む方法について解説します。プレイエリアが狭い時や、座ったままプレイさせたい時など自由に動き回るのが困難な時に役立ちます。Quest先行研究www.youtube.comセットアップ前回の記事をあらかじめ見ておいてください。Integrationをインポートしておく必要があります。サンプルシーンの確認Assets/SampleFramework/Usageに様々なサンプルシーンがあります。離れた物を掴むサンプルシーンはDistanceGrabになります。学習や挙動の確認にとても有益です。実行してみるとこんな感じになります。1.42で修正されましたちなみにこのサンプルシーンには深刻なバグが存在しています。それは物を掴んだ時にPlayerが吹き飛ばされることです。原因はGrabbableとPlayerの衝突のようです。2019サンプルシーンのバグ修正このバグを修正する方法を載せておきます。PlayerにはCharacterControllerがくっついています。このColliderとGrabbableのColliderが接触しないようレイヤーを分けます。[Player][Grabbable]レイヤーを新しく作成します(名前はなんでもいいです)シーン内にあるOVRPlayerControllerはPlayerレイヤーにしましょう。この時、子オブジェクトのレイヤーは変えないでください(理由は後述)その後、サンプルシーンの中にあるDistanceGrab~~~と名前のつく掴みたいオブジェクトを全てGrabbableレイヤーにします。最後にProjectSettingのPhysicsからPlayerとGrabbableのチェックを外しておきます。これでPlayerが吹き飛ばされることなくシーンが動きます。他には、CharacterControllerを切ってしまうという手段もあります。Grabber&Grabbable同様Oculus側でコンポーネントが用意されています。そちらを使っていきましょう。IntegrationのAssets/Oculus/sampleFramework/Core/DistanceGrab/Scriptsにあります。DistanceGrabberこちらは物を掴む側、つまり手につけるコンポーネントになります。DistanceGrabbableこちらは物を掴まれる側、つまりオブジェクト側につけるコンポーネントになります。Managerこちらは物を掴む範囲を決めるコンポーネント、DistanceGrabberを使うのに必須です。DistanceGrabberDistanceGrabのシーンにある、DistanceGrabを見てみましょう。Grabberコンポーネントがついているのがわかります。手にあたるオブジェクトにはこのコンポーネントが必要です。Grabberを継承して作られています。Grabberに規準しています。インスペクターパラメーター(追加分)とても多いです。掴める対象物のことをターゲットと呼称します。FocusColor掴むオブジェクトをアウトラインする機能、色を指定できる。Radiusターゲットを見つけるSpherecastの半径。Spherecastを使用している場合、この値が大きいほどターゲットを見つける範囲が大きくなる。Threshholdオブジェクトとの距離がこの値より近い場合は、通常のGrabberと同じように掴みます。この値より離れている場合は手元に引き寄せます。SpherecastSpherecastを使ってターゲットを見つけるかどうか。Velocity離れたオブジェクトを掴む時に、手元に飛んでくる速度。例を用意しました、左手が速度2、右手が速度10です。Distance掴むことのできるオブジェクトの範囲。Layer掴むターゲットにするレイヤーの数字。PlayerPlayerのオブジェクト、子オブジェクトからGrabManagerのSphereColliderを参照するのに使う。Grabbableを継承して作られています。Grabbableに規準しています。通常のGrabbableと同様に、近づいて掴む機能はそのまま使うことができます。GrabManagerこれはGrabする範囲を決定するコンポーネントです。これがないとGrabberが動きません。SphereColliderとセットで扱います。(要isTrigger)サンプルシーンではOVRPlayerControllerの子オブジェクトになっています。プレイヤーの子オブジェクトにする必要があります。Colorから、範囲内のオブジェクトにアウトラインをつけることができます。SphereColliderのRadiusの値を変えるだけで簡単に範囲を設定できます。GrabManagerのスクリプト内ではCollider型で参照しているのでSphere以外のColliderも使うことができる・・・かと思いきや、実はDistanceGrabberがSphereCollider型でGetComponentしているのでSphereしかだめみたいです。実際に掴めるオブジェクトを置いてみるでは実際に掴むことができるオブジェクトをテーブルの上に新しく作ってみましょう。今回もユニティちゃんを使用します。Hierarchyビューでは、Grabbableをアタッチする用に空のオブジェクトを作り、その中にユニティちゃんを格納する構造にします。空のオブジェクトのインスペクターはこんな感じです。前回とほとんど同じですが注意すべき点が2つあります。Grabbableと違い、MeshRendererコンポーネントは必須です。Grabbableをアタッチするオブジェクトに必ずつけましょう。何らかのRendererがついていれば必要ありません。Dynamicにしないと掴むことができません。これだけで準備完了、実際に動かしてみましょう。無事掴むことができ、投げることもできました。まとめ離れているオブジェクトを掴む時はDistanceGrabberコンポーネントを使う手っ取り早く用意するのであれば、Assets/Oculus/SampleFramework/Core/DistanceGrab/Prefabsにあるプレハブを使うのがおすすめ。演出面についてやっていきます。他間違っている箇所、不明な点、わかりにくい点がありましたらコメントにお願いします。今年の振り返り記事です。Touchの開発ネタをやっていきます。Touchの開発ネタをやっていきます。Questの開発ネタをやっていきます。Questの開発ネタをやっていきます。アーカイブおすすめアセット参加グループUnityUnityゲーム開発者ギルドリンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!Raspberlyさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。