-100p

-10p

+10p

+100p

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

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で構成されている。

一番上のHookのみ、HigeJoint2DのConnectedRigidBodyがNoneになっていて、誰にも依存せず空間上に固定されている。

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


各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

-100p

-10p

+10p

+100p