この記事ではSTYLYで無重力を表現する方法を紹介します。 Unityの基本的な機能を解説する初心者向けのチュートリアルです。 PlayMakerを利用してコントローラーにColliderを設定する方法も紹介します。
サンプル
STYLY GALLERYからサンプル空間を体験できます。
記事で紹介しているUnityプロジェクトのダウンロードはこちらからできます。 STYLY-Unity-Examples
事前準備
まずは、Githubよりサンプルプロジェクトをダウンロードし、Unityで開いてください。 STYLY-Unity-Examples コントローラーとオブジェクトを衝突させる場合はPlayMakerという有料アセットが必要ですので、これを購入しインポートしてください。 Unity Asset Store Playmaker 自分で用意した3Dモデルがある方は、用意した3Dモデルをプロジェクトにインポートしましょう。
無重力状態にしたいオブジェクトにRigidbodyコンポーネントを追加
Unityには、物体の挙動を物理シミュレーションにより表現する機能が備わっています。 この機能を使うことで、「重力によるものの落下」や「物と物がぶつかったときの跳ね返り」などを簡単に実現することができます。 今回はこの機能を使って、無重力状態を表現します。 まずは無重力状態にしたいオブジェクトにRigidbodyコンポーネントを追加しましょう。
このコンポーネントを追加することにより、オブジェクトは物理演算で動くようになります。 試しにこの状態で再生ボタンを押してみると、オブジェクトは重力により落下していきます。 次に、オブジェクトのRigidbodyの設定にて、「Use Gravity」のチェックを外してみましょう。
この状態で再生ボタンを押すと、オブジェクトは落下せずに空中に浮くはずです。 これでオブジェクトを無重力状態にすることができました。
Colliderコンポーネントの追加
前の項にてオブジェクトの無重力化は完了しましたが、せっかくなのでオブジェクト同士の衝突にも挑戦してみましょう。 オブジェクト同士を衝突させることで、無重力状態の魅力がさらに高まります。 Unityにて物と物を衝突させるには、オブジェクトにRigidbodyだけでなくColliderコンポーネントを追加する必要があります。 このコンポーネントを追加することにより、オブジェクトは当たり判定を持つようになります。 先ほど作成した無重力状態のオブジェクトに、Colliderを追加してみましょう。
Colliderコンポーネントには「Box Collider」や「Sphere Collider」などいくつかの形状があるので、3Dモデルの形に合ったものを選びましょう。 (特にこだわりがなければ「Capsule Collider」を選びましょう)
周囲のオブジェクトにも衝突判定を追加
同じ要領で、周囲のオブジェクトにもColliderコンポーネントを追加していきましょう。 サンプルプロジェクトでは壁を作成しています。
これで無重力状態のオブジェクトが周囲のオブジェクトと衝突するための準備が整いました。
オブジェクトが跳ね返る際の挙動の設定
次にオブジェクト同士が衝突し、跳ね返る際の挙動の設定を行います。 この設定を行わない場合、オブジェクトの反発係数は0に設定されているため、オブジェクトが衝突しても跳ね返りません。 オブジェクトの反発係数を設定するためには、Physics materialを作成し、オブジェクトにアタッチする必要があります。 まずはProjectウィンドウのCreateボタンから、Physics materialを作成しましょう。
これをクリックするとPhysics materialの設定が開きます。 すると、Bouncinessという設定項目があるはずです。 ここに0~1の数値を入力することで反発係数を設定することができます。 今回は、標準的な跳ね返り方を表現するために「0.6」と入力しましょう。 そして「Bounce Combine」の項を「Maximum」に設定します。
これにてPhysics materialの設定が完了しました。 このPhysics materialの設定を無重力状態のオブジェクトに適用するために、Colliderコンポーネントの「Material」の部分にPhysics materialをアタッチしましょう。
コントローラーに衝突判定を追加
いよいよ最後の工程です。コントローラーとオブジェクトを衝突させるために、コントローラーにColliderをつけましょう。 Playmakerにて、“Colliderをシーンに追加し、コントローラーの子オブジェクトにする”ことでこれを実現します。 まずはコントローラーに取り付けるColliderを作成します。 Sceneウィンドウにて空のオブジェクトを作成し、「Controller Collider」と名前を付けます。 sphere colliderコンポーネントを追加し、次のように設定します。 ・Sphere ColliderのRadiusを「0.05」に設定。 作成が終わったら、Prefabとして保存し、シーンから削除します。
つぎに「ウィンドウ」にて作成ボタンをクリックし、空のオブジェクトを作成して「Controller」と名前を付けましょう。作成した「Controller」の中にさらに空のオブジェクトを作成し、「Controller R」と名前を付けます。 このなかにPlaymakerを使用して、コントローラーにColliderを取り付けるための仕組みを作っていきます。 コントローラーにColliderをつけるための仕組みは以下の通りです。 ①「Find game object」でシーン内のコントローラーを見つける。 ②「Get Position」でコントローラーの空間座標を取得する。 ③「Create Object」で先ほど作成した「Controller Collider」をシーン内のコントローラーの位置に出現させる。 ④「Set Parent」でColliderをコントローラーの子オブジェクトにし、コントローラーに追従させる。 Playmakerウィンドウを開き、ウィンドウ上で右クリックして「Add FSM」を選択します。
作成したFSMのなかに、「Find game object」「Get Position」「Create Object」「Set Parent」の4つのアクションを追加していきます。 FSMにアクションを追加するには、Action Browserを使用しましょう。 Action Browserを開いたら、検索欄を利用して「Find game object」「Get Position」「Create Object」「Set Parent」の4つのアクションを検索し、 アクションを「State 1」に追加してください。
まずは「Find game object」の設定です。 Object Nameには「Controller (right)」と入力します。 次にStoreをクリックして「New variable…」を選択し、「Controller」と名付けます。 これで、シーン内の右コントローラーが検索され、「Controller」という変数に格納されるようになりました。
次に「Get Position」の設定です。 Game objectのプルタブをクリックして、「Specify Game Object」を選択します。 オブジェクトを指定する欄が出てきたら右の二本線のボタンを押し、変数を指定できるよう切り替えます。 そして先ほど作成した「Controller」という変数を指定しましょう。 Vectorクリックして「New variable…」を選択し、「Controller Position」と名付けます。 これでシーン内のコントローラーの空間座標が、「Controller Position」という変数に格納されるようになりました。
次に「Create Object」の設定です。 Game objectに先ほど作成した「Controller Collider」というPrefabを指定します。 Positinは先ほど作成した変数「Controller Position」を指定します。 Store Objectをクリックして「New variable…」を選択し、「Created Controller Collider」と名付けます。 これでシーン内のコントローラーの位置にColliderが出現し、「Created Controller Collider」という変数に格納されるようになりました。
最後に「Set Parent」の設定です。 このActionの目的は「シーンに生成したColliderをコントローラーの子オブジェクトにして、コントローラーに追従させる」ことです。 まずはGame objectに先ほど作成した「Created Controller Collider」という変数を指定する作業です。 Game objectのプルタブをクリックして、「Specify Game Object」を選択します。 そして二本線のボタンを押して変数を指定できるよう切り替えて、先ほど作成した「Created Controller Collider」という変数を指定しましょう。 次にParentを設定します。 右の二本線のボタンを押して変数を指定できるよう切り替えたら、「Controller」を選択しましょう。 これでシーン内に生成したColliderがコントローラーの子オブジェクトになり、コントローラーに追従するようになりました。
左手のコントローラーにもColliderをつける場合には、作成した「Controller R」というオブジェクトをコピーして「Controller L」と名前を変え、 「Find Game Object」アクションのObject Nameを「Controller (left)」に変更しましょう。 これにて、コントローラーにColliderを取り付けるための準備がすべて整いました。
シーンごと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」をクリックするだけです。 「シーンアップロード機能」の解説は下記記事に詳しくまとめられていますので、こちらもご参照ください。 Unityシーンアップロード機能の使い方 アップロードが完了したら、STYLYのエディターにてシーンをインポートしてみましょう。 オブジェクトをコントローラーで触ると、ふわふわと宙に浮いて無重力状態になっているはずです。 今回はUnityの物理演算を使って無重力を表現する方法を紹介しました。 無重力状態に限らず、物理シミュレーションを使用するといろいろな表現が可能になります。 ぜひいろいろと試してみてください!