Unity2Dの物理ジョイント



Physical Joints Unity2d



このチュートリアルはUnity5.0.2f1に基づいているため、このバージョンのUnityを使用してチュートリアルを学習することをお勧めします。

次に、2D_Joints_Starterをダウンロードします。 Unityでデモを解凍して開きます。



最初のシーンは次のようになります。
画像

多くのゲームと同様に、このシーンには物理コンポーネントを持つ多くのオブジェクトがあります。その場合、内部のすべてのオブジェクトにはジョイントがありません。このチュートリアルでは、各Unity 2Dジョイントを使用して、それらがどのように機能するかを確認します。



このシーンを実行すると、重力のためにいくつかのオブジェクトがすぐにドロップするのがわかります。
画像

注:シーン内のラベルは固定位置にありますが、オブジェクトの動きはゲームビューのサイズに基づいています。最良の結果を得るには、ゲームビューをフリーアスペクトモードに設定し、オブジェクトとラベルが画像と同じように配置されるまでUnityGUIのサイズを手動で調整することをお勧めします。

距離ジョイント2D

ディスタンスジョイント2Dを見てみましょう。このジョイントの目的は非常に基本的です。つまり、2つの別々のオブジェクト間の相対距離を一定に保つことです。シーンの左上にある赤い四角と青い六角形でテストします。



以下に示すように、HierachyでHexagon_Djointを選択し、それにDistance Joint2Dコンポーネントを追加します。
画像

ご覧のとおり、このコンポーネントには、より良いゲーム感覚を見つけるために調整できるいくつかのパラメーターがあります。
画像
これらのパラメータを見ても、恐れているかどうかはわかりません。心配しないでください。これらのパラメータの意味がすぐにわかり、変更方法を学ぶことができます。

このコンポーネントを六角形に追加すると、六角形を画面の中央(原点(0、、0))に接続する緑色の線が表示されます。
画像
このシーンを実行し、この六角形に注意してください。
画像

この六角形が画面の小さな半分を横切って画面の中央に移動し、左右に揺れ始めます。この左右の揺れの動きは、この関節によって引き起こされます。何が起こっている?あなたはすぐにわかります。

