質問編集履歴

4

sumimasen

2020/12/12 09:38

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -1,8 +1,30 @@
1
+ スペースが押されている間、driftRight を true にし、update でゆっくり回転をしているのですが、一回目はちゃんと回ってくれるのですが、スペースを二回目に押すと、その続きから、ゆっくり回っていきます。else 文で Quaternion をゼロにしているはずなのですが、なぜだかわかりません。
2
+
3
+
4
+
1
- んにちは。
5
+ **やったと、**
6
+
2
-
7
+ 本来はFixd Update に回転する処理を書いておりましたが、Update に書き直しました。
8
+
3
- 試行錯誤てみたのですが、限界感じたので質問させて頂きま
9
+ ↓この方のサイト見ながらやってみたのですが、二回目以降スペース押すとうまくいきません
10
+
4
-
11
+ https://tama-lab.net/2017/06/unity%E3%81%A7%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%9B%9E%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81/
12
+
13
+ 横キーを押しながら、スペースを押したときに、ゆっくり回転し、スーペースを話したら、元の角度にゆっくり回転する挙動にしたいのですが、難しいです。もしヒントだけでも教えてくださる方、ご教示お願いします。
14
+
15
+
16
+
17
+
18
+
19
+ **ーーーーーーーーーー修正後コード全体ですーーーーーーーーーーーーーーーーーーーーーーーーー**
20
+
21
+
22
+
5
- 一部のコードを載ます
23
+ **回答者様すみま**
24
+
25
+
26
+
27
+
6
28
 
