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

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

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

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

Unity3D

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

Unity

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

Q&A

解決済

1回答

2411閲覧

Unityでハンドルコントローラーを使って車を動かしたいです

gere

総合スコア1

C#

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

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2023/11/14 17:32

実現したいこと

Unityを触って1ヶ月に満たない初心者です。
Unity上でハンドルコントローラーを使って車を操作したいです。

前提

Unityのバージョン:2022.3.7f1
ハンコン:logicool G29 Driving Force

https://fujiya228.com/unity-logitech-g29-car-controll/

上記のサイトをもとに作成をしています。ただし、Standard Assetがダウンロードできなかったため、車は別のものを使っています。

発生している問題・エラーメッセージ

上記サイトと同じコードを使わせて頂いていますが、車が動きません。ハンコンの入力自体は受け取れているようなのですが、車のWheel Colliderが動かず、理由も分からないため困っています。どうしたらWheel Colliderが動くようになり、車を動かせるかご意見を頂きたいです。

該当のソースコード

ハンコン入力は受け取れていますが車は動かせていないので、車を動かす部分にあたるApplyDriveが意図したように動作できていないのかもしれません。
申し訳ありませんが文字数制限の関係上ここには一部分しかコードを載せることができませんでした。お手数ですが上記サイトを参照しながらご意見を頂けたらと思います。コードの変更は行っていないです。

using System; using UnityEngine; using UnityEngine.UI; #pragma warning disable 649 namespace LogitechSDK { internal enum CarDriveType { FrontWheelDrive, RearWheelDrive, FourWheelDrive } internal enum SpeedType { MPH, KPH } public class CarControllerOriginal : MonoBehaviour { [SerializeField] private CarDriveType m_CarDriveType = CarDriveType.FourWheelDrive; [SerializeField] private WheelCollider[] m_WheelColliders = new WheelCollider[4]; [SerializeField] private GameObject[] m_WheelMeshes = new GameObject[4]; [SerializeField] private Vector3 m_CentreOfMassOffset; [SerializeField] private float m_MaximumSteerAngle = 10; [Range(0, 1)] [SerializeField] private float m_SteerHelper = 1; // 0 is raw physics , 1 the car will grip in the direction it is facing [Range(0, 1)] [SerializeField] private float m_TractionControl = 1; // 0 is no traction control, 1 is full interference [SerializeField] private float m_FullTorqueOverAllWheels = 2500; [SerializeField] private float m_ReverseTorque = 1500; [SerializeField] private float m_MaxHandbrakeTorque = 100000000; [SerializeField] private float m_Downforce = 100f; [SerializeField] private SpeedType m_SpeedType; [SerializeField] private float m_Topspeed = 200; [SerializeField] private float m_SlipLimit = 10; [SerializeField] private float m_BrakeTorque = 20000; // original [SerializeField] private float footbrake_th = 0.15f; // 時々ペダルが戻りきらなくなる結果、常に踏んだ状態となる。止まりっぱなしになるのを避けるため private Quaternion[] m_WheelMeshLocalRotations; private Vector3 m_Prevpos, m_Pos; private float m_SteerAngle; private float m_GearFactor; private float m_OldRotation; private float m_CurrentTorque; private Rigidbody m_Rigidbody; private const float k_ReversingThreshold = 0.01f; public bool Skidding { get; private set; } public float BrakeInput { get; private set; } public float CurrentSteerAngle { get { return m_SteerAngle; } } public float CurrentSpeed { get { return m_Rigidbody.velocity.magnitude * 2.23693629f; } } public float MaxSpeed { get { return m_Topspeed; } } public float Revs { get; private set; } public float AccelInput { get; private set; } // Use this for initialization private void Start() { m_WheelMeshLocalRotations = new Quaternion[4]; for (int i = 0; i < 4; i++) { m_WheelMeshLocalRotations[i] = m_WheelMeshes[i].transform.localRotation; } m_WheelColliders[0].attachedRigidbody.centerOfMass = m_CentreOfMassOffset; m_MaxHandbrakeTorque = float.MaxValue; m_Rigidbody = GetComponent<Rigidbody>(); m_CurrentTorque = m_FullTorqueOverAllWheels - (m_TractionControl * m_FullTorqueOverAllWheels); } private void ApplyDrive(float accel, float footbrake) { float thrustTorque = 0; switch (m_CarDriveType) { case CarDriveType.FourWheelDrive: thrustTorque = accel * (m_CurrentTorque / 4f); for (int i = 0; i < 4; i++) { m_WheelColliders[i].motorTorque = thrustTorque; } break; case CarDriveType.FrontWheelDrive: thrustTorque = accel * (m_CurrentTorque / 2f); m_WheelColliders[0].motorTorque = m_WheelColliders[1].motorTorque = thrustTorque; m_WheelColliders[2].motorTorque = m_WheelColliders[3].motorTorque = 0; break; case CarDriveType.RearWheelDrive: thrustTorque = accel * (m_CurrentTorque / 2f); m_WheelColliders[0].motorTorque = m_WheelColliders[1].motorTorque = 0; m_WheelColliders[2].motorTorque = m_WheelColliders[3].motorTorque = thrustTorque; break; } // ブレーキ部分 // 速度や向きによってブレーキのかけ方を変えている float Angle = Vector3.Angle(transform.forward, m_Rigidbody.velocity); // 車体正面と速度の方向のなす角 float curtBrakeTorque; float addMotorTorqueValue; if (footbrake > footbrake_th) { if (CurrentSpeed > 1) // 速度が5より大きい { curtBrakeTorque = 0f; if (Angle < 50f) { // 前方に(左右50度ずつの範囲)に進んでいる addMotorTorqueValue = -m_ReverseTorque * footbrake; } else { // 後方に進んでいる addMotorTorqueValue = m_ReverseTorque * footbrake; } } else { // 速度が5以下 curtBrakeTorque = m_BrakeTorque * footbrake; addMotorTorqueValue = 0f; } } else curtBrakeTorque = addMotorTorqueValue = 0f; for (int i = 0; i < 4; i++) { m_WheelColliders[i].brakeTorque = curtBrakeTorque; m_WheelColliders[i].motorTorque += addMotorTorqueValue; } } } }

