PONOS Advent Calendar 2020の14日目の記事です。
昨日は@nissy_gpさんの「オーストラリアのサマータイムからtz databaseを読み解く」でした。
###はじめに
今日はUnityで「おきあがりこぼし」を作ったお話をさせていただきます。
おきあがりこぼしとは、倒そうとしても倒れない人形のことです。
ストレス解消の「パンチングバルーン」と呼ばれるものも仲間ですね。
我が家にもアンパンマンの玩具があったなぁと探してみたのですが、流石にもう捨ててしまったたようです。
ちなみに英語で「Roly-poly toy」だそうで、韻を踏んでていい感じ。
###作ってみる
不意にそのおきあがりこぼしを作ってみたくなりました。
リアルに工作してもいいのですが...今回はUnityの画面上で表現してみます。
頭に描いたイメージを気軽に形にできちゃうってのはUnity最大の魅力ですよね!
###Prefabの構造
既に完成形ですが、RolyPolyToyと名付けたPrefabです。
親の「RolyPolyToy」という空オブジェクトの子要素に「Body」、孫要素に「Weight」を配置します。
※Unity標準の3D Objectですが、構造が把握しやすいよう半透明にしています。下部の黒い球体が重りです。
###Inspectorの設定
それぞれの設定は以下の通りです。
RolyPolyToy ・・・ Transformだけの空オブジェクトです。初期位置を浮かせています。
Body ・・・ 本体になります。CapsuleにRigidbodyを追加しています。
Weight ・・・ 重りになります。SphereにRigidbodyとFixedJointを追加しています。
ポイントは、以下の2点。
1.WeightのRegidbody.MathをBodyより明らかに大きな値にする
2.WeightにFixedJointコンポーネントを追加し、Bodyとジョイントする
UnityのJointクラスの中にあるFixedJointを使いましたが、Rigidbodyを持つオブジェクト同士を繋ぐことができます。ジョイントしないと、Rigidbodyを持ったオブジェクトはそれぞれバラバラになります。
https://docs.unity3d.com/ja/current/ScriptReference/Joint.html
(他にもバネのように伸び縮みするSpringJointや、関節のようなHingeJointなどがあります。)
あと、カプセル形状の場合は、重りの中心点をなるべく外側に配置することも重要です。下図でいうとマゼンタの線より内側に配置した場合は横に倒れたまま起き上がりませんが、この挙動は現実の事象と同じですね。
重りを視覚化していましたが、WeightのMeshRendererとSphereColliderは不要なのでOFFにしましょう。
###完成形
パンチングバルーン的な物体が揺れながら立ち上がります。
動画でお見せできないのが残念ですが、イメージ通りのものができました!
他にも実現する方法はあるでしょうけど、UnityのPhysicsを使ったお手軽な方法として紹介しました。
以上
明日は@loveRiceさんです。