UnityのPhysicsにはHinge Jointというコンポーネントが用意されています。これを使えば、チェーンみたいなものが作れるんじゃない?と思ったのがきっかけです。世には先人がいるもので、似たようなものを作られている方が・・・!^^;;
https://www.honeycomb-lab.co.jp/lab/blog/?p=1613www.honeycomb-lab.co.jp
チェーンを配置する
まずはチェーンとボールを配置しています。チェーンは上からchain1、chain2と続いて、一番下にballを配置しています。
全てのチェーンとボールにRigidbody2DとHingeJoint2Dをアタッチします。Rigidbody2Dは「Add Component」→「Physics2D」→「Rigidbody2D」、HingeJoint2Dは「Add Component」→「Physics2D」→「HingeJoint2D」を選択します。
ボールはおもりなので、チェーンよりも重くします。ヒエラルキービューでballを選択し、インスペクタのMassなどの項目を図のように設定してください。
HingeJointを設定する
それぞれのチェーンにアタッチされているHingeJointの「Connected Rigidbody」の欄に、ひとつ上のチェーンオブジェクトを指定します。例えば、「chain3」にアタッチしたHingeJointコンポーネントの「Connected Rigidbody」には「chain2」を指定し、「chain2」にアタッチしたHingeJointコンポーネントのConnected Rigidbodyには「chain1」を指定します。
最後にチェーンが伸びて、ちぎれないように、ボールにDistance Jointをアタッチしましょう。これは指定したオブジェクトとの距離を一定に保つためのコンポーネントです。
ヒエラルキービューで「ball」を選択し、「Add Component」→「Rigidbody2D」→「DistanceJoint2D」を選択します。インスペクタの「Connected Rigidbody」の欄に一番上のチェーン(chain1)をドラッグ&ドロップします。また、「Max Distance Only」にチェックを入れます。これにより、現在のballとchain1の長さよりも短くはなりますが、長くなることはなくなります。
ボールをドラッグしてみる
ボールを掴んでドラッグするためのスクリプトをアタッチします。Rigidbody2Dをアタッチしたオブジェクトの座標を直接操作するとうまく動作しないので、マウスの移動量に応じてvelocityを変化させています。
プロジェクトビューで右クリックし、「Create」→「C# Script」でスクリプトを作成し、ファイル名をBallControllerに変更します。
using UnityEngine; using System.Collections; public class BallController : MonoBehaviour { Vector3 prev; void Update () { Vector3 p = Camera.main.ScreenPointToRay (Input.mousePosition).origin; p.z = 0; if (Input.GetMouseButton (0)) { GetComponent<Rigidbody2D> ().velocity = (p - this.prev)*80; } this.prev = p; } }
作成したBallControllerをヒエラルキービューのballにドラッグ&ドロップします。
実行結果
動きがかるいなぁ、と感じたらメニューバーから「Edit」→「Project Settings」→「Phsyics2D」を選択し、インスペクタからGravityを「-50」ぐらいに設定してみてください!
私の書いた「Unity5の教科書」もよろしくお願いします!^^/