試したこと

Wheel Colliderに回転を加えるための変数thrustTorqueが機能しているか、Debug.Logを使って確かめました。アクセルの踏み具合によって値が変化していったため、thrustTorqueは正常に機能していることは確認できました。
しかし、Wheel Colliderが動かない理由が分からず、手がつけられない状態です。

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

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

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

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

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

guest

回答1

0

自己解決

自分にはレベルが高すぎました。参考元のスクリプトを紐解いて自分なりのスクリプトを書くことにしました。お騒がせしました。

using System; using UnityEngine; using System.Collections.Generic; namespace LogitechSDK { [RequireComponent(typeof(CarControllerOriginal))] public class CarUserControlOriginal : MonoBehaviour { private CarControllerOriginal m_Car; // the car controller we want to use public List<LogitechSDK.WheelInfo> wheelInfos; // 個々の車軸の情報 public float maxMotorTorque; //ホイールに適用可能な最大トルク public float maxSteeringAngle; // 適用可能な最大ハンドル角度 public float maxBrake; // ブレーキの力 private void Awake() { m_Car = GetComponent<CarControllerOriginal>(); Debug.Log("SteeringInit:" + LogitechGSDK.LogiSteeringInitialize(false)); } private void FixedUpdate() { if (!LogitechGSDK.LogiIsPlaying(0, LogitechGSDK.LOGI_FORCE_SPRING)) { // ハンドルに中心に向けた力を加えるように設定 LogitechGSDK.LogiPlaySpringForce(0, 0, 30, 100); } if (LogitechGSDK.LogiUpdate() && LogitechGSDK.LogiIsConnected(0)) { //CONTROLLER STATE LogitechGSDK.DIJOYSTATE2ENGINES rec = LogitechGSDK.LogiGetStateUnity(0); float steering = rec.lX / 32768f; // ハンドル float accel = rec.lY / -65536f + 0.5f; // アクセル float brake = rec.lRz / -65536f + 0.5f; // ブレーキ float back = rec.rglSlider[0] / 65536f + 0.5f; // バック float motor = maxMotorTorque * accel; //推進力 float brakepower = maxBrake * brake; //止める力 float StAngle = maxSteeringAngle * steering; //曲がる角度 foreach (WheelInfo wheelInfo in wheelInfos) { if (wheelInfo.steering) { wheelInfo.LWheel.steerAngle = StAngle; wheelInfo.RWheel.steerAngle = StAngle; } if (wheelInfo.drive) { if (motor > 1f) brakepower = 0; if (brakepower > 1f) motor = 0; wheelInfo.LWheel.motorTorque = motor; wheelInfo.RWheel.motorTorque = motor; wheelInfo.LWheel.brakeTorque = brakepower; wheelInfo.RWheel.brakeTorque = brakepower; Debug.Log(motor); } } } } } [System.Serializable] public class WheelInfo { public WheelCollider LWheel; public WheelCollider RWheel; public bool drive; //このホイールがエンジンにアタッチされているかどうか public bool steering; // このホイールがハンドルの角度を反映しているかどうか } }

後述:ハンコンの入力を受け取って車を動かせました。バックはまだ出来ませんが。。。
簡易的なものですが、同じような状況の方へ参考になればと思ったのでスクリプトを公開します。これをWheelCollider、Rigidbodyの付いた車にアタッチすれば動きます。インスペクター画面のWheel Infosの数値を2に設定してください。

投稿2023/11/16 02:44

編集2023/11/16 03:12
gere

総合スコア1

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問