質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.43%
Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

解決済

1回答

638閲覧

Rigidbody2DにおいてHingeJoint2DのMotorを動かした状態でKinematicをDynamicにするとその場で回転してしまう

namari82

総合スコア11

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2023/02/27 06:13

前提

・RigidBody2Dで物理エンジンゲームを作っています。
・車のパーツを自由な場所につなぎ、ゴールを目指すようなゲームです。
・パーツ選択時にはRigidBody2DはKinematicになっており、ゲーム開始時にDynamicに変更することで物理演算を開始します。
・全てのパーツは基本となる車にHinge Joint 2Dで接続させます。ここでタイヤのパーツはMotor Speedを持ってます。
・このタイヤのパーツを接続した車がその場で回転してしまいます。


目的

Dynamicへの変更時の回転を無くしたいです。
具体的にはこのGIFのようにただ落下する(+かつタイヤは回転している)ようにしたいです。

試したこと

この現象はMotor Speedが0のときは起こらず、Motor Speedが大きいほど明確に大きく回転します。
ゲーム動作中にリアルタイムでMotor Speedを変更するときも同様に回転を起こすことから、これはバグというよりもどちらかというと物理演算上の仕様と思われます。
その上で回転を無くしたいです。
Kinematic→Dynamicにした瞬間にRigidbody2DのvelocityとangularVelocityを0にしてみたが何も変化は認められませんでした。

補足情報(FW/ツールのバージョンなど)

Unity2020.2.7f1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

車体がモーターの反作用を受けて回転するのは仕方ないんじゃないでしょうかね?もしオフィスチェアに座ってバットを振り回したとすると、自分の体は逆向きに回転しそうな気がします。
本体の回転を抑制するために思い当たった方法を何種類か試してみまして、スローモーションで見てみると下図のようになりました。

図

左から順に「対策なし」、「車体のmassを100」、「車体のinertiaを100倍」、「車体のangularDragを1000」、「車体のconstraintsFreezeRotationをオン」となっています。
inertiaについてはインスペクター上からは設定できなそうでしたので、車体に下記のようなスクリプトを付けています。

C#

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody2D))] 4public class InertiaModifier : MonoBehaviour 5{ 6 [Min(0.0f)] public float inertiaMultiplier = 1.0f; 7 8 private float initialInertia; 9 private float previousInertiaMultiplier = float.NaN; 10 private new Rigidbody2D rigidbody2D; 11 12 private void Awake() 13 { 14 this.rigidbody2D = this.GetComponent<Rigidbody2D>(); 15 this.initialInertia = this.rigidbody2D.inertia; 16 } 17 18 private void FixedUpdate() 19 { 20 if (this.inertiaMultiplier.Equals(this.previousInertiaMultiplier)) 21 { 22 return; 23 } 24 25 this.previousInertiaMultiplier = this.inertiaMultiplier; 26 this.rigidbody2D.inertia = this.initialInertia * this.inertiaMultiplier; 27 } 28}

車体のmassを上げるとご質問者さんの理想図に近づくような気がしますが、着地したときの地面へのめり込みが大きくなっていますので要注意かもしれませんね。タイヤと車体の質量差が十分大きければ車体の回転は低減するかと思いますので、車体だけを重くするのではなく「車体をちょっと重く、タイヤをちょっと軽く」とすれば車全体の質量をあまり変えずに挙動を変化させられるかもしれません。

投稿2023/02/27 21:11

Bongo

総合スコア10807

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

namari82

2023/03/02 09:06 編集

ありがとうございました! いろいろな手法を並べていただきありがとうございました。 おかげで考えがまとめやすかったです。 結果としては「車体のconstraintsのFreezeRotationをオン」の方式を使いました。 ゲーム開始数フレームの間のみFreezeRotationをオンにすることで最初の回転を無効化した後にFreezeRotationをオフにしました。 かなり想定通りの挙動となりました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.43%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問