質問編集履歴
7
文章とタイトルを編集しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Unity3D 斜面を
|
1
|
+
Unity3D 斜面の上り下りを正確に実装するにはどうすればいいのか?
|
test
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
タイトル通りですが**「坂道で下がる処理を実装」**したいです。
|
2
|
-
|
3
1
|
坂道を上がり下がりする時のY軸の移動量をする処理がSlope_Mng()関数のコードです。提示画像の線がRayです。
|
4
2
|
|
5
3
|
|
6
4
|
|
7
|
-
困っていること、提示画像のようにRayを2方向に飛ばし緑のRayは下がる時に斜面に当たりY軸の移動量を計算しているのですが提示画像2、3、番目のように動いているときと止まっているときで微妙に浮いてしまってキーを離したときにY軸が下がってしまったり、斜面を下がり続けるとだんだん空中に浮いてしまい斜面を下り終えると空中にその分浮いてしまいます。これはどうすればいいのでしょうか?
|
5
|
+
質問1、困っていること、提示画像のようにRayを2方向に飛ばし緑のRayは下がる時に斜面に当たりY軸の移動量を計算しているのですが提示画像2、3、番目のように動いているときと止まっているときで微妙に浮いてしまってキーを離したときにY軸が下がってしまったり、斜面を下がり続けるとだんだん空中に浮いてしまい斜面を下り終えると空中にその分浮いてしまいます。これはどうすればいいのでしょうか?
|
8
|
-
|
9
|
-
|
10
|
-
|
6
|
+
|
7
|
+
|
8
|
+
|
11
|
-
またRayの場所や長さはこれいいのか?そもそも実装法が正しいのかどうかなど知りたいです。
|
9
|
+
質問2、またRayの場所や長さはこれいいのか?そもそも実装法が正しいのかどうかなど知りたいです。
|
10
|
+
|
11
|
+
質問3、プロだったらどう実装するのか知りたい
|
12
12
|
|
13
13
|
|
14
14
|
|
6
タイトルを編集しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Unity3D 斜面を
|
1
|
+
Unity3D 斜面を下る時に空中い浮いてしまうバグの修正方法が知りたい。
|
test
CHANGED
File without changes
|
5
文章とタイトルを編集しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Unity3D 斜面を下がり
|
1
|
+
Unity3D 斜面を上がり下がり処理を実装で微調整する方法が知りたい
|
test
CHANGED
@@ -1,14 +1,20 @@
|
|
1
|
-
タイトル通りですが**「坂道で下が
|
1
|
+
タイトル通りですが**「坂道で下がる処理を実装」**したいです。
|
2
|
-
|
2
|
+
|
3
|
-
坂道を上が
|
3
|
+
坂道を上がり下がりする時のY軸の移動量をする処理がSlope_Mng()関数のコードです。提示画像の線がRayです。
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
|
8
|
-
|
9
|
-
|
10
|
-
|
5
|
+
|
6
|
+
|
11
|
-
困っていること、
|
7
|
+
困っていること、提示画像のようにRayを2方向に飛ばし緑のRayは下がる時に斜面に当たりY軸の移動量を計算しているのですが提示画像2、3、番目のように動いているときと止まっているときで微妙に浮いてしまってキーを離したときにY軸が下がってしまったり、斜面を下がり続けるとだんだん空中に浮いてしまい斜面を下り終えると空中にその分浮いてしまいます。これはどうすればいいのでしょうか?
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
またRayの場所や長さはこれいいのか?そもそも実装法が正しいのかどうかなど知りたいです。
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
12
18
|
|
13
19
|
|
14
20
|
|
@@ -20,13 +26,11 @@
|
|
20
26
|
|
21
27
|
|
22
28
|
|
23
|
-
|
29
|
+
![イメージ説明](5a4bace461944f0fac13f6c338e4ec06.png)
|
30
|
+
|
24
|
-
|
31
|
+
![イメージ説明](884f3c61b5bebf451abd7f4bebb59974.png)
|
25
|
-
|
26
|
-
|
32
|
+
|
27
|
-
![イメージ説明](
|
33
|
+
![イメージ説明](dcf3fed74b9e39cc4be442affa076c0e.png)
|
28
|
-
|
29
|
-
|
30
34
|
|
31
35
|
```ここに言語を入力
|
32
36
|
|
@@ -84,11 +88,21 @@
|
|
84
88
|
|
85
89
|
[SerializeField]
|
86
90
|
|
91
|
+
float slope_range;
|
92
|
+
|
93
|
+
[SerializeField]
|
94
|
+
|
87
|
-
Vector3 slope_r
|
95
|
+
Vector3 slope_direc = new Vector3(0, 0, 0);
|
96
|
+
|
88
|
-
|
97
|
+
[SerializeField]
|
98
|
+
|
89
|
-
|
99
|
+
Vector3 slope_direc_b = new Vector3(0, 0, 0);
|
100
|
+
|
101
|
+
|
102
|
+
|
90
|
-
|
103
|
+
// [SerializeField]
|
104
|
+
|
91
|
-
|
105
|
+
Vector3 slope_pos;
|
92
106
|
|
93
107
|
// Use this for initialization
|
94
108
|
|
@@ -102,7 +116,11 @@
|
|
102
116
|
|
103
117
|
Slope = GameObject.Find("SlopeCheck");
|
104
118
|
|
119
|
+
|
120
|
+
|
121
|
+
Slope.transform.position = slope_pos + Slope.transform.position;
|
122
|
+
|
105
|
-
walk_speed =
|
123
|
+
walk_speed = 100;
|
106
124
|
|
107
125
|
gravity = Vector3.zero;
|
108
126
|
|
@@ -144,31 +162,73 @@
|
|
144
162
|
|
145
163
|
|
146
164
|
|
147
|
-
Vector3 forward = transform.forward + slope_range;
|
165
|
+
//Vector3 forward = Slope.transform.forward + slope_range;
|
166
|
+
|
167
|
+
|
168
|
+
|
148
|
-
|
169
|
+
Vector3 forward = (Slope.transform.forward + slope_direc) * slope_range;
|
170
|
+
|
171
|
+
Vector3 forward_b = (Slope.transform.forward + slope_direc_b) * slope_range;
|
172
|
+
|
173
|
+
|
174
|
+
|
149
|
-
Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward
|
175
|
+
Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward, Color.blue);
|
176
|
+
|
150
|
-
|
177
|
+
Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward_b ,Color.green);
|
178
|
+
|
151
|
-
float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z));
|
179
|
+
// float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z));
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
185
|
+
|
186
|
+
|
152
|
-
|
187
|
+
// float speed = Mathf.Abs(Mathf.Sqrt((move.x * move.x) + (move.z * move.z)));
|
153
|
-
|
154
|
-
|
188
|
+
|
155
|
-
|
189
|
+
float speed = 100;
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
Debug.Log("speed: " + speed);
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
if(move != Vector3.zero){
|
156
198
|
|
157
199
|
if(Physics.Linecast(Slope.transform.position, Slope.transform.position + forward, out hit,LayerMask.GetMask("Slope")) == true)
|
158
200
|
|
159
201
|
{
|
160
202
|
|
161
|
-
Debug.Log("坂道のRayヒット!");
|
162
|
-
|
163
203
|
|
164
204
|
|
165
205
|
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * speed).y, 0f) + transform.forward * speed;
|
166
206
|
|
167
|
-
Debug.Log("v.y: "+ v.y);
|
207
|
+
//Debug.Log("v.y: "+ v.y);
|
208
|
+
|
209
|
+
Debug.Log("坂道のRayヒット! 上がる" + v.y);
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
}else if(Physics.Linecast(Slope.transform.position, Slope.transform.position + forward_b, out hit, LayerMask.GetMask("Slope")) == true)
|
214
|
+
|
215
|
+
{
|
216
|
+
|
217
|
+
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * speed).y, 0f) + transform.forward * speed;
|
218
|
+
|
219
|
+
//Debug.Log("v.y: "+ v.y);
|
220
|
+
|
221
|
+
Debug.Log("坂道のRayヒット! 下がる" + v.y);
|
222
|
+
|
223
|
+
}else{
|
224
|
+
|
225
|
+
v.y = 0;
|
168
226
|
|
169
227
|
}
|
170
228
|
|
229
|
+
}
|
230
|
+
|
171
|
-
|
231
|
+
else{
|
172
232
|
|
173
233
|
v.y = 0;
|
174
234
|
|
@@ -192,46 +252,36 @@
|
|
192
252
|
|
193
253
|
input_v = Input.GetAxis("Vertical");
|
194
254
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
255
|
Vector3 move_z = new Vector3();
|
202
256
|
|
203
257
|
Vector3 move_x = new Vector3();
|
204
258
|
|
205
|
-
move_z = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v
|
259
|
+
move_z = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v;
|
206
|
-
|
260
|
+
|
207
|
-
move_x = Camera.main.transform.right * input_h;
|
261
|
+
move_x = Camera.main.transform.right * input_h;
|
208
262
|
|
209
263
|
move = move_x + move_z;
|
210
264
|
|
211
265
|
|
212
266
|
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
move.x *= 200;
|
220
|
-
|
221
|
-
move.z *= 200;
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
267
|
if (move != Vector3.zero)
|
228
268
|
|
229
269
|
{
|
230
270
|
|
271
|
+
move.y = 0;
|
272
|
+
|
231
273
|
transform.rotation = Quaternion.LookRotation(move.normalized);
|
232
274
|
|
233
275
|
}
|
234
276
|
|
277
|
+
|
278
|
+
|
279
|
+
|
280
|
+
|
281
|
+
|
282
|
+
|
283
|
+
|
284
|
+
|
235
285
|
}
|
236
286
|
|
237
287
|
|
@@ -252,11 +302,23 @@
|
|
252
302
|
|
253
303
|
|
254
304
|
|
305
|
+
|
306
|
+
|
307
|
+
// Debug.Log("velocity: " + Mathf.Sqrt((rb.velocity.x * rb.velocity.x) + (rb.velocity.z * rb.velocity.z)));
|
308
|
+
|
309
|
+
|
310
|
+
|
311
|
+
Debug.Log("velocity: " + rb.velocity);
|
312
|
+
|
313
|
+
move *= 100;
|
314
|
+
|
315
|
+
|
316
|
+
|
255
|
-
}
|
317
|
+
}
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
|
260
322
|
|
261
323
|
//////////////////////////////////////////////////////////////////////////////////////////////
|
262
324
|
|
@@ -266,15 +328,15 @@
|
|
266
328
|
|
267
329
|
|
268
330
|
|
331
|
+
|
332
|
+
|
269
|
-
|
333
|
+
// rb.AddForce(move.x, v.y, move.z);
|
270
|
-
|
271
|
-
|
272
334
|
|
273
335
|
rb.AddForce(move.x, v.y, move.z);
|
274
336
|
|
275
337
|
|
276
338
|
|
277
|
-
|
339
|
+
|
278
340
|
|
279
341
|
}
|
280
342
|
|
4
文章を修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
Unity3D 斜面を
|
1
|
+
Unity3D 斜面を下がりする処理を作りたい、調べましたが...
|
test
CHANGED
@@ -1,124 +1,290 @@
|
|
1
|
+
タイトル通りですが**「坂道で下がったりする処理を実装」**したいです。
|
2
|
+
|
1
|
-
坂道を上がったり下がったりする時
|
3
|
+
坂道を上がったり下がったりする時のY軸の移動量をする処理がSlope_Mng()関数のコードです。提示画像の青い線がRayです。
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
|
5
|
+
|
6
|
+
|
5
|
-
|
7
|
+
実現したいこと、 提示画像のように坂道を下る時に空中に居ないように**地面にくっついて移動したい。**
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
|
9
|
+
|
10
|
+
|
9
|
-
|
11
|
+
困っていること、何が理由で上手く動いてないのか?そもそもこの数式は正しいのか知りたいです。またなぜ浮いてしまうのか?何が違うのか知りたいです。おそらく速度だと思われるのですがspeedをかけている部分はどうすればいいのでしょうか?
|
12
|
+
|
13
|
+
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
|
18
|
+
|
10
|
-
|
19
|
+
参考サイト: https://gametukurikata.com/program/rigidbodyandcollider
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
19
|
-
![イメージ説明](dc
|
27
|
+
![イメージ説明](8d0cf592b918db0b67ed58b5f1c20a65.png)
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
28
|
+
|
24
|
-
|
25
|
-
|
29
|
+
|
26
30
|
|
27
31
|
```ここに言語を入力
|
28
32
|
|
29
|
-
|
33
|
+
using System.Collections;
|
30
|
-
|
31
|
-
|
32
|
-
|
34
|
+
|
33
|
-
|
35
|
+
using System.Collections.Generic;
|
36
|
+
|
34
|
-
|
37
|
+
using UnityEngine;
|
38
|
+
|
39
|
+
|
40
|
+
|
41
|
+
public class Controller : MonoBehaviour
|
42
|
+
|
35
|
-
|
43
|
+
{
|
44
|
+
|
45
|
+
|
46
|
+
|
36
|
-
|
47
|
+
private float input_h;
|
48
|
+
|
37
|
-
|
49
|
+
private float input_v;
|
50
|
+
|
38
|
-
|
51
|
+
private Vector3 move;
|
52
|
+
|
53
|
+
private Rigidbody rb;
|
54
|
+
|
55
|
+
private float walk_speed;//移動速度
|
56
|
+
|
57
|
+
private Animator ani;//移動速度
|
58
|
+
|
59
|
+
private Vector3 gravity;
|
60
|
+
|
61
|
+
private bool isJump = false;//ジャンプしてるかどうかを管理する
|
62
|
+
|
63
|
+
private Vector3 v;
|
64
|
+
|
65
|
+
private bool isDush;
|
66
|
+
|
67
|
+
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
GameObject Ground;
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
/*坂道計算*/
|
80
|
+
|
81
|
+
GameObject Slope;
|
82
|
+
|
83
|
+
|
84
|
+
|
85
|
+
[SerializeField]
|
86
|
+
|
87
|
+
Vector3 slope_range = new Vector3(0, 0, 0);
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
// Use this for initialization
|
94
|
+
|
95
|
+
void Start()
|
96
|
+
|
97
|
+
{
|
98
|
+
|
99
|
+
|
100
|
+
|
101
|
+
Ground = GameObject.Find("GroundCheck");
|
102
|
+
|
103
|
+
Slope = GameObject.Find("SlopeCheck");
|
104
|
+
|
39
|
-
|
105
|
+
walk_speed = 5.0f;
|
106
|
+
|
40
|
-
|
107
|
+
gravity = Vector3.zero;
|
108
|
+
|
41
|
-
|
109
|
+
rb = GetComponent<Rigidbody>();
|
42
|
-
|
110
|
+
|
43
|
-
|
111
|
+
ani = GetComponent<Animator>();
|
112
|
+
|
113
|
+
|
114
|
+
|
115
|
+
|
116
|
+
|
44
|
-
|
117
|
+
}
|
118
|
+
|
119
|
+
|
120
|
+
|
121
|
+
|
122
|
+
|
45
|
-
|
123
|
+
void Gravity_Mng()//ジャンプ管理
|
124
|
+
|
125
|
+
{
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
131
|
+
}
|
132
|
+
|
133
|
+
|
134
|
+
|
135
|
+
|
136
|
+
|
137
|
+
|
138
|
+
|
139
|
+
void Slope_Mng()//坂道
|
140
|
+
|
141
|
+
{
|
46
142
|
|
47
143
|
RaycastHit hit;
|
48
144
|
|
49
145
|
|
50
146
|
|
51
|
-
|
147
|
+
Vector3 forward = transform.forward + slope_range;
|
148
|
+
|
52
|
-
|
149
|
+
Debug.DrawLine(Slope.transform.position, Slope.transform.position + forward ,Color.blue);
|
150
|
+
|
151
|
+
float speed = Mathf.Sqrt((move.x * move.x) + (move.z * move.z));
|
152
|
+
|
153
|
+
|
154
|
+
|
53
|
-
if(
|
155
|
+
if(speed != 0){
|
54
|
-
|
55
|
-
|
156
|
+
|
56
|
-
|
57
|
-
if
|
157
|
+
if(Physics.Linecast(Slope.transform.position, Slope.transform.position + forward, out hit,LayerMask.GetMask("Slope")) == true)
|
58
158
|
|
59
159
|
{
|
60
160
|
|
61
|
-
Debug.Log("
|
161
|
+
Debug.Log("坂道のRayヒット!");
|
62
|
-
|
162
|
+
|
163
|
+
|
164
|
+
|
63
|
-
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward *
|
165
|
+
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * speed).y, 0f) + transform.forward * speed;
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
166
|
+
|
70
|
-
|
71
|
-
/*下がる時用*/
|
72
|
-
|
73
|
-
Debug.Log("
|
167
|
+
Debug.Log("v.y: "+ v.y);
|
74
|
-
|
75
|
-
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * walk_speed).y, 0f) + transform.forward * walk_speed;
|
76
|
-
|
77
|
-
v.y = v.y * -1;
|
78
168
|
|
79
169
|
}
|
80
170
|
|
171
|
+
}else{
|
172
|
+
|
173
|
+
v.y = 0;
|
174
|
+
|
81
175
|
}
|
82
176
|
|
83
177
|
|
84
178
|
|
85
|
-
|
179
|
+
}
|
86
|
-
|
180
|
+
|
181
|
+
|
182
|
+
|
183
|
+
|
184
|
+
|
87
|
-
|
185
|
+
void Move_Mng()
|
186
|
+
|
88
|
-
|
187
|
+
{
|
188
|
+
|
189
|
+
|
190
|
+
|
191
|
+
input_h = Input.GetAxis("Horizontal");
|
192
|
+
|
193
|
+
input_v = Input.GetAxis("Vertical");
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
|
198
|
+
|
199
|
+
|
200
|
+
|
201
|
+
Vector3 move_z = new Vector3();
|
202
|
+
|
203
|
+
Vector3 move_x = new Vector3();
|
204
|
+
|
89
|
-
|
205
|
+
move_z = Vector3.Scale(Camera.main.transform.forward, new Vector3(1, 0, 1)).normalized * input_v ;//* walk_speed;
|
206
|
+
|
207
|
+
move_x = Camera.main.transform.right * input_h; //* walk_speed;
|
208
|
+
|
209
|
+
move = move_x + move_z;
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
|
218
|
+
|
219
|
+
move.x *= 200;
|
220
|
+
|
221
|
+
move.z *= 200;
|
222
|
+
|
223
|
+
|
224
|
+
|
225
|
+
|
226
|
+
|
227
|
+
if (move != Vector3.zero)
|
90
228
|
|
91
229
|
{
|
92
230
|
|
93
|
-
Debug.Log("登っている。");
|
94
|
-
|
95
|
-
|
231
|
+
transform.rotation = Quaternion.LookRotation(move.normalized);
|
96
232
|
|
97
233
|
}
|
98
234
|
|
99
|
-
|
100
|
-
|
101
|
-
}
|
235
|
+
}
|
236
|
+
|
237
|
+
|
238
|
+
|
102
|
-
|
239
|
+
// Update is called once per frame
|
103
|
-
|
104
|
-
|
240
|
+
|
105
|
-
void
|
241
|
+
void Update()
|
242
|
+
|
106
|
-
|
243
|
+
{
|
107
|
-
|
108
|
-
|
244
|
+
|
245
|
+
|
246
|
+
|
109
|
-
r
|
247
|
+
Gravity_Mng();
|
248
|
+
|
110
|
-
|
249
|
+
Slope_Mng();
|
250
|
+
|
111
|
-
v
|
251
|
+
Move_Mng();
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
252
|
+
|
253
|
+
|
254
|
+
|
121
|
-
}
|
255
|
+
}
|
256
|
+
|
257
|
+
|
258
|
+
|
259
|
+
|
260
|
+
|
261
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
262
|
+
|
263
|
+
void FixedUpdate()
|
264
|
+
|
265
|
+
{
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
// rb.velocity = new Vector3(move.x, 0, move.z);
|
270
|
+
|
271
|
+
|
272
|
+
|
273
|
+
rb.AddForce(move.x, v.y, move.z);
|
274
|
+
|
275
|
+
|
276
|
+
|
277
|
+
// Debug.Log("velocity: " + rb.velocity.magnitude);
|
278
|
+
|
279
|
+
}
|
280
|
+
|
281
|
+
//////////////////////////////////////////////////////////////////////////////////////////////
|
282
|
+
|
283
|
+
|
284
|
+
|
285
|
+
|
286
|
+
|
287
|
+
}
|
122
288
|
|
123
289
|
|
124
290
|
|
3
文章とタイトルを編集しました。
test
CHANGED
File without changes
|
test
CHANGED
@@ -17,6 +17,12 @@
|
|
17
17
|
|
18
18
|
|
19
19
|
![イメージ説明](dc3dfee2a2a531026e1e2beac854de30.png)
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
use gravity をオンにした時の場合 空中に浮いてから下がってしまうため目的の処理を実現できない
|
24
|
+
|
25
|
+
![イメージ説明](09ab9cb36375a98943857209a262a57b.png)
|
20
26
|
|
21
27
|
```ここに言語を入力
|
22
28
|
|
2
文章とタイトルを編集しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
Unity3D 斜面を上がり下がりする処理を作りたい。
|
test
CHANGED
@@ -1,46 +1,102 @@
|
|
1
|
-
|
1
|
+
坂道を上がったり下がったりする時に平地と同じ速度で上がり下がりする処理を作りたいです。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
質問
|
5
|
+
質問1、提示画像のような坂を上る時に平地と同じ速度で上がるときにyの上昇量を計算していますがこれは上手く実装できているのでしょうか?
|
6
6
|
|
7
7
|
|
8
8
|
|
9
|
-
質問3,そもそもこのコードの書き方は正しいのか?(Updateに書いてしまっていうのは実験コードだからです。)
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
提示コードなのですがこれはプレイヤーの足元に子の空のオブジェクトを設定して坂道を上る時にRayを発射してそこに当たったらY軸の増加量を計算するという処理なのですが"上る処理"は完成しましたが **"下る処理"の実装方法がわかりません**
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
※ use gravityを使うと坂道を下るときに空中に浮いてから下に下がるという処理を行ってしまうため上手く実現できません。
|
18
|
-
|
19
|
-
|
9
|
+
質問2、坂道を下るときに重力をつける処理を実装していても動いてからY軸が下がってしまいうまく実装できませんどうすればいいのでしょうか?自分ないりに考えた結果坂道を上る時と同じでYの上昇量をマイナスにすれば坂道を下がる時Y軸が下がってくれるのではと考えたのですが上手くいきません。どうすればいいのでしょうか?
|
20
10
|
|
21
11
|
|
22
12
|
|
23
13
|
|
24
14
|
|
25
|
-
![イメージ説明](babaa5f37ae151780661298278de2bdf.png)
|
26
|
-
|
27
|
-
```ここに言語を入力
|
28
|
-
|
29
|
-
void Update () {
|
30
|
-
|
31
|
-
//Animation_Mng();
|
32
|
-
|
33
|
-
//Gravity_Mng();
|
34
|
-
|
35
|
-
//Attack_Mng();
|
36
|
-
|
37
|
-
//Move_Mng();
|
38
|
-
|
39
|
-
//Slope_Mng();
|
40
15
|
|
41
16
|
|
42
17
|
|
43
18
|
|
19
|
+
![イメージ説明](dc3dfee2a2a531026e1e2beac854de30.png)
|
20
|
+
|
21
|
+
```ここに言語を入力
|
22
|
+
|
23
|
+
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
void Slope_Mng()//坂道を上る時
|
28
|
+
|
29
|
+
{
|
30
|
+
|
31
|
+
|
32
|
+
|
33
|
+
float range = 0.8f;
|
34
|
+
|
35
|
+
Debug.DrawLine(Slope.transform.position, Slope.transform.position + (transform.forward * range), Color.blue);
|
36
|
+
|
37
|
+
Debug.DrawLine(Ground.transform.position,Ground.transform.position + new Vector3(0, -1, 0),Color.blue);
|
38
|
+
|
39
|
+
//Debug.DrawLine(Slope.transform.position, Slope.transform.position + (transform.forward + new Vector3(0,-0.3f,0)), Color.blue);
|
40
|
+
|
41
|
+
RaycastHit hit;
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
/*移動中の時*/
|
46
|
+
|
47
|
+
if(move != Vector3.zero){
|
48
|
+
|
49
|
+
v = Vector3.zero;
|
50
|
+
|
51
|
+
if (Physics.Linecast(Slope.transform.position, Slope.transform.position + (transform.forward * range), out hit,LayerMask.GetMask("Slope")) == true)
|
52
|
+
|
53
|
+
{
|
54
|
+
|
55
|
+
Debug.Log("登っている。");
|
56
|
+
|
57
|
+
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * walk_speed).y, 0f) + transform.forward * walk_speed;
|
58
|
+
|
59
|
+
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
}else if (Physics.Linecast(Ground.transform.position,Ground.transform.position + new Vector3(0,-1,0),out hit,LayerMask.GetMask("Slope")) == true){
|
64
|
+
|
65
|
+
/*下がる時用*/
|
66
|
+
|
67
|
+
Debug.Log("坂道を下がっているとき");
|
68
|
+
|
69
|
+
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * walk_speed).y, 0f) + transform.forward * walk_speed;
|
70
|
+
|
71
|
+
v.y = v.y * -1;
|
72
|
+
|
73
|
+
}
|
74
|
+
|
75
|
+
}
|
76
|
+
|
77
|
+
|
78
|
+
|
79
|
+
|
80
|
+
|
81
|
+
/*確認用*/
|
82
|
+
|
83
|
+
if (Physics.Linecast(Slope.transform.position, Slope.transform.position + (transform.forward * range), out hit, LayerMask.GetMask("Slope")) == true)
|
84
|
+
|
85
|
+
{
|
86
|
+
|
87
|
+
Debug.Log("登っている。");
|
88
|
+
|
89
|
+
// v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * walk_speed).y, 0f) + transform.forward * walk_speed;
|
90
|
+
|
91
|
+
}
|
92
|
+
|
93
|
+
|
94
|
+
|
95
|
+
}
|
96
|
+
|
97
|
+
|
98
|
+
|
99
|
+
void FixedUpdate () {
|
44
100
|
|
45
101
|
|
46
102
|
|
@@ -56,50 +112,6 @@
|
|
56
112
|
|
57
113
|
|
58
114
|
|
59
|
-
//Debug.DrawLine(Slope.transform.position, Slope.transform.position + (transform.forward + new Vector3(0,-1,0)), Color.blue);
|
60
|
-
|
61
|
-
Debug.DrawLine(Slope.transform.position, Slope.transform.position + (new Vector3(0,-0.5f,0)), Color.blue);
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
// Debug.Log(transform.forward);
|
66
|
-
|
67
|
-
RaycastHit hit;
|
68
|
-
|
69
|
-
//if (Physics.Raycast(Slope.transform.position, transform.forward + new Vector3(0,-1,0), 0.3f, LayerMask.GetMask("Slope")) == true)
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
if(move != Vector3.zero){
|
74
|
-
|
75
|
-
if (Physics.Linecast(Slope.transform.position, Slope.transform.position + new Vector3(0, -0.5f, 0),out hit, LayerMask.GetMask("Slope")) == true)
|
76
|
-
|
77
|
-
{
|
78
|
-
|
79
|
-
Debug.Log("ヒット!");
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
if (Vector3.Angle(transform.up, hit.normal) <= 90 && Vector3.Angle(transform.up, hit.normal) >= 0)
|
84
|
-
|
85
|
-
{
|
86
|
-
|
87
|
-
// velocity = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, stepHit.normal) * transform.forward * walkSpeed).y, 0f) + transform.forward * walkSpeed;
|
88
|
-
|
89
|
-
v = new Vector3(0f, (Quaternion.FromToRotation(Vector3.up, hit.normal) * transform.forward * ani.speed).y, 0f) + transform.forward * ani.speed;
|
90
|
-
|
91
|
-
Debug.Log("登れる坂です。 : " + v.y);
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
}
|
96
|
-
|
97
|
-
}
|
98
|
-
|
99
|
-
}
|
100
|
-
|
101
|
-
|
102
|
-
|
103
115
|
}
|
104
116
|
|
105
117
|
|
1
文章とタイトルを編集しました。
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
坂道を上り下りする
|
1
|
+
坂道を上り下りする処理で地面にくっついて平地と同じ速度で移動する処理を作りたい。
|
test
CHANGED
@@ -11,6 +11,12 @@
|
|
11
11
|
|
12
12
|
|
13
13
|
提示コードなのですがこれはプレイヤーの足元に子の空のオブジェクトを設定して坂道を上る時にRayを発射してそこに当たったらY軸の増加量を計算するという処理なのですが"上る処理"は完成しましたが **"下る処理"の実装方法がわかりません**
|
14
|
+
|
15
|
+
|
16
|
+
|
17
|
+
※ use gravityを使うと坂道を下るときに空中に浮いてから下に下がるという処理を行ってしまうため上手く実現できません。
|
18
|
+
|
19
|
+
またAddForceなどを使うとそもそも動かなくなってしまいますbool型変数などを使って空中に居る時だけ、など判定処理をするとuse gravityと同じぐらいに処理が違ってしまうのでうまく実現できず困っています。
|
14
20
|
|
15
21
|
|
16
22
|
|