こんにちは、Playerオブジェクトがひっくり返らないようにしたいため、角度制限をしようとしてみました。
コードです。
C#
1 float eulerAngleZ = transform.eulerAngles.z; 2 var min = -45; 3 var max = 45; 4 5 eulerAngleZ = Mathf.Clamp(eulerAngleZ, min, max); 6 7 if(eulerAngleZ < min && eulerAngleZ > max) 8 transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, eulerAngleZ);
フロートに現在のz軸を格納し、途中で、クランプを使い角度を制限しております。
このコードで実行してみると、がたがたしたりして、うまくいきませんでした。
これも書いてみました
C#
1 2 Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z); 3 carRot.z = Mathf.Clamp(carRot.z, -45, 45); 4 transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w);
これもうまくいきませんでした
次のも同じような感じです。
調べて書いてみたのですが、難しかったので、質問させてもらいました。
やり方を教えてくださる方、ご教示お願いします。
回答見ました。こうでしょうか?
C#
1 float eulerAngleZ = transform.eulerAngles.z; 2 var min = -45; 3 var max = 45; 4 5 var a = eulerAngleZ; 6 a = Mathf.Clamp(eulerAngleZ, min, max); 7 8 9 transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, a); 10 11
これでもうまくいきません。どこが間違っていますか?
少しでも傾くとそこからがたがたしてしまいます。
追記です コードと画像です
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[System.Serializable] 6public class AxleInfo 7{ 8 // 力を加えるCollider 9 public WheelCollider leftWheel; 10 public WheelCollider rightWheel; 11 12 public bool motor; // このホイールがエンジンにアタッチされているかどうか 13 public bool steering; // このホイールがハンドルの角度を反映しているかどうか 14} 15 16public class PlayerCar : MonoBehaviour 17{ 18 // AxleInfo クラスをインスペクタで設定できる 19 [SerializeField] private List<AxleInfo> axleInfos; // 個々の車軸の情報 20 [SerializeField] private float maxMotorTorque; // ホイールに適用可能な最大トルク 21 [SerializeField] private float maxSteerinAngle; // 適用可能最大ハンドル角度 22 23 // 空オブジェクト(Wheel Collider) 24 [SerializeField] private WheelCollider wheelFL; 25 [SerializeField] private WheelCollider wheelFR; 26 [SerializeField] private WheelCollider wheelBL; 27 [SerializeField] private WheelCollider wheelBR; 28 29 // ホイールのモデル 30 [SerializeField] private Transform wheelFLTrans; 31 [SerializeField] private Transform wheelFRTrans; 32 [SerializeField] private Transform wheelBLTrans; 33 [SerializeField] private Transform wheelBRTrans; 34 [SerializeField] private float steering = 0.0f; 35 public float motor = 0.0f; 36 37 // インスペクターで設定 38 [SerializeField,Header("スリップ値")] private float wheelExtremumSlip; 39 [SerializeField,Header("タイヤそのものの摩擦力")] private float wheelstiffness; 40 [SerializeField,Header("x軸摩擦力")] private float wheelFriction; 41 42 // Wheel Collider の値を保持するための変数 43 private WheelFrictionCurve wheelValueRetentionFL; 44 private WheelFrictionCurve wheelValueRetentionFR; 45 private WheelFrictionCurve wheelValueRetentionBL; 46 private WheelFrictionCurve wheelValueRetentionBR; 47 48 // 変更する値 49 private WheelFrictionCurve wheelChangeValue; 50 51 52 53 private new Rigidbody rigidbody; // AddForce に使う 54 [SerializeField] private float limitSpeed; // 速度制限 55 56 57 58 void Start() 59 { 60 // キャッシュしておく 61 rigidbody = GetComponent<Rigidbody>(); 62 63 // Wheel Collider の 横移動の値を保存しておく 64 wheelValueRetentionFL = wheelFL.sidewaysFriction; 65 wheelValueRetentionFR = wheelFR.sidewaysFriction; 66 wheelValueRetentionBL = wheelBL.sidewaysFriction; 67 wheelValueRetentionBR = wheelBR.sidewaysFriction; 68 } 69 70 public void FixedUpdate() 71 { 72 73 74 75 float eulerAngleZ = transform.eulerAngles.z; 76 var min = -45; 77 var max = 45; 78 79 var a = eulerAngleZ; 80 a = Mathf.Clamp(eulerAngleZ, min, max); 81 82 83 transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, a); 84 85 86 87 88 //var min = -20; 89 //var max = 20; 90 //var transformEuler = transform.eulerAngles.z; 91 92 //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z); 93 //if(carRot.z > min && carRot.z < max) { 94 // carRot.z = transformEuler; 95 //} 96 //else { 97 98 // carRot.z = 0; 99 //} 100 101 //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z); 102 //carRot.z = Mathf.Clamp(carRot.z, -45, 45); 103 //transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w); 104 105 }
**車を走らせるのには、WheelCollider を使っております。**何度かひっくり返ってしまうので、角度制限を付けて
ひっくり返らないようにしたいです。お願いします。
試しにWheelCollider を切ってみてもそのような挙動になってしまうので、私のコードの書き方が悪いのだと思います。
気になったことなどあったらご回答お願いします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/01/09 07:35
2021/01/09 13:16
2021/01/09 13:51
2021/01/09 14:23
2021/01/09 15:06
2021/01/10 09:27
2021/01/11 05:25
2021/01/11 05:27
2021/01/11 12:21
2021/01/11 13:01
2021/01/12 04:39
2021/01/12 08:25
2021/01/16 14:01