teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

4

sumimasen

2020/12/12 09:38

投稿

Um_kok
Um_kok

スコア39

title CHANGED
File without changes
body CHANGED
@@ -1,21 +1,117 @@
1
+ スペースが押されている間、driftRight を true にし、update でゆっくり回転をしているのですが、一回目はちゃんと回ってくれるのですが、スペースを二回目に押すと、その続きから、ゆっくり回っていきます。else 文で Quaternion をゼロにしているはずなのですが、なぜだかわかりません。
2
+
1
- んにちは。
3
+ **やったと、**
4
+ 本来はFixd Update に回転する処理を書いておりましたが、Update に書き直しました。
2
- 試行錯誤てみたのですが、限界感じたので質問させて頂きま
5
+ ↓この方のサイト見ながらやってみたのですが、二回目以降スペース押すとうまくいきません
6
+ 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/
7
+ 横キーを押しながら、スペースを押したときに、ゆっくり回転し、スーペースを話したら、元の角度にゆっくり回転する挙動にしたいのですが、難しいです。もしヒントだけでも教えてくださる方、ご教示お願いします。
8
+
9
+
10
+ **ーーーーーーーーーー修正後コード全体ですーーーーーーーーーーーーーーーーーーーーーーーーー**
11
+
3
- 一部のコードを載せます。
12
+ **回答者様みません**
13
+
14
+
4
15
  ```C#
5
16
  using System.Collections;
6
17
  using System.Collections.Generic;
7
18
  using UnityEngine;
8
19
 
20
+ [System.Serializable]
21
+ public class AxleInfo
22
+ {
23
+ // 力を加えるCollider
24
+ public WheelCollider leftWheel;
25
+ public WheelCollider rightWheel;
26
+
27
+ public bool motor; // このホイールがエンジンにアタッチされているかどうか
28
+ public bool steering; // このホイールがハンドルの角度を反映しているかどうか
29
+ }
30
+
9
31
  public class PlayerCar : MonoBehaviour
10
32
  {
33
+ // AxleInfo クラスをインスペクタで設定できる
34
+ [SerializeField] private List<AxleInfo> axleInfos; // 個々の車軸の情報
35
+ [SerializeField] private float maxMotorTorque; // ホイールに適用可能な最大トルク
36
+ [SerializeField] private float maxSteerinAngle; // 適用可能最大ハンドル角度
37
+
38
+ // 空オブジェクト(Wheel Collider)
39
+ [SerializeField] private WheelCollider wheelFL;
40
+ [SerializeField] private WheelCollider wheelFR;
41
+ [SerializeField] private WheelCollider wheelBL;
42
+ [SerializeField] private WheelCollider wheelBR;
43
+
44
+ // ホイールのモデル
45
+ [SerializeField] private Transform wheelFLTrans;
46
+ [SerializeField] private Transform wheelFRTrans;
47
+ [SerializeField] private Transform wheelBLTrans;
48
+ [SerializeField] private Transform wheelBRTrans;
49
+ [SerializeField] private float steering = 0.0f;
50
+ public float motor = 0.0f;
51
+
52
+ // インスペクターで設定
53
+ [SerializeField,Header("加える力")] private float power;
54
+ [SerializeField,Header("スリップ値")] private float wheelExtremumSlip;
55
+ [SerializeField,Header("タイヤそのものの摩擦力")] private float wheelstiffness;
56
+ [SerializeField,Header("x軸摩擦力")] private float wheelFriction;
57
+
58
+ // Wheel Collider の値を保持するための変数
59
+ private WheelFrictionCurve wheelValueRetentionFL;
60
+ private WheelFrictionCurve wheelValueRetentionFR;
61
+ private WheelFrictionCurve wheelValueRetentionBL;
62
+ private WheelFrictionCurve wheelValueRetentionBR;
63
+
64
+ // 変更する値
65
+ private WheelFrictionCurve wheelChangeValue;
66
+
67
+ // ドリフトに必要なモーターの回転
68
+ private const float motorMax = 600;
69
+
70
+ // ドリフト時加える力
71
+ [SerializeField,Header("ドリフト時のX方向の力")] private float driftPowerX;
72
+ [SerializeField,Header("ドリフト時のZ方向の力")] private float driftPowerZ;
73
+
74
+ // ドリフトTimeを計る
75
+ [SerializeField,Header("壱段階目のドリフト時間")] private float driftMaxOne = 3;
76
+ [SerializeField,Header("弐段階目のドリフト時間")] private float driftMaxTwo = 6;
77
+ private float driftTimer;
78
+
79
+ private new Rigidbody rigidbody; // AddForce に使う
80
+ [SerializeField] private float limitSpeed; // 速度制限
11
81
 
12
- float steering
82
+
13
- bool driftStart
83
+ // ジャンプフラグ
14
-    transform model
15
-    bool driftRight
84
+ public bool jumpflg;
16
85
 
86
+ // ドリフトフラグ
87
+ public bool driftStart; // 始まったか
88
+ private bool driftDarsh1; // 壱段階目のドリフトダッシュ
89
+ private bool driftDarsh2; // 弐段階目のドリフトダッシュ
90
+
91
+ public int ranking;
92
+
93
+ private bool driftRight;
94
+ private bool driftLeft;
95
+ [SerializeField] private Transform model;
96
+
97
+
98
+ void Start()
99
+ {
100
+ // キャッシュしておく
101
+ rigidbody = GetComponent<Rigidbody>();
102
+
103
+ // Wheel Collider の 横移動の値を保存しておく
104
+ wheelValueRetentionFL = wheelFL.sidewaysFriction;
105
+ wheelValueRetentionFR = wheelFR.sidewaysFriction;
106
+ wheelValueRetentionBL = wheelBL.sidewaysFriction;
107
+ wheelValueRetentionBR = wheelBR.sidewaysFriction;
108
+ }
17
109
  void Update()
18
110
  {
111
+ WheelRotation();
112
+ if (driftRight)
113
+ {
114
+
19
115
  float speed = 1f;
20
116
  float step = speed * Time.deltaTime;
21
117
 
@@ -23,36 +119,138 @@
23
119
  model.transform.localRotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(0, 45f, 0), step);
24
120
  }
25
121
  }
122
+ public void FixedUpdate()
123
+ {
124
+ PlayerMove();
125
+ CarDrift();
126
+ CarDriftDarsh();
127
+ }
128
+
129
+ /// <summary>
130
+ /// プレイヤーの入力を受け取りタイヤに力を加える関数
131
+ /// </summary>
132
+ private void PlayerMove()
133
+ {
134
+ motor = maxMotorTorque * Input.GetAxis("Vertical");
135
+ steering = maxSteerinAngle * Input.GetAxis("Horizontal");
136
+
137
+ foreach (AxleInfo axleInfo in axleInfos)
138
+ {
139
+ if (axleInfo.steering)
140
+ {
141
+ axleInfo.leftWheel.steerAngle = steering;
142
+ axleInfo.rightWheel.steerAngle = steering;
143
+ }
144
+ if (axleInfo.motor)
145
+ {
146
+ axleInfo.leftWheel.motorTorque = motor;
147
+ axleInfo.rightWheel.motorTorque = motor;
148
+ }
149
+ }
150
+ }
151
+ /// <summary>
152
+ /// ホイールのモデルを回転する関数
153
+ /// </summary>
154
+ private void WheelRotation()
155
+ {
156
+ //wheelcolliderの回転速度に合わせてタイヤモデルを回転させる
157
+ wheelFLTrans.Rotate(wheelFL.rpm / 60 * 360 * Time.deltaTime, 0, 0);
158
+ wheelFRTrans.Rotate(wheelFR.rpm / 60 * 360 * Time.deltaTime, 0, 0);
159
+ wheelBLTrans.Rotate(wheelBL.rpm / 60 * 360 * Time.deltaTime, 0, 0);
160
+ wheelBRTrans.Rotate(wheelBR.rpm / 60 * 360 * Time.deltaTime, 0, 0);
161
+
162
+ //wheelcolliderの角度に合わせてタイヤモデルを回転する(フロントのみ)
163
+ wheelFLTrans.localEulerAngles = new Vector3(wheelFLTrans.localEulerAngles.x, wheelFL.steerAngle - wheelFLTrans.localEulerAngles.z, wheelFLTrans.localEulerAngles.z);
164
+ wheelFRTrans.localEulerAngles = new Vector3(wheelFRTrans.localEulerAngles.x, wheelFR.steerAngle - wheelFRTrans.localEulerAngles.z, wheelFRTrans.localEulerAngles.z);
165
+ }
166
+
167
+ /// <summary>
168
+ /// ドリフトをする関数
169
+ /// </summary>
26
170
  private void CarDrift()
27
171
  {
28
172
  if(motor > motorMax)
29
173
  {
30
-
31
- // タイヤの角度
32
- if((steering > 0 || steering < 0)
174
+ if((steering > 0 || steering < 0)
33
175
  && Input.GetKeyDown(KeyCode.Space)){
176
+ driftStart = true;
34
177
  }
35
178
  else if(driftStart && Input.GetKey(KeyCode.Space))
36
179
  {
180
+ driftTimer += Time.deltaTime;
181
+ if (driftTimer > driftMaxOne)
182
+ {
183
+ driftDarsh1 = true;
184
+ }
185
+ if (driftTimer > driftMaxTwo)
186
+ {
187
+ driftDarsh2 = true;
188
+ }
189
+ // 変更する値
190
+ wheelChangeValue = wheelFL.sidewaysFriction;
191
+ wheelChangeValue.extremumSlip = wheelExtremumSlip;
192
+ wheelChangeValue.asymptoteSlip = wheelExtremumSlip;
193
+ wheelChangeValue.extremumValue = wheelFriction;
194
+ wheelChangeValue.asymptoteValue = 0;
195
+ wheelChangeValue.stiffness = wheelstiffness;
196
+
197
+ // 変更の値を代入
198
+ wheelFL.sidewaysFriction = wheelChangeValue;
199
+ wheelFR.sidewaysFriction = wheelChangeValue;
200
+ wheelBL.sidewaysFriction = wheelChangeValue;
201
+ wheelBR.sidewaysFriction = wheelChangeValue;
202
+
37
203
  if (steering > 0)
38
204
  {
39
-
205
+ rigidbody.AddForce(new Vector3(driftPowerX, 0, driftPowerZ));
40
206
  driftRight = true;
41
207
  }
42
- if (steering < 0)  driftRight = true;
208
+ if (steering < 0) rigidbody.AddForce(new Vector3(-driftPowerX, 0, driftPowerZ));
209
+
210
+ // 速度制限
211
+ if (rigidbody.velocity.magnitude > limitSpeed) rigidbody.velocity = rigidbody.velocity.normalized * limitSpeed;
212
+ }
43
213
  else
44
214
  {
45
215
  driftRight = false;
46
- model.transform.localRotation = new Quaternion(0,0,0,0);
216
+ //model.transform.localRotation = new Quaternion(0,0,0,0);
47
217
  //model.transform.rotation = new Vector3(0, 0, 0);
48
218
  //model.transform.localEulerAngles = new Vector3(0f, 0f, 0f);
219
+ if (driftTimer < driftMaxOne) driftTimer = 0;
220
+ driftStart = false;
221
+ wheelFL.sidewaysFriction = wheelValueRetentionFL;
222
+ wheelFR.sidewaysFriction = wheelValueRetentionFR;
223
+ wheelBL.sidewaysFriction = wheelValueRetentionBL;
224
+ wheelBR.sidewaysFriction = wheelValueRetentionBR;
225
+
226
+ float speed = 1f;
227
+ float step = speed * Time.deltaTime;
228
+
229
+ //指定した方向にゆっくり回転する場合
230
+ model.transform.localRotation = Quaternion.RotateTowards(transform.rotation, Quaternion.Euler(0, 0, 0), step);
49
231
  }
232
+ }
233
+ }
234
+ /// <summary>
235
+ /// ドリフト後ダッシュする関数
236
+ /// </summary>
237
+ private void CarDriftDarsh()
238
+ {
239
+ if (driftStart) return;
240
+ if (driftDarsh2)
241
+ {
242
+ driftDarsh1 = false;
243
+ driftDarsh2 = false;
244
+ driftTimer = 0;
245
+ rigidbody.AddForce(transform.forward * 600000); // パーティクル入れるエフェクト
246
+ }
247
+ else if (driftDarsh1)
248
+ {
249
+ driftDarsh1 = false;
250
+ driftTimer = 0;
251
+ rigidbody.AddForce(transform.forward * 500000); // パーティクル入れるエフェクト
252
+ }
253
+ }
50
254
  }
51
- ```
52
- このようにスペースが押されている間、driftRight を true にし、update でゆっくり回転をしているのですが、一回目はちゃんと回ってくれるのですが、スペースを二回目に押すと、その続きから、ゆっくり回っていきます。else 文で Quaternion をゼロにしているはずなのですが、なぜだかわかりません。
53
255
 
