スクロール内での揺れ物の実装

スクロール内での揺れ物の実装

Unityのスクロール内で揺れ物の挙動がおかしくなる問題の対処。DistanceJoint2Dの使い方。
AutoConfigureConnectedAnchor、AutoConfigureDistanceについて。

関連ページ
参考URL
前のページ の解説通り、Unityでは簡単に揺れ物を実装できます。
しかしその揺れ物をScrollRectなどのスクロール内に置くと挙動がおかしくなります。

なぜ挙動がおかしくなるかは正直把握していないものの修正の仕方は分かっていて、これは
DistanceJoint
を追加する必要があります。
併せて各Componentの
AutoConfigureConnectedAnchor
AutoConfigureDistance
を切る必要もあります。
けっこう作業が入り組んでいて面倒です。

揺れ物をスクロール内に置くとどうなるか

Rigidbody2D
HingeJoint2D
FixedJoint2D
などを使用して揺れ物を実装しても、それをスクロール内に置くと途端に挙動がおかしくなります。
次の動画がその一例。

ユーザーがスクロールするまでは正しく動きますが、スクロールした途端チェーンがバラバラに引き千切れます。

DistanceJoint2Dをアタッチする

この問題を解決するには、まず揺れ物を構成するGameOjectに対して、
DistanceJoint2D
をアタッチして最大距離を固定する必要があります。


今回の実装では、キーホルダー1個につきHook、Chain_1、Chain_2、Chain_3、Chain_4、Frameの6つのGameObjectで構成されています。
揺れモノのGameObjectの構成例
一番上のHookのみ、
HigeJoint2D
ConnectedRigidBody
None
になっていて、誰にも依存せず空間上に固定されています。
( 前ページ 参照)

DistanceJoint2D
は、Hook以外のChain_1、Chain_2、Chain_3、Chain_4、Frameに対してアタッチさせています。
DistanceJoint2D
内の
ConnectedRigidBody
には、空間上に固定されたHookを指定します。
ConnectedRigidBodyのアタッチ例

各GameObjectのComponentのアタッチ状況は次の通り。
 Hook 
: Rigidbody2D、HengeJoint2D
 Chain_1 
: Rigidbody2D、HengeJoint2D、FixedJoint2D、DistanceJoint2D
 Chain_2 
: Rigidbody2D、HengeJoint2D、FixedJoint2D、DistanceJoint2D
 Chain_3 
: Rigidbody2D、HengeJoint2D、FixedJoint2D、DistanceJoint2D
 Chain_4 
: Rigidbody2D、HengeJoint2D、FixedJoint2D、DistanceJoint2D
 Fook 
: Rigidbody2D、HengeJoint2D、FixedJoint2D、DistanceJoint2D

AutoConfigureConnectedAnchorを切る

HingeJoint2D
FixedJoint2D
の2つのComponentの
AutoConfigureConnectedAnchor
を切っていきます。
Hookのみ、HingeJoint2DのAutoConfigureConnectedAnchorを切ってはいけません。

少しややこしいですが、
AutoConfigureConnectedAnchor
は切る必要があるものの、
ConnectedAnchor
には適切な値が代入されている必要があります。
AutoConfigureConnectedAnchorを切ったり点けたりすると、ConnectedAnchorに初期値が代入されます。
ConnectedAnchorに値が入っているのを確認した上で、AutoConfigureConnectedAnchorを切ります。

AutoConfigureDistanceを切る

DistanceJoint2D
については、
AutoConfigureConnectedAnchor
と共に
AutoConfigureDistance
も切ります。
かつHingeJoint2D、FixedJoint2Dとは違って
ConnectedAnchor
の値はゼロである必要があります。


一方で
Distance
には適切な値が代入されている必要があります。
まず
ConnectedAnchor
が全てゼロなのを確認。
その上でAutoConfigureDistanceを切ったり点けたりし、Distanceに値が入っていることを確認した上でAutoConfigureDistanceを切ります。

ここまでやって、ようやくスクロール内の揺れ物が実装できます。

0
0