NEWVIEW FEST 2021

2022.01.21(Fri.)~01.31(Sun.)
@SHIBUYA PARCO & VIRTUAL VENUE

XR作品体験、ライブ、トーク、ポップアップetc.XRカルチャーの最前線を発信
3次元空間での表現と体験のデザインを開拓するNEWVIEW初の複合型イベント

【Unity/Playmaker】コントローラーを3Dモデルに衝突させて動かす方法

この記事では、Playmakerを利用したコントローラー情報の取得と、Rigidbody・Colliderを利用した衝突と物理動作について説明します。

空間上に配置されている3Dモデルとコントローラーが衝突し、3Dモデルが動くアクションを実装します。

通常のオブジェクトに触れても、コントローラーは特に何もおきず、通過してしまいます。この状態だと、空間として不自然です。3Dモデルにふれると、3Dモデルが衝突によって動くインタラクションを実装します。

STYLY上で体験

事前準備

UnityのプラグインであるPlayMakerをあらかじめインストールしておきましょう。

はじめてPlayMakerを使用するひとは、あらかじめ以下の記事を一読することで、理解を深めることができます。

インストールができたら、Playmaker Editorを開き、画面上に格納しておきます。

 

Playmaker Editorを格納

概要

Unityの基礎的な情報として、オブジェクト同士が触れて、衝突の物理作用を発生させるには以下が必要になります。

・衝突するオブジェクト両方に「Collider」が付与されている
・物理作用を発生させるオブジェクトに「Rigidbody」が付与されている

つまり、コントローラーと3Dモデルに「Collider」を設定するのと、3Dモデルに「Rigidbody」を付与することで、物理作用を発生できます。

今回の大きな流れは、以下です。

  1. 3Dモデルの準備
  2. 衝突させる3Dモデルに「Collider」を付与する
    ※あらかじめ付与されているモデルを使用する場合は、必要ない
  3. 衝突させる3Dモデルに「Rigidbody」を付与する
  4. シーン内にコントローラー用の「Collider」を作る
  5. コントローラー情報を取得したオブジェクトに、コントローラー用の「Collider」を付与する

3Dモデルの準備

最初に、衝突させる3Dモデルを作りましょう。今回は、Cubeのモデルを作ります。

Hierarchy上で、右クリックをし「Create > 3D Object > Cube」を選択し、作りましょう。

 

Cubeをつくる

このままでは、Cubeはとくに何も動かず、コントローラーが触れてもすり抜けてしまいます。

物理作用を発生させるためには、Cubeに「Collider」と「Rigidbody」というコンポーネントを付与する必要があります。

その説明をします。

衝突させる3Dモデルに「Collider」を付与する

【 Collider 】

Colliderは衝突判定を計算するコンポーネントです。対象の3Dモデルに付与することで、他の3Dモデルに触れたときに「衝突した」という情報が取得されます。

 

Collider

通常、Unityのシーン上で作ったCubeやSphereには初期状態で付与されていますが、インポートした3Dモデルには付与する必要があります。

付与する場合には、Inspecter内の、「Add Component」から付与できます。

 

付与するモデルの形に合わせてColliderを選択しましょう。

Colliderを付与することで、3Dモデルに衝突判定が取得されるようになりました。

次に衝突させる3DモデルにRigidbodyを付与します。

衝突させる3Dモデルに「Rigidbody」を付与する

【Rigidbody 】

Rigidbodyは衝突判定を計算し、物理作用を実行するコンポーネントです。つまり、Colliderが付与されている3Dモデルが衝突した際、Rigidbodyが付与されていると、衝撃によって3Dモデルが動くようにしてくれます。

Rigidbodyを付与するには、Add Componentより「Rigidbody」を選択しましょう。

Rigidbodyを追加

Rigidbodyを付与しましたら、設定項目の「Use Gravity」のチェックマークを外しましょう。

Use Gravityのチェックを外す

これで、衝突する3Dモデルの設定ができました。

シーン内にコントローラー用の「Collider」を作る

コントローラーオブジェクトそのものに衝突の設定はできません。
シーン内に「Collider」を追加し、コントローラーの子オブジェクトとして追従させることで、コントローラーに衝突の設定を追加できます。

 

イメージ図

まず、最初にHierarchy内に「Create Empty」で空のオブジェクトを作ります。名前を「Controller Collider」とします。

 

名前を変更

Add Componentから、Sphere Colliderを追加し、Sphere ColliderのRadiusを「0.05」に設定します。

Sphere Colliderを追加

作成したSphere ColliderはPrefab化し、Hierarchyから削除しましょう。

 

Prefab化

次は、コントローラーの設定をします。

コントローラー情報を取得したオブジェクトに、コントローラー用の「Collider」を付与する

コントローラーの情報を取得するオブジェクトを作ります。

Hierachy内に「Create Empty」で空のオブジェクトをつくり、名前を「Controller」にしましょう。
「Controller」を選択し、その中に2つからのオブジェクトをつくり、名前を「Controller (right)」「Controller (left)」とします。この際にControllerと(right)の間に半角スペースが入ります。1文字でも間違えると、機能しないため、注意してください。

このController (right)/(left)にPlaymakerでアクションを追加します。

 

Controller (right)/(left)

Controller (right)を設定します。