54
- **やったこと、**
256
+ ```
55
- 本来はFixd Update に回転する処理を書いておりましたが、Update に書き直しました。
56
- ↓この方のサイトを見ながらやってみたのですが、二回目以降スペースを押すとうまくいきません。
57
- 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/
58
- 横キーを押しながら、スペースを押したときに、ゆっくり回転し、スーペースを話したら、元の角度にゆっくり回転する挙動にしたいのですが、難しいです。もしヒントだけでも教えてくださる方、ご教示お願いします。

3

えい

2020/12/12 09:38

投稿

Um_kok
Um_kok

スコア39

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

2

おういえす

2020/12/12 07:39

投稿

Um_kok
Um_kok

スコア39

title CHANGED
File without changes
body CHANGED
@@ -55,4 +55,4 @@
55
55
  本来はFixd Update に回転する処理を書いておりましたが、Update に書き直しました。
56
56
  ↓この方のサイトを見ながらやってみたのですが、二回目以降スペースを押すとうまくいきません。
57
57
  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/
58
- ら回転するのかわかる方、ご教示お願いします。
58
+ 横キーを押しがらスペースを押したとに、ゆっくり回転し、スーペースを話した、元の角度にゆっくり回転する挙動にしたいですが、難しいです。もしヒントだけでも教えてくださる方、ご教示お願いします。

1

えい

2020/12/12 07:35

投稿

Um_kok
Um_kok

スコア39

title CHANGED
@@ -1,1 +1,1 @@
1
- フラグがたったらモデルをゆっくり回転させたい
1
+ フラグがたったらモデルをゆっくり回転させフラグがfalseになっらゆっくり元の角度に戻した
body CHANGED
@@ -12,12 +12,8 @@
12
12
  float steering
13
13
  bool driftStart
14
14
     transform model
15
- void Start()
15
+    bool driftRight
16
- {
16
+
17
- // キャッシュしておく
18
- rigidbody = GetComponent<Rigidbody>();
19
-
20
- }
21
17
  void Update()
22
18
  {
23
19
  float speed = 1f;