質問編集履歴

5

era-date (

2021/01/09 13:52

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -310,7 +310,7 @@
310
310
 
311
311
  ```
312
312
 
313
- 車を走らせるのには、WheelCollider を使っております。何度かひっくり返ってしまうので、角度制限を付けて
313
+ **車を走らせるのには、WheelCollider を使っております。**何度かひっくり返ってしまうので、角度制限を付けて
314
314
 
315
315
  ひっくり返らないようにしたいです。お願いします。
316
316
 

4

ほえ

2021/01/09 13:52

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -89,3 +89,239 @@
89
89
  これでもうまくいきません。どこが間違っていますか?
90
90
 
91
91
  少しでも傾くとそこからがたがたしてしまいます。
92
+
93
+
94
+
95
+
96
+
97
+ ### 追記です コードと画像です
98
+
99
+ ```C#
100
+
101
+ using System.Collections;
102
+
103
+ using System.Collections.Generic;
104
+
105
+ using UnityEngine;
106
+
107
+
108
+
109
+ [System.Serializable]
110
+
111
+ public class AxleInfo
112
+
113
+ {
114
+
115
+ // 力を加えるCollider
116
+
117
+ public WheelCollider leftWheel;
118
+
119
+ public WheelCollider rightWheel;
120
+
121
+
122
+
123
+ public bool motor; // このホイールがエンジンにアタッチされているかどうか
124
+
125
+ public bool steering; // このホイールがハンドルの角度を反映しているかどうか
126
+
127
+ }
128
+
129
+
130
+
131
+ public class PlayerCar : MonoBehaviour
132
+
133
+ {
134
+
135
+ // AxleInfo クラスをインスペクタで設定できる
136
+
137
+ [SerializeField] private List<AxleInfo> axleInfos; // 個々の車軸の情報
138
+
139
+ [SerializeField] private float maxMotorTorque; // ホイールに適用可能な最大トルク
140
+
141
+ [SerializeField] private float maxSteerinAngle; // 適用可能最大ハンドル角度
142
+
143
+
144
+
145
+ // 空オブジェクト(Wheel Collider)
146
+
147
+ [SerializeField] private WheelCollider wheelFL;
148
+
149
+ [SerializeField] private WheelCollider wheelFR;
150
+
151
+ [SerializeField] private WheelCollider wheelBL;
152
+
153
+ [SerializeField] private WheelCollider wheelBR;
154
+
155
+
156
+
157
+ // ホイールのモデル
158
+
159
+ [SerializeField] private Transform wheelFLTrans;
160
+
161
+ [SerializeField] private Transform wheelFRTrans;
162
+
163
+ [SerializeField] private Transform wheelBLTrans;
164
+
165
+ [SerializeField] private Transform wheelBRTrans;
166
+
167
+ [SerializeField] private float steering = 0.0f;
168
+
169
+ public float motor = 0.0f;
170
+
171
+
172
+
173
+ // インスペクターで設定
174
+
175
+ [SerializeField,Header("スリップ値")] private float wheelExtremumSlip;
176
+
177
+ [SerializeField,Header("タイヤそのものの摩擦力")] private float wheelstiffness;
178
+
179
+ [SerializeField,Header("x軸摩擦力")] private float wheelFriction;
180
+
181
+
182
+
183
+ // Wheel Collider の値を保持するための変数
184
+
185
+ private WheelFrictionCurve wheelValueRetentionFL;
186
+
187
+ private WheelFrictionCurve wheelValueRetentionFR;
188
+
189
+ private WheelFrictionCurve wheelValueRetentionBL;
190
+
191
+ private WheelFrictionCurve wheelValueRetentionBR;
192
+
193
+
194
+
195
+ // 変更する値
196
+
197
+ private WheelFrictionCurve wheelChangeValue;
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+ private new Rigidbody rigidbody; // AddForce に使う
206
+
207
+ [SerializeField] private float limitSpeed; // 速度制限
208
+
209
+
210
+
211
+
212
+
213
+
214
+
215
+ void Start()
216
+
217
+ {
218
+
219
+ // キャッシュしておく
220
+
221
+ rigidbody = GetComponent<Rigidbody>();
222
+
223
+
224
+
225
+ // Wheel Collider の 横移動の値を保存しておく
226
+
227
+ wheelValueRetentionFL = wheelFL.sidewaysFriction;
228
+
229
+ wheelValueRetentionFR = wheelFR.sidewaysFriction;
230
+
231
+ wheelValueRetentionBL = wheelBL.sidewaysFriction;
232
+
233
+ wheelValueRetentionBR = wheelBR.sidewaysFriction;
234
+
235
+ }
236
+
237
+
238
+
239
+ public void FixedUpdate()
240
+
241
+ {
242
+
243
+
244
+
245
+
246
+
247
+
248
+
249
+ float eulerAngleZ = transform.eulerAngles.z;
250
+
251
+ var min = -45;
252
+
253
+ var max = 45;
254
+
255
+
256
+
257
+ var a = eulerAngleZ;
258
+
259
+ a = Mathf.Clamp(eulerAngleZ, min, max);
260
+
261
+
262
+
263
+
264
+
265
+ transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, a);
266
+
267
+
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+ //var min = -20;
276
+
277
+ //var max = 20;
278
+
279
+ //var transformEuler = transform.eulerAngles.z;
280
+
281
+
282
+
283
+ //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z);
284
+
285
+ //if(carRot.z > min && carRot.z < max) {
286
+
287
+ // carRot.z = transformEuler;
288
+
289
+ //}
290
+
291
+ //else {
292
+
293
+
294
+
295
+ // carRot.z = 0;
296
+
297
+ //}
298
+
299
+
300
+
301
+ //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z);
302
+
303
+ //carRot.z = Mathf.Clamp(carRot.z, -45, 45);
304
+
305
+ //transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w);
306
+
307
+
308
+
309
+ }
310
+
311
+ ```
312
+
313
+ 車を走らせるのには、WheelCollider を使っております。何度かひっくり返ってしまうので、角度制限を付けて
314
+
315
+ ひっくり返らないようにしたいです。お願いします。
316
+
317
+
318
+
319
+ ![イメージ説明](d0af2a48a95aafb3796d9ad255a402b2.png)
320
+
321
+ 少し傾くと、こんな感じに右左右左揺れてガタガタします。
322
+
323
+
324
+
325
+ 試しにWheelCollider を切ってみてもそのような挙動になってしまうので、私のコードの書き方が悪いのだと思います。
326
+
327
+ 気になったことなどあったらご回答お願いします。

3

ほえ

2021/01/09 13:49

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -87,3 +87,5 @@
87
87
  ```
88
88
 
89
89
  これでもうまくいきません。どこが間違っていますか?
90
+
91
+ 少しでも傾くとそこからがたがたしてしまいます。

2

era-NullReferenceException: Object reference not set to an instance of an object PlayerMove.Update (

2021/01/09 07:35

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -51,3 +51,39 @@
51
51
  調べて書いてみたのですが、難しかったので、質問させてもらいました。
52
52
 
53
53
  やり方を教えてくださる方、ご教示お願いします。
54
+
55
+
56
+
57
+
58
+
59
+
60
+
61
+ ### 回答見ました。こうでしょうか?
62
+
63
+ ```C#
64
+
65
+ float eulerAngleZ = transform.eulerAngles.z;
66
+
67
+ var min = -45;
68
+
69
+ var max = 45;
70
+
71
+
72
+
73
+ var a = eulerAngleZ;
74
+
75
+ a = Mathf.Clamp(eulerAngleZ, min, max);
76
+
77
+
78
+
79
+
80
+
81
+ transform.eulerAngles = new Vector3(transform.eulerAngles.x, transform.eulerAngles.y, a);
82
+
83
+
84
+
85
+
86
+
87
+ ```
88
+
89
+ これでもうまくいきません。どこが間違っていますか?

1

ほえ

2021/01/09 07:34

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -36,11 +36,11 @@
36
36
 
37
37
 
38
38
 
39
- //Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z);
39
+ Vector3 carRot = new Vector3(transform.rotation.x, transform.rotation.y, transform.rotation.z);
40
40
 
41
- //carRot.z = Mathf.Clamp(carRot.z, -45, 45);
41
+ carRot.z = Mathf.Clamp(carRot.z, -45, 45);
42
42
 
43
- //transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w);
43
+ transform.rotation = new Quaternion(carRot.x, carRot.y, carRot.z, transform.rotation.w);
44
44
 
45
45
  ```
46
46