実現したいこと
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が動かない理由が分からず、手がつけられない状態です。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。