質問編集履歴

4

再度文章を編集

2019/11/03 10:56

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- IKが反応しない原因が知りたい
1
+ IKが反応しない原因が知りたい スクリプト
test CHANGED
@@ -20,6 +20,10 @@
20
20
 
21
21
  質問ですが重さとはなんでしょうか?0~1の数値
22
22
 
23
+ 質問2 スクリプトをアタッチする場所をそのプレイヤーにアタッチしているのですがそもそもどこにアタッチすべきなのでしょうか?
24
+
25
+
26
+
23
27
 
24
28
 
25
29
  ![イメージ説明](ddf43cee6758ed82862fb08790800dd0.png)

3

文章とタイトルを編集

2019/11/03 10:56

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- IKを使って足元の段差を作りたい
1
+ IKが反応しない原因が知りたい
test CHANGED
@@ -1,34 +1,30 @@
1
- IKを使って段差や斜面で足の裏が地面にくっついて移動という処理を作りたいのですがそもそもどう実装すればいいのでしょうか?
1
+ IKを使って段差や斜面で足の裏が地面にくというIkの処理を実装したいのですが実装できませんどうしたらいいのでしょうか?
2
-
3
-
4
-
5
-
6
-
2
+
3
+
4
+
5
+
6
+
7
+
8
+
7
- 1、ヒューマノイドじゃないときない
9
+ 1、ヒューマノイドです。
8
10
 
9
11
  2、IK passにチェックを入れてる
10
12
 
11
- 3、最低一つのアニメクリップが入ったアニメーションコントローラが必要
13
+ 3、最低一つのアニメクリップが入ったアニメーションコントローラを入れた
14
+
12
-
15
+ 4.カーブを作成し1にしている。二枚目の設定画像を参照
13
-
14
-
15
-
16
-
16
+
17
+
18
+
19
+
20
+
17
- 質問1 提示コードなのですがこれ何を設定していのでしょうか?
21
+ 質問ですが重さとはなでしょうか?0~1の数値
18
-
19
- 質問2 Ikを使う場合コリジョンはどうすればいいのか知りたい
20
-
21
-
22
-
23
-
24
-
25
-
26
22
 
27
23
 
28
24
 
29
25
  ![イメージ説明](ddf43cee6758ed82862fb08790800dd0.png)
30
26
 
31
- ![イメージ説明](a7304d49acd9ac504640576558b7131a.png)
27
+ ![イメージ説明](69ee88d92aadc542ff4e54e1ed2fef55.png)
32
28
 
33
29
 
34
30
 
@@ -48,7 +44,7 @@
48
44
 
49
45
 
50
46
 
51
- private CharacterController characterController;
47
+ //private CharacterController characterController;
52
48
 
53
49
  private Animator animator;
54
50
 
@@ -124,7 +120,7 @@
124
120
 
125
121
  {
126
122
 
127
- characterController = GetComponent<CharacterController>();
123
+ // characterController = GetComponent<CharacterController>();
128
124
 
129
125
  animator = GetComponent<Animator>();
130
126
 
@@ -142,13 +138,11 @@
142
138
 
143
139
  Debug.DrawRay(animator.GetIKPosition(AvatarIKGoal.RightFoot), (-transform.up * rayRange), Color.red);
144
140
 
145
- Debug.Log(-transform.up * rayRange);
141
+ // Debug.Log(-transform.up * rayRange);
146
-
147
-
148
-
149
-
150
-
151
- // 右足用のレイを飛ばす処理
142
+
143
+
144
+
145
+
152
146
 
153
147
  var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up);
154
148
 
@@ -156,9 +150,17 @@
156
150
 
157
151
 
158
152
 
153
+
154
+
155
+ /*右足用のレイを飛ばす処理*/
156
+
159
- if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask("Field")))
157
+ if (Physics.Raycast(ray, out hit, rayRange))
160
-
158
+
161
- {
159
+ {
160
+
161
+ Debug.Log("右足 IK");
162
+
163
+
162
164
 
163
165
  rightFootPos = hit.point;
164
166
 
@@ -178,7 +180,7 @@
178
180
 
179
181
 
180
182
 
181
- // 左足用のレイを飛ばす処理
183
+
182
184
 
183
185
  ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up);
184
186
 
@@ -188,11 +190,15 @@
188
190
 
189
191
 
190
192
 
191
-
193
+ /*左足用のレイを飛ばす処理*/
192
-
194
+
195
+
196
+
193
- if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask("Field")))
197
+ if (Physics.Raycast(ray, out hit, rayRange))
194
-
198
+
195
- {
199
+ {
200
+
201
+ Debug.Log("左足 IK");
196
202
 
197
203
  leftFootPos = hit.point;
198
204
 
@@ -216,13 +222,15 @@
216
222
 
217
223
  {
218
224
 
225
+ Debug.Log("IK");
226
+
219
227
  // アニメーションの状態からウエイトを取得
220
228
 
221
229
  rightFootWeight = animator.GetFloat("RightFootWeight");
222
230
 
223
231
  leftFootWeight = animator.GetFloat("LeftFootWeight");
224
232
 
225
-
233
+ /*右 IK*/
226
234
 
227
235
  if (isRightFootIK)
228
236
 
@@ -244,8 +252,14 @@
244
252
 
245
253
  animator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootRot);
246
254
 
255
+
256
+
247
257
  }
248
258
 
259
+
260
+
261
+ /*左 IK*/
262
+
249
263
  if (isLeftFootIK)
250
264
 
251
265
  {
@@ -256,6 +270,8 @@
256
270
 
257
271
  animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, leftFootWeight);
258
272
 
273
+
274
+
259
275
  // 左足の位置と角度を設定
260
276
 
261
277
  animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootPos + new Vector3(0f, offset, 0f));

