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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

Q&A

解決済

3回答

3725閲覧

【Unity】【WheelCollider】タイヤが横に回ってしまいます

omaetoomae

総合スコア41

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

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

0グッド

0クリップ

投稿2022/01/23 13:52

編集2022/01/23 13:57

やりたいこと

Unityで車を操作できるようにしたくてサイトを参考にしながらWheelColliderを使って製作していたのですが、3Dのタイヤをつけ始めたあたりから、車は動くものの、タイヤが横に回るようになってしまいました。
イメージ説明
よく見ると、コライダーの向きがおかしくなっていたので車の向きを変えて実装しなおしたのですが、それでも実行したとたんに同じ状態になってしまいます...
イメージ説明

参考にしたサイト

コード

サイトにも書いてありますが一応載せておきます。

Car.cs

1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5public class Car : MonoBehaviour 6{ 7 public List<AxleInfo> axleInfos; 8 public float maxMotorTorque; 9 public float maxSteeringAngle; 10 11 public void ApplyLocalPositionToVisuals(WheelCollider collider) 12 { 13 Transform visualWheel = collider.transform.GetChild(0); 14 Vector3 position; 15 Quaternion rotation; 16 collider.GetWorldPose(out position, out rotation); 17 visualWheel.transform.position = position; 18 visualWheel.transform.rotation = rotation; 19 } 20 21 public void FixedUpdate() 22 { 23 float motor = maxMotorTorque * Input.GetAxis("Vertical"); 24 float steering = maxSteeringAngle * Input.GetAxis("Horizontal"); 25 foreach (AxleInfo axleInfo in axleInfos) 26 { 27 if (axleInfo.steering) 28 { 29 axleInfo.leftWheel.steerAngle = steering; 30 axleInfo.rightWheel.steerAngle = steering; 31 } 32 if (axleInfo.motor) 33 { 34 axleInfo.leftWheel.motorTorque = motor; 35 axleInfo.rightWheel.motorTorque = motor; 36 } 37 ApplyLocalPositionToVisuals(axleInfo.rightWheel); 38 ApplyLocalPositionToVisuals(axleInfo.leftWheel); 39 } 40 } 41} 42[System.Serializable] 43public class AxleInfo 44{ 45 public WheelCollider leftWheel; 46 public WheelCollider rightWheel; 47 public bool motor; //駆動輪か? 48 public bool steering; //ハンドル操作をしたときに角度が変わるか? 49}

調べたこと

自分が調べたところ、コライダーの向きを変えることはできないそうなのですが、車もタイヤも全く向きなんて変えていないのに、なぜコライダーの向きがおかしくなってしまうのか全く分かりません...

追記:

WheelCollderの設定を載せておきます。(4つとも同じ設定です)
イメージ説明

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

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

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

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

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

guest

回答3

0

自己解決

イメージ説明
画像のように、空のオブジェクトとタイヤの間にもう一つ空のオブジェクト(wheel)を入れると正常に動作しました。

投稿2022/02/06 01:27

編集2022/02/06 01:27
omaetoomae

総合スコア41

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

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

0

どうしてなのかは、UnchFullburst さんの回答の通りですが、コードを書き換えることなく対応可能な解決方法としては次の2つが考えられます。

(1)車輪のモデルの座標軸をそろえる
どうやら、使用されている車輪は横になった形で制作されているようです。
意識はされていないのかもしれませんが、どこかの段階で向きが変えられていると思われます。
元の車輪のモデルを縦になった形で制作してなおして、向きを変えることなく取り付けてください。
ただし、この場合左右の車輪は別々に作らないといけません。
そうすれば車輪は4つとも向きを変えることなく取り付けることができます。

(2)車輪のモデルを空のオブジェクトの子供にする
それぞれの車輪ごとにCreate Emptyで空のオブジェクトを作り、車輪をその子供にしてください。
空のオブジェクトが最初の子になるため、その子である車輪のモデルの向きは無視します。
そうすれば、車輪の向きをいじってもその親である空のオブジェクトの角度は変わらないため、変な回転にはなりません。

投稿2022/01/26 00:20

monmoko

総合スコア202

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

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

0

AxelinfoのleftWheel、rightWheelの角度と、その子であろうタイヤの角度とが一致しているか確認してください。

ApplyLocalPositionToVisualsでは、最初に自分の子(のwheelCollider)をvisualWheelに保存しています。
その後、collider.GetWorldPoseで自分自身のRotation(角度)を保存し、保存したRotationをvisualWheelのrotationに入れています。
つまり子どもの角度を親の角度で上書きしています。
この場合、子がY0であろうと、親がY90ならそれで上書きされます。

投稿2022/01/24 06:57

UnchFullburst

総合スコア663

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問