-->

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

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

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