2

提示コードを変更、画像を追加、タイトルを編集

2019/11/03 10:38

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- IK足元の段差の処理が反応しな(初心者)
1
+ IKを使って足元の段差を作りた
test CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
 
4
4
 
5
+
6
+
5
7
  1、ヒューマノイドじゃないとできない
6
8
 
7
9
  2、IK passにチェックを入れてる
@@ -14,6 +16,8 @@
14
16
 
15
17
  質問1 提示コードなのですがこれは何を設定してないのでしょうか?
16
18
 
19
+ 質問2 Ikを使う場合コリジョンはどうすればいいのか知りたい
20
+
17
21
 
18
22
 
19
23
 
@@ -24,17 +28,17 @@
24
28
 
25
29
  ![イメージ説明](ddf43cee6758ed82862fb08790800dd0.png)
26
30
 
27
-
31
+ ![イメージ説明](a7304d49acd9ac504640576558b7131a.png)
28
32
 
29
33
 
30
34
 
31
35
  ```ここに言語を入力
32
36
 
37
+ using UnityEngine;
38
+
33
39
  using System.Collections;
34
40
 
35
- using System.Collections.Generic;
36
-
37
- using UnityEngine;
41
+ using System;
38
42
 
39
43
 
40
44
 
@@ -42,122 +46,228 @@
42
46
 
43
47
  {
44
48
 
49
+
50
+
51
+ private CharacterController characterController;
52
+
53
+ private Animator animator;
54
+
55
+
56
+
57
+ // テスト用のIKのOn・Offスイッチ
58
+
59
+ //[SerializeField]
60
+
61
+ private bool isUseIK = true;
62
+
63
+ // 右足のウエイト
64
+
65
+ private float rightFootWeight = 0f;
66
+
67
+ // 左足のウエイト
68
+
69
+ private float leftFootWeight = 0f;
70
+
71
+ // 右足の位置
72
+
73
+ private Vector3 rightFootPos;
74
+
75
+ // 左足の位置
76
+
77
+ private Vector3 leftFootPos;
78
+
79
+ // 右足の角度
80
+
81
+ private Quaternion rightFootRot;
82
+
83
+ // 左足の角度
84
+
85
+ private Quaternion leftFootRot;
86
+
87
+ // 足を付く位置のオフセット値
88
+
45
- [SerializeField]
89
+ [SerializeField]
46
-
90
+
47
- private Vector3 offset = new Vector3(0, 0.1f, 0);
91
+ private float offset = 0.1f;
92
+
93
+ // レイを飛ばす距離
48
94
 
49
95
  [SerializeField]
50
96
 
51
97
  private float rayRange = 1f;
52
98
 
99
+
100
+
101
+ private bool isRightFootIK = false;
102
+
103
+ private bool isLeftFootIK = false;
104
+
105
+
106
+
107
+ // コライダの位置を調整する時のスピード
108
+
53
- [SerializeField]
109
+ [SerializeField]
54
-
55
- //private string fieldLayerName = "Field";
110
+
56
-
57
-
58
-
59
- private Animator animator;
111
+ private float smoothing = 2f;
112
+
113
+
114
+
60
-
115
+ // レイを飛ばす位置の調整値
116
+
61
-
117
+ [SerializeField]
62
-
118
+
63
- private Transform _transform;
119
+ private Vector3 rayPositionOffset = Vector3.up * 0.3f;
64
-
120
+
121
+
122
+
65
- public new Transform transform
123
+ void Start()
66
124
 
67
125
  {
68
126
 
127
+ characterController = GetComponent<CharacterController>();
128
+
129
+ animator = GetComponent<Animator>();
130
+
69
- get
131
+ }
132
+
133
+
134
+
70
-
135
+ void OnAnimatorIK()
136
+
71
- {
137
+ {
138
+
139
+
140
+
72
-
141
+ // 右足用のレイの視覚化
142
+
143
+ Debug.DrawRay(animator.GetIKPosition(AvatarIKGoal.RightFoot), (-transform.up * rayRange), Color.red);
144
+
73
- if (_transform == null)
145
+ Debug.Log(-transform.up * rayRange);
146
+
147
+
148
+
149
+
150
+
151
+ // 右足用のレイを飛ばす処理
152
+
153
+ var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up);
154
+
155
+ RaycastHit hit;
156
+
157
+
158
+
159
+ if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask("Field")))
160
+
161
+ {
162
+
163
+ rightFootPos = hit.point;
164
+
165
+ rightFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
166
+
167
+ isRightFootIK = true;
168
+
169
+ }
170
+
171
+ else
172
+
173
+ {
174
+
175
+ isRightFootIK = false;
176
+
177
+ }
178
+
179
+
180
+
181
+ // 左足用のレイを飛ばす処理
182
+
183
+ ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up);
184
+
185
+ // 左足用のレイの視覚化
186
+
187
+ Debug.DrawRay(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up * rayRange, Color.red);
188
+
189
+
190
+
191
+
192
+
193
+ if (Physics.Raycast(ray, out hit, rayRange, LayerMask.GetMask("Field")))
194
+
195
+ {
196
+
197
+ leftFootPos = hit.point;
198
+
199
+ leftFootRot = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
200
+
201
+ isLeftFootIK = true;
202
+
203
+ }
204
+
205
+ else
206
+
207
+ {
208
+
209
+ isLeftFootIK = false;
210
+
211
+ }
212
+
213
+ // IKを使う時だけ
214
+
215
+ if (isUseIK)
216
+
217
+ {
218
+
219
+ // アニメーションの状態からウエイトを取得
220
+
221
+ rightFootWeight = animator.GetFloat("RightFootWeight");
222
+
223
+ leftFootWeight = animator.GetFloat("LeftFootWeight");
224
+
225
+
226
+
227
+ if (isRightFootIK)
74
228
 
75
229
  {
76
230
 
231
+
232
+
233
+ // 右足ウエイトの設定
234
+
235
+ animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, rightFootWeight);
236
+
237
+ animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, rightFootWeight);
238
+
239
+
240
+
241
+ // 右足の位置と角度を設定
242
+
243
+ animator.SetIKPosition(AvatarIKGoal.RightFoot, rightFootPos + new Vector3(0f, offset, 0f));
244
+
77
- _transform = gameObject.transform;
245
+ animator.SetIKRotation(AvatarIKGoal.RightFoot, rightFootRot);
78
246
 
79
247
  }
80
248
 
81
- return _transform;
249
+ if (isLeftFootIK)
250
+
251
+ {
252
+
253
+ // 左足ウエイトの設定
254
+
255
+ animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, leftFootWeight);
256
+
257
+ animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, leftFootWeight);
258
+
259
+ // 左足の位置と角度を設定
260
+
261
+ animator.SetIKPosition(AvatarIKGoal.LeftFoot, leftFootPos + new Vector3(0f, offset, 0f));
262
+
263
+ animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftFootRot);
264
+
265
+ }
82
266
 
83
267
  }
84
268
 
85
269
  }
86
270
 
87
-
88
-
89
-
90
-
91
- void Start()
92
-
93
- {
94
-
95
- animator = GetComponent<Animator>();
96
-
97
- }
98
-
99
-
100
-
101
- void OnAnimatorIK()
102
-
103
- {
104
-
105
- //右足
106
-
107
- var ray = new Ray(animator.GetIKPosition(AvatarIKGoal.RightFoot), -transform.up);
108
-
109
- RaycastHit hit;
110
-
111
-
112
-
113
- if (Physics.Raycast(ray, out hit, rayRange))
114
-
115
- {
116
-
117
- Quaternion rightRotation = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
118
-
119
-
120
-
121
- //weightはとりあえず1で固定しておく(0f:元のアニメーション,1f:IKを完全に反映)
122
-
123
- animator.SetIKPositionWeight(AvatarIKGoal.RightFoot, 1);
124
-
125
- animator.SetIKRotationWeight(AvatarIKGoal.RightFoot, 1);
126
-
127
- animator.SetIKPosition(AvatarIKGoal.RightFoot, hit.point + offset);
128
-
129
- animator.SetIKRotation(AvatarIKGoal.RightFoot, rightRotation);
130
-
131
- }
132
-
133
-
134
-
135
- //左足
136
-
137
- ray = new Ray(animator.GetIKPosition(AvatarIKGoal.LeftFoot), -transform.up);
138
-
139
- if (Physics.Raycast(ray, out hit, rayRange))
140
-
141
- {
142
-
143
- Quaternion leftRotaion = Quaternion.FromToRotation(transform.up, hit.normal) * transform.rotation;
144
-
145
-
146
-
147
- animator.SetIKPositionWeight(AvatarIKGoal.LeftFoot, 1);
148
-
149
- animator.SetIKRotationWeight(AvatarIKGoal.LeftFoot, 1);
150
-
151
- animator.SetIKPosition(AvatarIKGoal.LeftFoot, hit.point + offset);
152
-
153
- animator.SetIKRotation(AvatarIKGoal.LeftFoot, leftRotaion);
154
-
155
- }
156
-
157
- }
158
-
159
271
  }
160
272
 
161
-
162
-
163
273
  ```

1

タイトルを編集しました。

2019/11/02 09:48

投稿

退会済みユーザー
test CHANGED
@@ -1 +1 @@
1
- IKの使い方で足元の段差を作りたい(初心者)
1
+ IKで足元の段差の処理が反応しない(初心者)
test CHANGED
File without changes