7
29
  ```C#
8
30
 
@@ -14,26 +36,196 @@
14
36
 
15
37
 
16
38
 
39
+ [System.Serializable]
40
+
41
+ public class AxleInfo
42
+
43
+ {
44
+
45
+ // 力を加えるCollider
46
+
47
+ public WheelCollider leftWheel;
48
+
49
+ public WheelCollider rightWheel;
50
+
51
+
52
+
53
+ public bool motor; // このホイールがエンジンにアタッチされているかどうか
54
+
55
+ public bool steering; // このホイールがハンドルの角度を反映しているかどうか
56
+
57
+ }
58
+
59
+
60
+
17
61
  public class PlayerCar : MonoBehaviour
18
62
 
19
63
  {
20
64
 
65
+ // AxleInfo クラスをインスペクタで設定できる
66
+
67
+ [SerializeField] private List<AxleInfo> axleInfos; // 個々の車軸の情報
68
+
69
+ [SerializeField] private float maxMotorTorque; // ホイールに適用可能な最大トルク
70
+
71
+ [SerializeField] private float maxSteerinAngle; // 適用可能最大ハンドル角度
72
+
73
+
74
+
75
+ // 空オブジェクト(Wheel Collider)
76
+
77
+ [SerializeField] private WheelCollider wheelFL;
78
+
79
+ [SerializeField] private WheelCollider wheelFR;
80
+
81
+ [SerializeField] private WheelCollider wheelBL;
82
+
83
+ [SerializeField] private WheelCollider wheelBR;
84
+
85
+
86
+
87
+ // ホイールのモデル
88
+
89
+ [SerializeField] private Transform wheelFLTrans;
90
+
91
+ [SerializeField] private Transform wheelFRTrans;
92
+
93
+ [SerializeField] private Transform wheelBLTrans;
94
+
95
+ [SerializeField] private Transform wheelBRTrans;
96
+
97
+ [SerializeField] private float steering = 0.0f;
98
+
99
+ public float motor = 0.0f;
100
+
101
+
102
+
103
+ // インスペクターで設定
104
+
105
+ [SerializeField,Header("加える力")] private float power;
106
+
107
+ [SerializeField,Header("スリップ値")] private float wheelExtremumSlip;
108
+
109
+ [SerializeField,Header("タイヤそのものの摩擦力")] private float wheelstiffness;
110
+
111
+ [SerializeField,Header("x軸摩擦力")] private float wheelFriction;
112
+
113
+
114
+
115
+ // Wheel Collider の値を保持するための変数
116
+
117
+ private WheelFrictionCurve wheelValueRetentionFL;
118
+
119
+ private WheelFrictionCurve wheelValueRetentionFR;
120
+
121
+ private WheelFrictionCurve wheelValueRetentionBL;
122
+
123
+ private WheelFrictionCurve wheelValueRetentionBR;
124
+
125
+
126
+
127
+ // 変更する値
128
+
129
+ private WheelFrictionCurve wheelChangeValue;
130
+
131
+
132
+
133
+ // ドリフトに必要なモーターの回転
134
+
135
+ private const float motorMax = 600;
136
+
137
+
138
+
139
+ // ドリフト時加える力
140
+
141
+ [SerializeField,Header("ドリフト時のX方向の力")] private float driftPowerX;
142
+
143
+ [SerializeField,Header("ドリフト時のZ方向の力")] private float driftPowerZ;
144
+
145
+
146
+
147
+ // ドリフトTimeを計る
148
+
149
+ [SerializeField,Header("壱段階目のドリフト時間")] private float driftMaxOne = 3;
150
+
151
+ [SerializeField,Header("弐段階目のドリフト時間")] private float driftMaxTwo = 6;
152
+
153
+ private float driftTimer;
154
+
155
+
156
+
157
+ private new Rigidbody rigidbody; // AddForce に使う
158
+
159
+ [SerializeField] private float limitSpeed; // 速度制限
160
+
21
161
 
22
162
 
23
- float steering
163
+
24
-
164
+
25
- bool driftStart
165
+ // ジャンプフラグ
26
-
27
-    transform model
166
+
28
-
29
-    bool driftRight
167
+ public bool jumpflg;
30
168
 
31
169
 
32
170
 
171
+ // ドリフトフラグ
172
+
173
+ public bool driftStart; // 始まったか
174
+
175
+ private bool driftDarsh1; // 壱段階目のドリフトダッシュ
176
+
177
+ private bool driftDarsh2; // 弐段階目のドリフトダッシュ
178
+
179
+
180
+
181
+ public int ranking;
182
+
183
+
184
+
185
+ private bool driftRight;
186
+
187
+ private bool driftLeft;
188
+
189
+ [SerializeField] private Transform model;
190
+
191
+
192
+
193
+
194
+
195
+ void Start()
196
+
197
+ {
198
+
199
+ // キャッシュしておく
200
+
201
+ rigidbody = GetComponent<Rigidbody>();
202
+
203
+
204
+
205
+ // Wheel Collider の 横移動の値を保存しておく
206
+
207
+ wheelValueRetentionFL = wheelFL.sidewaysFriction;
208
+
209
+ wheelValueRetentionFR = wheelFR.sidewaysFriction;
210
+
211
+ wheelValueRetentionBL = wheelBL.sidewaysFriction;
212
+
213
+ wheelValueRetentionBR = wheelBR.sidewaysFriction;
214
+
215
+ }
216
+
33
217
  void Update()
34
218
 
35
219
  {
36
220
 
221
+ WheelRotation();
222
+
223
+ if (driftRight)
224
+
225
+ {
226
+
227
+
228
+
37
229
  float speed = 1f;
38
230
 
39
231
  float step = speed * Time.deltaTime;
@@ -48,6 +240,102 @@
48
240
 
49
241
  }
50
242
 
243
+ public void FixedUpdate()
244
+
245
+ {
246
+
247
+ PlayerMove();
248
+
249
+ CarDrift();
250
+
251
+ CarDriftDarsh();
252
+
253
+ }
254
+
255
+
256
+
257
+ /// <summary>
258
+
259
+ /// プレイヤーの入力を受け取りタイヤに力を加える関数
260
+
261
+ /// </summary>
262
+
263
+ private void PlayerMove()
264
+
265
+ {
266
+
267
+ motor = maxMotorTorque * Input.GetAxis("Vertical");
268
+
269
+ steering = maxSteerinAngle * Input.GetAxis("Horizontal");
270
+
271
+
272
+
273
+ foreach (AxleInfo axleInfo in axleInfos)
274
+
275
+ {
276
+
277
+ if (axleInfo.steering)
278
+
279
+ {
280
+
281
+ axleInfo.leftWheel.steerAngle = steering;
282
+
283
+ axleInfo.rightWheel.steerAngle = steering;
284
+
285
+ }
286
+
287
+ if (axleInfo.motor)
288
+
289
+ {
290
+
291
+ axleInfo.leftWheel.motorTorque = motor;
292
+
293
+ axleInfo.rightWheel.motorTorque = motor;
294
+
295
+ }
296
+
297
+ }
298
+
299
+ }
300
+
301
+ /// <summary>
302
+
303
+ /// ホイールのモデルを回転する関数
304
+
305
+ /// </summary>
306
+
307
+ private void WheelRotation()
308
+
309
+ {
310
+
311
+ //wheelcolliderの回転速度に合わせてタイヤモデルを回転させる
312
+
313
+ wheelFLTrans.Rotate(wheelFL.rpm / 60 * 360 * Time.deltaTime, 0, 0);
314
+
315
+ wheelFRTrans.Rotate(wheelFR.rpm / 60 * 360 * Time.deltaTime, 0, 0);
316
+
317
+ wheelBLTrans.Rotate(wheelBL.rpm / 60 * 360 * Time.deltaTime, 0, 0);
318
+
319
+ wheelBRTrans.Rotate(wheelBR.rpm / 60 * 360 * Time.deltaTime, 0, 0);
320
+
321
+
322
+
323
+ //wheelcolliderの角度に合わせてタイヤモデルを回転する(フロントのみ)
324
+
325
+ wheelFLTrans.localEulerAngles = new Vector3(wheelFLTrans.localEulerAngles.x, wheelFL.steerAngle - wheelFLTrans.localEulerAngles.z, wheelFLTrans.localEulerAngles.z);
326
+
327
+ wheelFRTrans.localEulerAngles = new Vector3(wheelFRTrans.localEulerAngles.x, wheelFR.steerAngle - wheelFRTrans.localEulerAngles.z, wheelFRTrans.localEulerAngles.z);
328
+
329
+ }
330
+
331
+
332
+
333
+ /// <summary>
334
+
335
+ /// ドリフトをする関数
336
+
337
+ /// </summary>
338
+
51
339
  private void CarDrift()
52
340
 
53
341
  {
@@ -56,31 +344,83 @@
56
344
 
57
345
  {
58
346
 
59
-
60
-
61
- // タイヤの角度
62
-
63
- if((steering > 0 || steering < 0)
347
+ if((steering > 0 || steering < 0)
64
348
 
65
349
  && Input.GetKeyDown(KeyCode.Space)){
66
350
 
351
+ driftStart = true;
352
+
67
353
  }
68
354
 
69
355
  else if(driftStart && Input.GetKey(KeyCode.Space))
70
356
 
71
357
  {
72
358
 
359
+ driftTimer += Time.deltaTime;
360
+
361
+ if (driftTimer > driftMaxOne)
362
+
363
+ {
364
+
365
+ driftDarsh1 = true;
366
+
367
+ }
368
+
369
+ if (driftTimer > driftMaxTwo)
370
+
371
+ {
372
+
373
+ driftDarsh2 = true;
374
+
375
+ }
376
+
377
+ // 変更する値
378
+
379
+ wheelChangeValue = wheelFL.sidewaysFriction;
380
+
381
+ wheelChangeValue.extremumSlip = wheelExtremumSlip;
382
+
383
+ wheelChangeValue.asymptoteSlip = wheelExtremumSlip;
384
+
385
+ wheelChangeValue.extremumValue = wheelFriction;
386
+
387
+ wheelChangeValue.asymptoteValue = 0;
388
+
389
+ wheelChangeValue.stiffness = wheelstiffness;
390
+
391
+
392
+
393
+ // 変更の値を代入
394
+
395
+ wheelFL.sidewaysFriction = wheelChangeValue;
396
+
397
+ wheelFR.sidewaysFriction = wheelChangeValue;
398
+
399
+ wheelBL.sidewaysFriction = wheelChangeValue;
400
+
401
+ wheelBR.sidewaysFriction = wheelChangeValue;
402
+
403
+
404
+
73
405
  if (steering > 0)
74
406
 
75
407
  {
76
408
 
77
-
409
+ rigidbody.AddForce(new Vector3(driftPowerX, 0, driftPowerZ));
78
410
 
79
411
  driftRight = true;
80
412
 
81
413
  }
82
414
 
83
- if (steering < 0)  driftRight = true;
415
+ if (steering < 0) rigidbody.AddForce(new Vector3(-driftPowerX, 0, driftPowerZ));
416
+
417
+
418
+
419
+ // 速度制限
420
+
421
+ if (rigidbody.velocity.magnitude > limitSpeed) rigidbody.velocity = rigidbody.velocity.normalized * limitSpeed;
422
+
423
+ }
84
424
 
85
425
  else
86
426
 
@@ -88,28 +428,84 @@
88
428
 
89
429
  driftRight = false;
90
430
 
91
- model.transform.localRotation = new Quaternion(0,0,0,0);
431
+ //model.transform.localRotation = new Quaternion(0,0,0,0);
92
432
 
93
433
  //model.transform.rotation = new Vector3(0, 0, 0);
94
434
 
95
435
  //model.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
96
436
 
437
+ if (driftTimer < driftMaxOne) driftTimer = 0;
438
+
439
+ driftStart = false;
440
+
441
+ wheelFL.sidewaysFriction = wheelValueRetentionFL;
442
+
443
+ wheelFR.sidewaysFriction = wheelValueRetentionFR;
444
+
445
+ wheelBL.sidewaysFriction = wheelValueRetentionBL;
446
+
447
+ wheelBR.sidewaysFriction = wheelValueRetentionBR;
448
+
449
+
450
+
451
+ float speed = 1f;
452
+
453
+ float step = speed * Time.deltaTime;
454
+
455
+
456
+
457
+ //指定した方向にゆっくり回転する場合
458
+
459
+ model.transform.localRotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(0, 0, 0), step);
460
+
97
461
  }
98
462
 
463
+ }
464
+
465
+ }
466
+
467
+ /// <summary>
468
+
469
+ /// ドリフト後ダッシュする関数
470
+
471
+ /// </summary>
472
+
473
+ private void CarDriftDarsh()
474
+
475
+ {
476
+
477
+ if (driftStart) return;
478
+
479
+ if (driftDarsh2)
480
+
481
+ {
482
+
483
+ driftDarsh1 = false;
484
+
485
+ driftDarsh2 = false;
486
+
487
+ driftTimer = 0;
488
+
489
+ rigidbody.AddForce(transform.forward * 600000); // パーティクル入れるエフェクト
490
+
491
+ }
492
+
493
+ else if (driftDarsh1)
494
+
495
+ {
496
+
497
+ driftDarsh1 = false;
498
+
499
+ driftTimer = 0;
500
+
501
+ rigidbody.AddForce(transform.forward * 500000); // パーティクル入れるエフェクト
502
+
503
+ }
504
+
505
+ }
506
+
99
507
  }
100
508
 
509
+
510
+
101
511
  ```