大まかな流れは以下のようになります。

  1. 「Find game object」でシーン内のコントローラーを見つける。
  2. 「Get Position」でコントローラーの空間座標を取得する。
  3. 「Create Object」で先ほど作成した「Controller Collider」をシーン内のコントローラーの位置に出現させる。
  4. 「Set Parent」でColliderをコントローラーの子オブジェクトにし、コントローラーに追従させる。

この際にPlaymakerのアクションの順番が上から

  1. 「Find Game Object」
  2. 「Get Position」
  3. 「Create Object」
  4. 「Set Parent」
    でないと、正しくPlaymakerが動作しません。注意しましょう。

Controller (right)にFSMを追加しましょう。

Controller (right)を選択した状態で、Playmaker Editorを右クリックし、「Add FSM」を選択します。

Add FSM

Add FSMを選択すると、State 1が追加されます。
State 1を選択し、右の「State」タブの右下にある「Action Browser」を選択し、開きましょう。

Action Browserをひらく

Action Browserから今回設定する「Find Game Object」「Get Position」「Create Object」「Set Parent」を追加しましょう。

順番に気を付けてください。上から順に以下になります。

  1. 「Find Game Object」
  2. 「Get Position」
  3. 「Create Object」
  4. 「Set Parent」

4つのアクションを追加

「Find game object」でシーン内のコントローラーを見つける。

Object Nameを「Controller (right)」とします。
※ Controller (right) の文字をコピーしてお使いください。
文字を間違えてしまうと正しく動作しないので気をつけてください。

右コントローラーを取得する場合:Controller (right)
左コントローラーを取得する場合:Controller (left)

次にStoreをメニューバーを開き「New variable…」を選択し、名前を「Controller」にします。
これで、シーン内の右コントローラーが検索され、「Controller」という変数に格納されるようになりました。

Find Game Objectの設定

「Get Position」でコントローラーの空間座標を取得する。

Game objectのメニューバーを開き、「Specify Game Object」を選択します。
メニューバーの横の右の二本線のボタンを押し、Find Game Objectで作成した「Controller」変数を指定します

Vectorのメニューバーの「New variable…」を選択し、名前を「Controller Position」とします。
これでシーン内のコントローラーの空間座標が、「Controller Position」という変数に格納されるようになりました。

 

Get Positionを設定

「Create Object」で先ほど作成した「Controller Collider」をシーン内のコントローラーの位置に出現させる。

Game objectに、Prefab化した「Controller Collider」をドラッグし、追加します。

Positionは、Get Positionで作成した変数「Controller Position」を指定します。

Store Objectのメニューバーを開き、「New variable…」を選択し、名前を「Created Controller Collider」とします。
これでシーン内のコントローラーの位置にColliderが出現し、「Created Controller Collider」という変数に格納されるようになりました。

Create Objectを設定

「Set Parent」でColliderをコントローラーの子オブジェクトにし、コントローラーに追従させる。

Set Parentは「シーンに生成したColliderをコントローラーの子オブジェクトにして、コントローラーに追従させる」ことができます。

Game objectにCreate Objectで作成した変数「Created Controller Collider」を指定します。
Game objectのメニューバーを選択し、「Specify Game Object」を選びます。
項目横の二本線のボタンを押して変数を指定できるよう切り替えて、先ほど作成した「Created Controller Collider」という変数を指定します。

Parentを設定します。
右の二本線のボタンを押して変数を指定できるよう切り替えたら、「Controller」を選択します。

Set Parent を設定

これでシーン内に生成したColliderがコントローラーの子オブジェクトになり、コントローラーに追従するようになりました。

Controller (right)は右のコントローラの設定となります。

以上がTRIGGER EVENTによるインタラクションの設定の方法でした。

以上がコントローラーと3Dモデルを衝突させる方法になります。

 

最後に、あらためてポイントをまとめると

・衝突するオブジェクト両方に「Collider」が付与されている。
・物理作用を発生させるオブジェクトに「Rigidbody」が付与されている

が必要条件です。この考え方と方法を利用して、インタラクションが実装されたVR空間を作ってみましょう!

STYLYへアップロード

実際にSTYLYにアップロードしましょう。

一つ注意点があります。
それは、PrefabとしてSTYLYにアップロードするのではなく、シーンごとSTYLYにアップロードするという点です。

STYLYは仕様上、アップロードしたPrefabに自動でColliderを生成しているため、PrefabとしてSTYLYにアップロードすると予期せぬ挙動をする場合があります。

シーンとしてSTYLYにアップロードした場合、自動でColliderを生成することはありません。
ですので、ColliderやRigidbodyを利用して物理シミュレーションを体験に組み込みたい場合は、シーンごとSTYLYにアップロードする方法が向いています。

シーンごとSTYLYにアップロードする方法はとても簡単です。
まずはシーンに余分なものが含まれていないことを確認し、シーンを保存します。
この時、シーン内のMain Cameraは不必要ですので、必ず削除するよう注意しましょう。

保存が終わったら、Projectウィンドウから保存したシーンを選択して「Upload Prefab or Scene to STYLY」をクリックするだけです。

実際にアップロードしたのがこちらです。

STYLY上で体験

アカウント作成方法

STYLYにアップロードする方法

UnityからSTYLYにprefabをアップロードする方法

オリジナリティ溢れる作品を制作してみましょう!

 

newbview popup