Unityでバネの動きを出す方法を調査したので、備忘録としてまとめました。
目次
バネを動きを出す方法を調べてみた
ググってみると幾つか方法があるようです。
- 【Unity】バネの動きを実現する3つの方法 | おもちゃラボ
- 「Spring Joint2Dを使う方法」、「Animationを使う方法」、「スクリプトを使う方法」が紹介されている。
- サンプルプログラムも載っていて参考になる。
- 記事読んだ限り、Physicsの「Spring Joint」では簡単に実現できそう。
- スクリプトは自由度が高そう。
- 「Spring Joint」は3Dのものもあるみたいなので3Dゲームでも適用できそう。
- UnityのSpring Jointを使う | Qiita
- 「Spring Jointを使う方法」をかなり詳しく紹介されている。
- サンプルプログラムも載っていて参考になる。
バネの動きを試してみた
上のサイトで紹介されていた
- Spring Jointを使う方法
- スクリプトを使う方法
の2つの方法を試しに作ってみました。
Spring Jointを使う方法
棒と下の床の間に「Spring Joint」を設定しており、マウスのドラッグ距離に応じた力がバネにかかるようにしています。
バネっぽい動きになっているのではないでしょうか!?
ソースコードは以下で公開しているので、よろしければご覧ください。(MITライセンス)
https://github.com/shiguregaki/study_unity/tree/master/01_SpringPushStick
シーン名:「BySpringJoint」
ハマったこと
マウスの距離の分に応じて力をかけるにあたって、ばねからの反発力が棒の位置を安定させなかったため、マウスの距離からの力以外にばねにかかる力を打ち消すような力を加えるようにコードを書いていました。
ばねにかかる力はSpringJointコンポーネントのcurrentForce
によってとれそうだったので、それをAddForce()
で打ち消す方向に力かけていましたが、、、下のように棒が大暴走しました笑
結局、currentForce
は使わず、マウスの移動距離をAddForce()
でかけるのみにしたら安定しました。currentForce
で取得できるのは実際にばねにかかっている力ではないのかも???
参考
スクリプトを使う方法
バネの動きはフックの法則によって計算しており、初期位置からの距離に比例した力が棒にかかるようにしています。
また、空気抵抗がないとずっと振動しつづけてしまったので、棒の「Rigidbody」に空気抵抗Dragを設定することで徐々に振動が小さくなるようにしています。
少しバネの動きがぎこちない気がします。。。
パラメータをいろいろ調整すれば使えそうです。
ソースコードは以下で公開しているので、よろしければご覧ください。(MITライセンス)
https://github.com/shiguregaki/study_unity/tree/master/01_SpringPushStick
シーン名:「ByScript」
参考
まとめ
「Spring Joint」を使えば楽にバネの表現をすることができそうです。
ただ、使い方が悪いのかたまに大暴走したりするので、いろいろいじってチューニングしていく必要がありそうですね。。。
一方、スクリプトでバネの動きを表現するのはコードを書く必要があるのですが、カスタマイズはしやすいように思います。
広告
Unityを初めて勉強するなら「Unityの教科書 Unity 2019完全対応版 2D&3Dスマートフォンゲーム入門講座」がオススメです!
全くUnityが分からなかった状態でも概要を理解することができました。
Unityの教科書 Unity 2019完全対応版 2D&3Dスマートフォンゲーム入門講座
Amazon 楽天
以上!
コメント