おもちゃラボ

Unityで遊びを作ってます

Hinge Jointを使ってチェーンを作る

UnityのPhysicsにはHinge Jointというコンポーネントが用意されています。これを使えば、チェーンみたいなものが作れるんじゃない?と思ったのがきっかけです。世には先人がいるもので、似たようなものを作られている方が・・・!^^;;

www.youtube.com

https://www.honeycomb-lab.co.jp/lab/blog/?p=1613www.honeycomb-lab.co.jp

チェーンを配置する

まずはチェーンとボールを配置しています。チェーンは上からchain1、chain2と続いて、一番下にballを配置しています。

f:id:nn_hokuson:20160825220936p:plain


全てのチェーンとボールにRigidbody2DとHingeJoint2Dをアタッチします。Rigidbody2Dは「Add Component」→「Physics2D」→「Rigidbody2D」、HingeJoint2Dは「Add Component」→「Physics2D」→「HingeJoint2D」を選択します。

f:id:nn_hokuson:20160825221320p:plain


ボールはおもりなので、チェーンよりも重くします。ヒエラルキービューでballを選択し、インスペクタのMassなどの項目を図のように設定してください。

f:id:nn_hokuson:20160825221648p:plain

HingeJointを設定する

それぞれのチェーンにアタッチされているHingeJointの「Connected Rigidbody」の欄に、ひとつ上のチェーンオブジェクトを指定します。例えば、「chain3」にアタッチしたHingeJointコンポーネントの「Connected Rigidbody」には「chain2」を指定し、「chain2」にアタッチしたHingeJointコンポーネントのConnected Rigidbodyには「chain1」を指定します。

f:id:nn_hokuson:20160825222342p:plain

最後にチェーンが伸びて、ちぎれないように、ボールにDistance Jointをアタッチしましょう。これは指定したオブジェクトとの距離を一定に保つためのコンポーネントです。

ヒエラルキービューで「ball」を選択し、「Add Component」→「Rigidbody2D」→「DistanceJoint2D」を選択します。インスペクタの「Connected Rigidbody」の欄に一番上のチェーン(chain1)をドラッグ&ドロップします。また、「Max Distance Only」にチェックを入れます。これにより、現在のballとchain1の長さよりも短くはなりますが、長くなることはなくなります。

f:id:nn_hokuson:20160825224019p:plain

ボールをドラッグしてみる

ボールを掴んでドラッグするためのスクリプトをアタッチします。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にドラッグ&ドロップします。

f:id:nn_hokuson:20160825224843p:plain

実行結果

f:id:nn_hokuson:20160825225736g:plain


動きがかるいなぁ、と感じたらメニューバーから「Edit」→「Project Settings」→「Phsyics2D」を選択し、インスペクタからGravityを「-50」ぐらいに設定してみてください!

私の書いた「Unity5の教科書」もよろしくお願いします!^^/