この記事は2024年4月に執筆しています。Playcanvasのバージョンは1.69.2です
この記事は前回の「Playcanvasでだるま落としを作る#1」の続きとなります。
前回はプロジェクトの作成からエンティティの追加方法を解説しました。
今回は物理設定として、主にCollision、RigidBodyに関してを解説します。
物理設定の準備:AMMOのインポート
AMMOとは簡単に言うと、空間内に物理法則を反映させるためのツールです。
重力により物が落下する、衝突する、摩擦で物が止まる、弾むなどをweb上で模倣することができます。
以下の手順でプロジェクトにAMMOをインポートします。
- ビューポート左上の歯車マークをクリック
- 右手のインスペクターが”SETTING”に変わるので、上から3段目の”PHYSICS”をクリック
- PHYSICSが開かれ、Physics Libraryの右横にある”INPORT AMMO“をクリック
これでAMMOがインポートされました。
AMMOのデータは画面中央下にある”ASSETS”の中にAMMOフォルダーとして格納されています。
ASSETSはアセットフォルダといい、様々なデータを収納する倉庫の様な物です。
今後プロジェクトを作って行く際には、このアセットフォルダにデータをいれ、アセットフォルダからプロジェクトに追加して行く事になります。
Collisionの設定
次は最も重要な事の1つ「Collision」の設定を行います。
Collisionを設定すると、物体同士が衝突するようになります。
まずは以下のBoxにCollisionを設定していきます。
- Boxをクリックし、選択状態にする
- その状態でインスペクター内にある”+ADD COMPONENT”をクリック
- リストが表示されるので、Physics⇨Collisionへカーソル移動し、クリック
これでBoxにCollisionが設定されました。
Collisionが設定されると、エンティティ選択時に色が月ます。
色は様々な色がつきますが、色による意味や役割、機能などは無いようです。
残ったBoxにもCollisionを設定します。
Collisionは”Shiftキーを押したまま選択”で複数まとめて設定できます。
※飛び石になっている場合はcommandキーを押したまま選択です。
これでCollisionである「衝突」が設定されました。
しかしPlaycanvasでの衝突とは「①物と物がぶつかる」「②物と物がすり抜ける」
の2つがあります。
②の詳しい解説はここでは省きますが、簡単に言うとゲームで「ゴールラインを追加したら〇〇」みたいな時はCollisionのすり抜け衝突が発生しているイメージです。
今回はまず①の「物と物とがぶつかる」を実現するために、次の項目で”RigidBody”を設定していきます。
RigidBodyの設定
次に「剛体」と訳される「RigidBody」を設定します。
RigidBodyも複数まとめて設定できるので、以下の方法で一気にRigidBodyを設定します
- commandキーを押したまま、3個のboxをクリックする
※上下に並んでいる場合は、Shiftキー。飛び石の場合はcommandキーで複数選択です。 - 右手のインスペクターから”ADD COMPONENT”をクリック
- リスト表示でPhysics⇨RigidBodyにカーソル移動し、クリック
- これでBoxにRigidBodyがアタッチされましたので、そのままマウスホイールでインスペクターを下にスクロールします
- インスペクター下部に”RIGIDBODY”の項目があるので、”Type”の項目をStaticからDynamicに変更
これでboxにRigidBodyが設定されました。
床にも物理設定を行う
ここまでシーン上のBoxにCollisionとRigidBodyを設定しました。
最後に床(Plane)にもCollisionとRigidBodyを設定します。
床のCollisionでは”Collisionサイズの設定”が必要です。
以下の手順で設定します。
- 左手のHIERARCHYから”Plane”をクリックし、選択状態にする
- 右手のインスペクターの”+ADD COMPONENT”からCollisionをアタッチする
- Collisionがアタッチされたら、もう一度”+ADD COMPONENT”をクリックし、RigidBodyを設定する
- RigidBodyのTypeは”Static”のままでOK。これでRigidBodyは終わりです。
- Collisionのサイズ設定をするので、Collisionの項目内””Half Extens”の数値を「左は4、真ん中は0.01、右は4に変更
これで床にもCollisionとRigidBodyが設定されました。
床のCollisionは床のサイズにぴったりなハズです。
あとはLaunchで確認すればこの記事は終わりですが、その前に簡単にそれぞれ説明します。
CollisionとRigidBodyの解説
Collisionサイズ
Collisionはいくつか種類がありますが、boxCollisionの場合、基本は元のエンティティのScaleの項目の半分の値を入れます。
つまりBoxエンティティのスケールが(1,1,1)なので、BoxCollisionのhalf Extentsは(0.5,0.5,0.5)となります。
![](https://www.metapla.blog/wp-content/uploads/2024/04/a7dba61d9b55686739c7dfb6e14e9d32-1.png)
Planeは厚みがほぼ無いので、Scaleが(8,1,8)に対して、Collisionは(4,0.01,4)としました。慣れればあまり考えずにできますよ!
またCollisionのTypeですが、Box以外にもSphere(球)、Capsule(カプセル)、Cylinder(円柱)、Mesh(メッシュ形状)、Compound,Cone(三角錐)などがあります。
今後扱うエンティティに合わせて適宜Collisionを決めていくことになると思います。
RigidBodyのType
Typeの項目に関して簡単に説明します。
- Static⇨動かない物体。重力も反映しない。ぶつかっても動かせない物。床や壁など。
- Dynamic⇨物理法則を反映。落下する、滑る、弾むなど。箱やボールなど。
- Kinematic⇨プログラムで制御する。宙に浮いたまま回転し続ける。機械の歯車など。
今回のプロジェクトでは
床⇨Staic。動かないもの。
Box⇨Dynamic。落ちるもの。
そして次の記事で登場する”Bar”ではKinematicを使い、プログラム制御で回る物。となります。
実際に作ってみるとこの3つの意味がよく分かると思います。
Launchで確認
ここまでの状態を一度Launchで確認します。
その前に何が起こるかよく分かるように、シーン内のBoxの”Position”を以下にしてください。
一番下のBox⇨(0,1,0)
真ん中のBox⇨(0.55,2.2,0)※大体で大丈夫です。
一番上のBox⇨(0,4,0)
設定できたらビューポート右上の”Launch”をクリックします。
別タブが開かれ、今のプロジェクトが実際に再生されます。
Boxが落ちていますか?落ちていれば成功です!
これで物理設定の解説は終了です。
次回はプログラミングで、回転する棒(Bar)を作ります。