質問編集履歴
4
sumimasen
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
|
-
|
82
|
+
|
13
|
-
|
83
|
+
// ジャンプフラグ
|
14
|
-
transform model
|
15
|
-
|
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
|
-
|
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)
|
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
えい
title
CHANGED
@@ -1,1 +1,1 @@
|
|
1
|
-
フラグがたったらモデルをゆっくり回転させフラグがfalseになったらゆっくり元の角度に戻したい
|
1
|
+
フラグがたったらモデルを決まった角度までゆっくり回転させフラグがfalseになったらゆっくり元の角度に戻したい
|
body
CHANGED
File without changes
|
2
おういえす
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
えい
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
|
-
|
15
|
+
bool driftRight
|
16
|
-
|
16
|
+
|
17
|
-
// キャッシュしておく
|
18
|
-
rigidbody = GetComponent<Rigidbody>();
|
19
|
-
|
20
|
-
}
|
21
17
|
void Update()
|
22
18
|
{
|
23
19
|
float speed = 1f;
|