Cou氏の徒然日記

ほのぼの日記ブログです。

Unityで遊ぼう [振り子編 その1:振り子の作成]

なかなかまとまった時間やモチベーションがなく、触っていませんでしたが、

この前、別件でUnityのRuntime Feeの話でUnityの話題が出てきたので、

coublood.hatenablog.com

またUnityでちょっと何かやってみようかなと思い、久々に起動。

 

今まで、

■ ボール転がしゲーム

coublood.hatenablog.com

ブロック崩し

coublood.hatenablog.com

をお遊び的に少し作りました。(別にゴール条件とか真面目に定めていない超簡易的なものですが…)

 

あとは別件で、ML-Agentを利用した機械学習も。

coublood.hatenablog.com

 

■ 振り子の支点と球の作成

今回作ってみようと思うのは『振り子』

 

適当にSphere(球)オブジェクトを作り、Regidbody (物理運動の設定) を追加。

docs.unity3d.com

 

(久々なのでアタッチの仕方を忘れていますが、過去の自分の記事で思い出し作業(笑))

coublood.hatenablog.com

オブジェクトを選択した状態で

[Component] -> [Physics] -> [Regidbody]

で追加。

これで重力で落ちるようになりました。

 

続いて振り子の固定点にするオブジェクトをCubeで作成し、Regidbodyを追加。

ただ、こちらも同じ設定してしまうと、上で作ったSphere(球)と同じで、重力で落ちてしまい、固定できないため、物理演算無視の設定を有効に。

Regidbodyの中の「Is Kinematic」にチェックを入れることで、物理演算の影響を受けなくなります。

 

これで、

  • Sphereオブジェクト:重力影響(物理演算の影響)を受ける
  • Cubeオブジェクト:重力影響(物理演算の影響)を受けない

ことになります。

 

SphereオブジェクトをCubeオブジェクトの上に設置してスタートすると、

Sphereオブジェクトは落下、Cubeオブジェクトは空間内に固定され、Sphereオブジェクトの上に乗っかります。

(Physical Material(衝突時の設定)とかは設定していないので、衝突したらそのまま停止)

 

■ 2つのオブジェクトの紐づけ (Hinge Joint)

あとはこの二つをつなげばよいのですが、以前はこの紐の作り方がわからなかったんですよね。

そのために使えばよいのが「Hinge Joint」のようです。

docs.unity3d.com

Hinge Joint は、2 つの リジッドボディ をグループ化し、互いにヒンジで連結されているかのように制約します。ドアに最適ですが、鎖や振り子などをモデル化するのにも使用できます。

つまり、Cube(支点用の立方体)の Rigidbody と Sphere(振り子の球)のRegidbody をグループ化して連携させることができるようです。

 

ということで、まずは、

  • Cubeの位置 = (0, 0, 0)
  • Sphereの位置 = (5, 0, 0)

に設定し、Cubeに「Hinge Joint」を追加

関連付けの対象(Connected Body)にSphere(球)」オブジェクトを選択。

そして、Axis を (x, y, z) = (0, 0, 1) に設定。(*1)

(*1) z軸方向を固定、x軸(横)とy軸(上下)方向には動かしたいため。

 

Aucherなどの距離計算は面倒なので、「Auto Configure Connection」はチェックを入れて、自動計算してもらうようにして、この設定で実行。

 

無事に振り子運動が始まりました。

www.youtube.com

何を使えばいいかが分かれば結構簡単でした。

ただ、まだオブジェクト同士が離れている(ように見えてしまう)ので、的なものを追加していきたいですね。