102
-
103
- このようにスペースが押されている間、driftRight を true にし、update でゆっくり回転をしているのですが、一回目はちゃんと回ってくれるのですが、スペースを二回目に押すと、その続きから、ゆっくり回っていきます。else 文で Quaternion をゼロにしているはずなのですが、なぜだかわかりません。
104
-
105
-
106
-
107
- **やったこと、**
108
-
109
- 本来はFixd Update に回転する処理を書いておりましたが、Update に書き直しました。
110
-
111
- ↓この方のサイトを見ながらやってみたのですが、二回目以降スペースを押すとうまくいきません。
112
-
113
- https://tama-lab.net/2017/06/unity%E3%81%A7%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%9B%9E%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81/
114
-
115
- 横キーを押しながら、スペースを押したときに、ゆっくり回転し、スーペースを話したら、元の角度にゆっくり回転する挙動にしたいのですが、難しいです。もしヒントだけでも教えてくださる方、ご教示お願いします。

3

えい

2020/12/12 09:38

投稿

Um_kok
Um_kok

スコア39

test CHANGED
@@ -1 +1 @@
1
- フラグがたったらモデルをゆっくり回転させフラグがfalseになったらゆっくり元の角度に戻したい
1
+ フラグがたったらモデルを決まった角度までゆっくり回転させフラグがfalseになったらゆっくり元の角度に戻したい
test CHANGED
File without changes