インスペクターを振り返ると、Distance Joint2Dの最初のパラメーターは「CollideConnected」です。これは、ジョイントによって接続された2つのオブジェクトが互いに衝突できるかどうかを定義します。この例では、これを発生させたくないので、チェックを外したままにします(他のオブジェクトは実際には空です)。
2番目のパラメータは「ConnectedRigidbody」です。距離ジョイントの一方の端は、コンポーネントを含むオブジェクトへの接続を常に維持します。このフィールドを使用して、オブジェクトへの参照を接続のもう一方の端に渡すことができます(これは、六角形がこのフィールドによって参照されるオブジェクトにリンクされることを意味します。このパラメーターが設定されていない場合、Unityはもう一方の端をに設定しますシーン内の固定値(原点のようです)。

この例でHexagon_DjointとSquare_Djointを接続する場合は、Square_DjointをConnected RigidBodyの場所にドラッグします。
画像
これで、2つのオブジェクトを接続できるようになります。

画像
次のパラメータはアンカーです。これは中国語ではアンカーポイントと呼ばれ、ジョイントの終点がGameObjectローカル座標系のどこに接続されているかを示します。シーンビューで、Hexagon_Djointを選択します。上の途中で、Hexagon_Djointに塗りつぶされていない青い円があり、これがアンカーポイントであり、その値がデフォルト(0、0)であることがわかります。

Connected Anchorパラメータは、ジョイントのもう一方の端にあるアンカーポイントの位置を明確にします。 Connected RigidBodyが空の場合、接続された座標系はシーンのルート座標系です。 Connected RigidBodyが設定されている場合、Connected Anchor座標系は、Connectedrigidbodyのローカル座標系になります。このアンカーポイントは、上の画像のSquare_jointの中央にある青い円で確認できます。この値を再び初期(0、0)のままにしておくことができます。

距離Joint2Dの5番目のパラメータであるDistanceは、2つのオブジェクト間の距離(実際には2つのアンカーポイント間の距離)を表す距離です。シーンビューに戻ると、次のように2つのオブジェクト間の緑色の線が表示されます。

画像

この線分は、ジョイントが強制される距離を示します。このシーンを実行すると、ジョイントはHexagon_Djointをこの小さな線分に移動します。距離を増減すると、この小さな線が上下に移動して、構成した距離パラメータに一致します。
画像

真実を実践し、距離を2に設定します。
画像

元の: https://www.raywenderlich.com/87370/physics-joints-in-unity-2d

最後のパラメータは最大距離のみです。このパラメータが設定されている場合、2つのオブジェクトを近づけることはできますが、設定された距離を超えることはできません。実行中のシーンでは、六角形が落下したことがわかりますが、最大距離に達したため、六角形を落下しても移動しません。
画像

関節はとても便利ですが、動かないと真の力を発揮しません。オブジェクトを簡単にドラッグできるように、プロジェクトにはいくつかのスクリプトが用意されています。階層でSquare_Djointを選択し、ScriptsディレクトリのMovementスクリプトをインスペクターにドラッグします。

画像
それを実行し、Square_Djointをドラッグすると、次のように表示されます。
画像

ぎこちないようですが、ゲームビューに共同情報が表示されないので、緑色の線が表示されないことを慌てないでください。

もちろん、この効果をよりよく確認するために、プロジェクトにはLineスクリプトが用意されており、ゲームビューでジョイントを確認できます。

画像

画像

それを実行すると、次のように表示されます。
画像

どのようにドラッグしても、2つのオブジェクト間の距離は、設定した距離を超えることはありません([最大距離のみ]がチェックされていない場合、距離は固定され、距離は設定した値以下になります)。
画像

スプリングジョイント2D

Spring Joint2Dは、その名前が示すように、ばねの効果をシミュレートするばねジョイントです。コンポーネントは次のとおりです。
画像
いくつかのパラメータはすでに言及されているので、詳細には触れません。固有の減衰比と周波数パラメータのいくつかを次に示します。

減衰比は中国語に変換されます。これは減衰係数を意味します。あなたが物理学を学ぶとき、あなたはこれが何を意味するかを知っているべきです。減衰係数が大きいほど抵抗が大きくなり、バネの影響が目立たなくなると考えられます。この値の範囲はここにあります。 [0、1]です。

周波数は振動の周波数でもあり、これを理解するのは難しいことではありません。

Spring Joint2Dの効果を見てみましょう。
画像

ヒンジジョイント2D

ヒンジジョイントは、主に固定点を中心にリジッドボディを回転させるために、前の2つと同じではありません。剛体に力が加えられると、ジョイントは他のスクリプトに頼ることなく、正しい回転を個別に計算できます。ヒンジジョイント2Dは、さまざまなパラメータを提供します。これらのパラメータを調整することで、ドア、重力トリガードア、水車など、さまざまな移動オブジェクトを作成できます。

この例では、Square_Hjoint(実際には長方形)にウェイトをかけると回転します。
Square_Hjointを選択し、それにヒンジジョイント2Dコンポーネントを追加します。
画像

このコンポーネントはより複雑です。
画像

繰り返されるパラメータについては触れられていません。
Connected Ridigbodyこのパラメータは最初にnullに設定され、ジョイントが空間内のポイントに接続されるようにします。デフォルトの接続ポイントはシーン内で(0、0)ではなくなっていることに注意してください。これは、現在のオブジェクトの場所です。次に、接続されたアンカーのXとYを-3.5と-3.2に設定します。
画像

モーターを使用するモーターを使用するかどうかを確認すると、ジョイントは、外力がある場合に安定した速度(外力がない場合にのみ安定)を維持するためにジョイントを回転させる連続的な力があります。速度は増減します。
モーター速度は1秒あたりの回転角を表し、モーターはトルクを加えることによってこの速度を安定させようとします。
最大モーター力は、このトルクの最大値です。値が大きいほど、ヒンジはモーターとともにより安定して回転します。
制限の使用制限をオンにして、ヒンジの回転角度を一定の間隔に制限します。

この例では、プラットフォームを1週間回転させたくないので、[使用制限]をオンにして、[下限]を-245に、[上限]を0.5に設定します。

画像

シーンビューで見ることができます:
画像

シーン内のボールは重力の影響を受け、再生の時点で再生されます。
画像

このシーンを実行し、ボールをドラッグしてSquare_Hjointにドロップし、プラットフォームがどのように回転するかを確認します。
画像

シーン内のボールにはさまざまな重みが与えられます。シーン内の他のボールを試して、大きなボールが回転速度をどのように改善するかを確認してください。インスペクターでSquare_Hjointを確認してください
でコードモーターを使用し、使用制限の代わりにモーター速度を500に設定します

このゲームを実行します:
画像

スライダージョイント2D

スライダージョイントオブジェクトの動きを制限する線。この例では、前のセクションで作成したヒンジジョイントを使用して、線に沿って別のオブジェクトを移動します。
Hexagon_Sljointを選択し、Slider Joint2Dコンポーネントをそこにドラッグします。
画像
平行移動制限である角度制限に対応しますが、角度から変位距離に変化します。
画像

Connected Rigidbodyは空のままで、Connected AnchorのXを4.3に、Yを-4.7に設定します。
画像

シーンビューで、このジョイントによって記述されたパスを確認できます。
画像

ここに新しいプロパティがあります。Angleは、2つのジョイント間の角度を表します。角度を-45に設定します。角度を示す小さな緑色の線が表示されます。
画像
2つのジョイント間のパスは、ゲームの実行後に小さな線分と一致します。
画像

ゲームの開始時にHexagon_Sljointを右のように移動させたい場合は、Angleを0に戻します。実行時にジョイントのパスを確認するには、前述のLineスクリプトを使用できます。

ゲームを実行し、ヒンジプラットフォームにいくつかのボールを投げます。このプラットフォームは回転してHexagon_Sljointに当たり、Hexagon_Sljointはジョイントのパスに沿ってスライドします。この六角形がスライドする速度は、プラットフォームが回転する速度によって決まります。

ホイールジョイント2D

名前を見て、このジョイントが、チュートリアルの最後のジョイントであるホイールをシミュレートするように設計されていることを確認してください。
Square_WJointにWheelJoint2Dジョイントを追加します
画像

このコンポーネントのパラメータの多くはすでにわかっており、別の場所があります。ここでは、接続されたリジッドボディを設定できません。設定しないと、このコンポーネントは何もしません。
画像

RigidBodyをHexagon_WJointに接続します。
画像

疑惑はホイールジョイントに固有であり、減衰比、周波数、角度の3つの属性が含まれています。最初の2つはスプリングジョイントと同じで、角度はスライダージョイント2Dの角度と同じです。

一緒に、これらの3つのパラメータは、車輪と固定された車両の間のばねを表し、特定の方向を指します。

ゲームを実行し、プラットフォームの中央近くのSquare_Wjointにボールを置きます。プラットフォームが下に移動し(解放感)、回転中に跳ね返るのがわかります。
画像

ホイールジョイントを実際に感じるには、新しいシーンを作成し、スプライトフォルダからシーンに正方形をドラッグします。変換の位置を(-3.6、-7.72、0)に設定し、スケールを(14.43、6.50、1)に設定し、それにBox Collider2Dコンポーネントを追加し、サイズをX:2.29、Y:2.31に設定します。 :
画像

名前を付けます:地面
画像
Carという名前の空のGameObjectを作成し、場所を(6.4、1.13、0)に設定します。
画像
Spriteフォルダーから、CarスプライトをCarGameObjectにドラッグします。名前を付けます:Body、位置を(0、0、0)に設定します。
画像

WheelをSpriteフォルダーからCarGameObjectにドラッグし、ホイールに配置し、両方のホイールに対して同じことを行い、FrontWheelとBackWheelという名前を付けます。

画像

次に、Rigidbody2DをBody、Front Wheel、BackWheelに追加します。次に、Circle Collider2DをFrontWheelとBackWheelに追加し、PolygonCollider2DをBodyに追加します。 Car GameObjectを選択すると、衝突ボディは次のようになります。
画像

次に、インスペクターで[ボディ]を選択し、[コライダーの編集]をクリックします。
画像
ホイールとポリゴンコリジョンボディが接触しないように、ホイールの周りのポリゴンコリジョンボディを編集します。
画像

Bodyを選択し、WheelJoint2Dを追加します。 ConnectedRigidbodyをFrontWheelに設定します。アンカーは(0.98、-0.78)に設定されます。モーターの使用を確認し、モーター速度を500に設定します。
画像

Bodyを選択したままにして、別のWheelJoint2Dを追加します。 ConnectedRigidbodyをBackWheelに設定します。アンカーは(1.15、-0.84)に設定されています。モーターの使用を確認し、モーター速度を500に設定します。
画像

ハハ、ゲームを実行すると、次のように表示されます。
画像

完全なプロジェクトはここにあります: https://koenig-media.raywenderlich.com/uploads/2015/05/2D_Joints_Complete.zip

翻訳元: https://www.raywenderlich.com/87370/physics-joints-in-unity-2d