本日は cluster の技術調査枠です。
cluster の自作ワールドを作成してアップロードする手順を記事にします。
その8はプレイヤーが掴めるアイテムの配置です。
前提条件
前回記事の続きになります。
bluebirdofoz.hatenablog.com
clusterワールドで使えるアイテム
cluster ワールドにはプレイヤーが掴んで操作することができるアイテムを配置することができます。
ClusterCreatorKit にはアイテムを設定するための以下の3つのコンポーネントが提供されています。
コンポーネント名 | 説明 |
---|---|
Item | ワールド上でのインタラクションを作るコンポーネントです。単体は機能を持ちませんが、他のコンポーネントを使用する際に必要となることがあります。 |
Movable Item | Movable Itemを使うと、ワールド内のプレイヤー間でオブジェクトの位置を同期することができます。 |
Grabbable Item | Grabbable Itemを使うと、プレイヤーがオブジェクトを掴んで移動できるようになります。 |
コンポーネントの利用方法は ClusterCreatorKitSample に含まれる以下のシーンに様々な事例があります。
こちらを参考にすると、動きも同時に確認できるので分かりやすいです。
・Assets/ClusterVR/Scenes/ItemSample.unity
掴んで跳ねるアイテムを配置する
掴むことができて、手放すと物理演算に従って地面に落ちて少しバウンドするアイテムを作成してみます。
ItemSample シーンの以下の「跳ねる」アイテムを参考にします。
アイテムの3Dモデルを取り込む
最初にアイテムの3Dモデルを Unity のプロジェクトに取り込みます。
今回は FBX 形式のホロモンモデルを使います。プロジェクトにモデルとテクスチャをドラッグして取り込みます。
これで3Dモデルを Unity に取り込むことができました。
3Dモデルを[Scene]画面にドラッグしてワールドに配置します。
更にトランスフォームを変更して、手で掴むのに最適なサイズに調整しました。
合わせてアタリ判定(Box Collider)も設定しておきます。
アイテムコンポーネントの追加
次に、オブジェクトにコンポーネントを追加してアイテムの設定を行います。
[Add Component]から以下の3つのコンポーネントを追加します。
・Item
・Movable Item
・Grabbable Item
Item
ワールド上でのインタラクションを作るコンポーネントです。
[Id]はアイテムを識別するために自動で割り振られる値になります。
[ItemName]はアイテムの名前です。掴まれたときなどに表示されます。
Movable Item
ワールド内のプレイヤー間でオブジェクトの位置を同期するコンポーネントです。
[Movable Item]設定時に[Rigidbody]がない場合は自動で追加されます。
アイテムの挙動は[Rigidbody]の設定で制御できます。
例えば[Use Grabity]を有効にするとアイテムは重力の影響を受けるようになります。
Grabbable Item
プレイヤーがオブジェクトを掴んで移動できるようになるコンポーネントです。
[Grip]には持ち手となる部分の座標と回転を指定するトランスフォームを設定できます。
[Grip]を設定しない場合はプレイヤーが選択した部分を掴みます。
シーンを再生して挙動を確認します。
アイテムを左クリックで掴むことができ、手放すと地面に落ちれば成功です。
持ち手の位置の調整
掴んだ時にホロモンの全体が見えるように持ち手の設定をしてみます。
持ち手の座標を指定するための空オブジェクトを子オブジェクトとして追加します。
アイテムオブジェクトを右クリックして[Create Empty]を選択します。
追加された空オブジェクトのトランスフォームを変更して、持ち手の位置を決定します。
回転方向は Z 軸の正方向が、プレイヤーの正面方向になります。
作成したオブジェクトを[Grabbable Item]コンポーネントの[Grip]に設定します。
これで持ち手の座標が指定オブジェクトの位置と回転に固定されます。
シーンを再生して挙動を確認します。
ホロモンの全体が見えるように掴むことができれば成功です。
バウンド(跳ね)の設定
次に、アイテムを落としたときに跳ねるように物理特性マテリアルの設定を行います。
Assets フォルダ内で右クリックから[Create -> PhysicMaterial]を選択し、物理特性マテリアルを作成します。
作成した物理特性マテリアルを選択して Inspector ビューを開きます。
[Dynamic Friction]で動摩擦を、[Static Friction]で静止摩擦を、[Bounciness]で弾力の設定が出来ます。
[Firction Combine]と[Bounce Combine]は物体同士が衝突した際に使用される計算式を指定できます。
バウンド(跳ね)の設定は[Bounciness]で変更します。
[Bounciness]の設定を[0.9]、[Bounce Combine]を[Maximum]にして地面にぶつかったときにバウンドするようにします。
物理特性マテリアルを[Rigidbody]コンポーネントの[Material]に設定します。
これでアイテムに弾性のある物理特性が設定され、落としたときにバウンドするようになりました。
シーンを再生して挙動を確認します。
ホロモンを落としたときにバウンドすれば成功です。
アイテムの回転方向の固定
そのままの設定だと、アイテムは慣性に従って自由に回転します。
もし回転方向を固定したい場合は[Rigidbody]コンポーネントの[Freeze Rotation]で固定したい軸を指定しておきます。
こうすると軸回転が固定されたまま、アイテムが跳ねるようになります。
アイテムの影の対処
アイテムを持って部屋を歩き回ったところ、光源と反対側の面が暗くみえてしまいました。
これは部屋の環境光が[Static]でないオブジェクトには反映されず、アイテムを照らさないためです。
部屋の環境光をアイテムにも反映するにはライトプローブを利用します。
Hierarchy 上で右クリックから[Light -> Light Probe Group]で光源を追加します。
追加された Light Probe Group オブジェクトをトランスフォームを変更して部屋の中央に移動させます。
更に環境光が部屋全体を覆うように、大きさを調節します。
ただし黄色い球体がその場所の環境光を取得するので、この球体が部屋の内側に収まるように注意します。
[Light Probe Group]の[Edit Light Probes]をクリックすると、光源取得の球体を編集することができます。
部屋の位置によって色調の変化がある場合は、球体の数を増やすとより正確なライティングが行われます。
ライトプローブに環境光を焼き込みます。
光を焼き込むため、[Light]の設定を[Mixed]に変更します。
環境光の元となる部屋のオブジェクトを全て[Static]に変更します。
これで環境光の作成準備が整いました。
メニューから[Window -> Rendering -> Lighting Settings]で[Lighting]ダイアログを開き、[Generate Lighting]を実行します。
構造が複雑な環境では処理に時間がかかります。
GPU を積んだ PC であれば[Lightmapper]に[Progressive GPU (Preview)]を利用しておくと処理が早くなります。
これでライトプローブの設定が完了しました。
再びシーンを再生してみて確認します。
光源と反対側の面にも部屋の環境光が反映され、オブジェクトがより自然に見えるようになります。
ワールドの更新と確認
前回と同じ手順で再びワールドを更新して確認しました。
次は Booth で販売されていた特殊な機能を持ったアイテムを追加してみます。
bluebirdofoz.hatenablog.com