2

おういえす

2020/12/12 07:39

投稿

Um_kok
Um_kok

スコア39

test CHANGED
File without changes
test CHANGED
@@ -112,4 +112,4 @@
112
112
 
113
113
  https://tama-lab.net/2017/06/unity%E3%81%A7%E3%82%AA%E3%83%96%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%9B%9E%E8%BB%A2%E3%81%95%E3%81%9B%E3%82%8B%E6%96%B9%E6%B3%95%E3%81%BE%E3%81%A8%E3%82%81/
114
114
 
115
- ら回転するのかわかる方、ご教示お願いします。
115
+ 横キーを押しがらスペースを押したとに、ゆっくり回転し、スーペースを話した、元の角度にゆっくり回転する挙動にしたいですが、難しいです。もしヒントだけでも教えてくださる方、ご教示お願いします。

1

えい

2020/12/12 07:35

投稿

Um_kok
Um_kok

スコア39

test CHANGED
@@ -1 +1 @@
1
- フラグがたったらモデルをゆっくり回転させたい
1
+ フラグがたったらモデルをゆっくり回転させフラグがfalseになっらゆっくり元の角度に戻した
test CHANGED
@@ -26,17 +26,9 @@
26
26
 
27
27
     transform model
28
28
 
29
- void Start()
29
+    bool driftRight
30
30
 
31
- {
31
+
32
-
33
- // キャッシュしておく
34
-
35
- rigidbody = GetComponent<Rigidbody>();
36
-
37
-
38
-
39
- }
40
32
 
41
33
  void Update()
42
34