質問編集履歴

4

コードを追加しました

2020/01/14 10:31

投稿

creatorsGame
creatorsGame

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,4 +1,6 @@
1
+ 以下のコードではカメラの角度に腰のボーンの角度を変えるようにしていますが、これを
2
+
1
- マウスの上下の向きから腰のボーンのZ軸の角度を変えるにはどう変更すれば良いでしょうか?
3
+ マウスの上下の値を取得して腰のボーンのZ軸の角度を取得した値に変えるにはどう変更すれば良いでしょうか?
2
4
 
3
5
  [参考にしたサイト](https://gametukurikata.com/fps/lookatforward)
4
6
 

3

短くしました。

2020/01/14 10:31

投稿

creatorsGame
creatorsGame

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,543 +1,21 @@
1
- [このサイト](https://gametukurikata.com/fps/lookatforward)を参考にキャラクターの視点の方向に銃口を向けるプログラムを書いたのですが、これだと視点を上下に動かしたとき腕が思うように見えなかったりします。なので、マウスの上下の操作で腰のボーンの角度を変えるにはどう変更すればいでしょうか?
1
+ マウスの上下の向きから腰のボーンのZ軸の角度を変えるにはどう変更すればいでしょうか?
2
2
 
3
- 以下のコードの //カメラの角度を変更 ではカメラの上下の角度から腰のボーンの角度を変えています。
3
+ [参考にしたサイト](https://gametukurikata.com/fps/lookatforward)
4
-
5
- あと、長いので省略と一応省略なしのコードも追加しました。
6
-
7
- 省略
8
4
 
9
5
  ```C#
10
6
 
11
- // キャラクター視点のカメラ
7
+
12
8
 
13
- private Transform myCamera;
9
+ spine.rotation = Quaternion.Euler(spine.eulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z +          
14
10
 
15
- // キャラクター視点のカメラで回転出来る限度
16
-
17
- [SerializeField]
18
-
19
- private float cameraRotateLimit = 30f;
20
-
21
- // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定
22
-
23
- [SerializeField]
24
-
25
- private bool cameraRotForward = true;
26
-
27
- // カメラの角度の初期値
28
-
29
- private Quaternion initCameraRot;
30
-
31
- // キャラクター、カメラ(視点)の回転スピード
32
-
33
- [SerializeField]
34
-
35
- private float rotateSpeed = 2f;
36
-
37
- // マウス移動のスピード
38
-
39
- [SerializeField]
40
-
41
- private float mouseSpeed = 2f;
42
-
43
- // キャラクターのY軸の角度
44
-
45
- private Quaternion charaRotate;
46
-
47
- // カメラのX軸の角度
48
-
49
- private Quaternion cameraRotate;
50
-
51
- // キャラクターの脊椎のボーン
52
-
53
- [SerializeField]
54
-
55
- private Transform spine;
56
-
57
- // カメラのTransform
58
-
59
- [SerializeField]
60
-
61
- private Transform cameraPosition;
11
+     myCamera.localEulerAngles.x);
62
-
63
-   void Start()
64
-
65
- {
66
-
67
- myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
68
-
69
- initCameraRot = myCamera.localRotation;
70
-
71
- charaRotate = transform.localRotation;
72
-
73
- cameraRotate = myCamera.localRotation;
74
12
 
75
13
  }
76
14
 
77
- void Update()
78
15
 
79
- {
80
-
81
- // キャラクターの向きを変更する
82
-
83
- RotateChara();
84
-
85
- // 視点の向きを変える
86
-
87
- RotateCamera();
88
-
89
- // ボーンをカメラの角度を向かせる
90
-
91
- RotateBone();
92
-
93
-
94
-
95
-      velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
96
-
97
- cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
98
-
99
- }
100
-
101
- // キャラクターの角度を変更
102
-
103
- void RotateChara()
104
-
105
- {
106
-
107
- // 横の回転値を計算
108
-
109
- float yRotate = Input.GetAxis("Mouse X") * mouseSpeed;
110
-
111
- charaRotate *= Quaternion.Euler(0f, yRotate, 0f);
112
-
113
- // キャラクターの回転を実行
114
-
115
- transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime);
116
-
117
- }
118
-
119
- // カメラの角度を変更
120
-
121
- void RotateCamera()
122
-
123
- {
124
-
125
- float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
126
-
127
- // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
128
-
129
- if (cameraRotForward)
130
-
131
- {
132
-
133
- xRotate *= -1;
134
-
135
- }
136
-
137
- // 一旦角度を計算する
138
-
139
- cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f);
140
-
141
- // カメラのX軸の角度が限界角度を超えたら限界角度に設定
142
-
143
- var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit);
144
-
145
- // 角度を再構築
146
-
147
- cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z);
148
-
149
- // カメラの視点変更を実行
150
-
151
- cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime);
152
-
153
- }
154
-
155
- void RotateBone()
156
-
157
- {
158
-
159
- // 腰のボーンの角度をカメラの向きにする
160
-
161
- spine.rotation = Quaternion.Euler(spine.eulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z + myCamera.localEulerAngles.x);
162
-
163
- }
164
-
165
- void LateUpdate()
166
-
167
- {
168
-
169
- // ボーンをカメラの角度を向かせる
170
-
171
- RotateBone();
172
-
173
-
174
-
175
- // カメラの位置と角度を変更
176
-
177
- myCamera.localRotation = cameraPosition.localRotation;
178
-
179
- myCamera.position = cameraPosition.position;
180
-
181
- }
182
16
 
183
17
  }
184
18
 
185
19
 
186
20
 
187
21
  ```
188
-
189
- 省略なし
190
-
191
- ```C#
192
-
193
- using System.Collections;
194
-
195
- using System.Collections.Generic;
196
-
197
- using UnityEngine;
198
-
199
-
200
-
201
- public class PlayerTest : MonoBehaviour
202
-
203
- {
204
-
205
- //キャラクターコントローラー
206
-
207
- private CharacterController cCon;
208
-
209
- // キャラクターの速度
210
-
211
- private Vector3 velocity;
212
-
213
- // Animator
214
-
215
- private Animator animator;
216
-
217
- // 歩くスピード
218
-
219
- [SerializeField]
220
-
221
- private float walkSpeed = 1.5f;
222
-
223
- // 走るスピード
224
-
225
- [SerializeField]
226
-
227
- private float runSpeed = 2.5f;
228
-
229
- // 走っているかどうか
230
-
231
- private bool runFlag = false;
232
-
233
- // キャラクター視点のカメラ
234
-
235
- private Transform myCamera;
236
-
237
- // キャラクター視点のカメラで回転出来る限度
238
-
239
- [SerializeField]
240
-
241
- private float cameraRotateLimit = 30f;
242
-
243
- // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定
244
-
245
- [SerializeField]
246
-
247
- private bool cameraRotForward = true;
248
-
249
- // カメラの角度の初期値
250
-
251
- private Quaternion initCameraRot;
252
-
253
- // キャラクター、カメラ(視点)の回転スピード
254
-
255
- [SerializeField]
256
-
257
- private float rotateSpeed = 2f;
258
-
259
- // マウス移動のスピード
260
-
261
- [SerializeField]
262
-
263
- private float mouseSpeed = 2f;
264
-
265
- // キャラクターのY軸の角度
266
-
267
- private Quaternion charaRotate;
268
-
269
- // カメラのX軸の角度
270
-
271
- private Quaternion cameraRotate;
272
-
273
- // キャラが回転中かどうか?
274
-
275
- private bool charaRotFlag = false;
276
-
277
- // キャラクターの脊椎のボーン
278
-
279
- [SerializeField]
280
-
281
- private Transform spine;
282
-
283
- // カメラのTransform
284
-
285
- [SerializeField]
286
-
287
- private Transform cameraPosition;
288
-
289
-
290
-
291
-
292
-
293
-
294
-
295
- void Start()
296
-
297
- {
298
-
299
- if (Input.GetKeyDown(KeyCode.Escape))
300
-
301
- {
302
-
303
- Cursor.visible = true;
304
-
305
- Cursor.lockState = CursorLockMode.None;
306
-
307
- }
308
-
309
- //キャラクターコントローラの取得
310
-
311
- cCon = GetComponent<CharacterController>();
312
-
313
- animator = GetComponent<Animator>();
314
-
315
- myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
316
-
317
- initCameraRot = myCamera.localRotation;
318
-
319
- charaRotate = transform.localRotation;
320
-
321
- cameraRotate = myCamera.localRotation;
322
-
323
-
324
-
325
- Cursor.visible = false;
326
-
327
- Cursor.lockState = CursorLockMode.Locked;
328
-
329
- }
330
-
331
- void Update()
332
-
333
- {
334
-
335
-
336
-
337
- // キャラクターの向きを変更する
338
-
339
- RotateChara();
340
-
341
- // 視点の向きを変える
342
-
343
- RotateCamera();
344
-
345
- // ボーンをカメラの角度を向かせる
346
-
347
- RotateBone();
348
-
349
-
350
-
351
- // キャラクターコントローラのコライダが地面と接触してるかどうか
352
-
353
- if (cCon.isGrounded)
354
-
355
- {
356
-
357
-
358
-
359
- velocity = Vector3.zero;
360
-
361
-
362
-
363
- velocity = (transform.forward * Input.GetAxis("Vertical") + transform.right * Input.GetAxis("Horizontal")).normalized;
364
-
365
-
366
-
367
- // 走るか歩くかでスピードを変更する
368
-
369
- float speed = 0f;
370
-
371
-
372
-
373
- if ((Input.GetButton("Run"))) //&& Input.GetButton("Fire2") == false)
374
-
375
- {
376
-
377
- runFlag = true;
378
-
379
- speed = runSpeed;
380
-
381
- }
382
-
383
- else
384
-
385
- {
386
-
387
- runFlag = false;
388
-
389
- speed = walkSpeed;
390
-
391
- }
392
-
393
- velocity *= speed;
394
-
395
-
396
-
397
- if (velocity.magnitude > 0f || charaRotFlag)
398
-
399
- {
400
-
401
- if (runFlag && !charaRotFlag)
402
-
403
- {
404
-
405
- animator.SetFloat("Speed", 2.1f);
406
-
407
- }
408
-
409
- else
410
-
411
- {
412
-
413
- animator.SetFloat("Speed", 1f);
414
-
415
- }
416
-
417
- }
418
-
419
- else
420
-
421
- {
422
-
423
- animator.SetFloat("Speed", 0f);
424
-
425
- }
426
-
427
- }
428
-
429
- velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
430
-
431
- cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
432
-
433
- }
434
-
435
-
436
-
437
- // キャラクターの角度を変更
438
-
439
- void RotateChara()
440
-
441
- {
442
-
443
- // 横の回転値を計算
444
-
445
- float yRotate = Input.GetAxis("Mouse X") * mouseSpeed;
446
-
447
-
448
-
449
- charaRotate *= Quaternion.Euler(0f, yRotate, 0f);
450
-
451
-
452
-
453
-
454
-
455
- // キャラクターの回転を実行
456
-
457
- transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime);
458
-
459
- }
460
-
461
-
462
-
463
-
464
-
465
- // カメラの角度を変更
466
-
467
- void RotateCamera()
468
-
469
- {
470
-
471
-
472
-
473
- float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
474
-
475
-
476
-
477
- // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
478
-
479
- if (cameraRotForward)
480
-
481
- {
482
-
483
- xRotate *= -1;
484
-
485
- }
486
-
487
- // 一旦角度を計算する
488
-
489
- cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f);
490
-
491
- // カメラのX軸の角度が限界角度を超えたら限界角度に設定
492
-
493
- var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit);
494
-
495
- // 角度を再構築
496
-
497
- cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z);
498
-
499
- // カメラの視点変更を実行
500
-
501
- cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime);
502
-
503
- }
504
-
505
-
506
-
507
-
508
-
509
- void RotateBone()
510
-
511
- {
512
-
513
- // 腰のボーンの角度をカメラの向きにする
514
-
515
- spine.rotation = Quaternion.Euler(spine.eulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z + myCamera.localEulerAngles.x);
516
-
517
- }
518
-
519
-
520
-
521
- void LateUpdate()
522
-
523
- {
524
-
525
- // ボーンをカメラの角度を向かせる
526
-
527
- RotateBone();
528
-
529
-
530
-
531
- // カメラの位置と角度を変更
532
-
533
- myCamera.localRotation = cameraPosition.localRotation;
534
-
535
- myCamera.position = cameraPosition.position;
536
-
537
- }
538
-
539
- }
540
-
541
-
542
-
543
- ```

2

コードを修正しました

2020/01/14 10:25

投稿

creatorsGame
creatorsGame

スコア18

test CHANGED
File without changes
test CHANGED
@@ -48,6 +48,228 @@
48
48
 
49
49
  private Quaternion cameraRotate;
50
50
 
51
+ // キャラクターの脊椎のボーン
52
+
53
+ [SerializeField]
54
+
55
+ private Transform spine;
56
+
57
+ // カメラのTransform
58
+
59
+ [SerializeField]
60
+
61
+ private Transform cameraPosition;
62
+
63
+   void Start()
64
+
65
+ {
66
+
67
+ myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
68
+
69
+ initCameraRot = myCamera.localRotation;
70
+
71
+ charaRotate = transform.localRotation;
72
+
73
+ cameraRotate = myCamera.localRotation;
74
+
75
+ }
76
+
77
+ void Update()
78
+
79
+ {
80
+
81
+ // キャラクターの向きを変更する
82
+
83
+ RotateChara();
84
+
85
+ // 視点の向きを変える
86
+
87
+ RotateCamera();
88
+
89
+ // ボーンをカメラの角度を向かせる
90
+
91
+ RotateBone();
92
+
93
+
94
+
95
+      velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
96
+
97
+ cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
98
+
99
+ }
100
+
101
+ // キャラクターの角度を変更
102
+
103
+ void RotateChara()
104
+
105
+ {
106
+
107
+ // 横の回転値を計算
108
+
109
+ float yRotate = Input.GetAxis("Mouse X") * mouseSpeed;
110
+
111
+ charaRotate *= Quaternion.Euler(0f, yRotate, 0f);
112
+
113
+ // キャラクターの回転を実行
114
+
115
+ transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime);
116
+
117
+ }
118
+
119
+ // カメラの角度を変更
120
+
121
+ void RotateCamera()
122
+
123
+ {
124
+
125
+ float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
126
+
127
+ // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
128
+
129
+ if (cameraRotForward)
130
+
131
+ {
132
+
133
+ xRotate *= -1;
134
+
135
+ }
136
+
137
+ // 一旦角度を計算する
138
+
139
+ cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f);
140
+
141
+ // カメラのX軸の角度が限界角度を超えたら限界角度に設定
142
+
143
+ var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit);
144
+
145
+ // 角度を再構築
146
+
147
+ cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z);
148
+
149
+ // カメラの視点変更を実行
150
+
151
+ cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime);
152
+
153
+ }
154
+
155
+ void RotateBone()
156
+
157
+ {
158
+
159
+ // 腰のボーンの角度をカメラの向きにする
160
+
161
+ spine.rotation = Quaternion.Euler(spine.eulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z + myCamera.localEulerAngles.x);
162
+
163
+ }
164
+
165
+ void LateUpdate()
166
+
167
+ {
168
+
169
+ // ボーンをカメラの角度を向かせる
170
+
171
+ RotateBone();
172
+
173
+
174
+
175
+ // カメラの位置と角度を変更
176
+
177
+ myCamera.localRotation = cameraPosition.localRotation;
178
+
179
+ myCamera.position = cameraPosition.position;
180
+
181
+ }
182
+
183
+ }
184
+
185
+
186
+
187
+ ```
188
+
189
+ 省略なし
190
+
191
+ ```C#
192
+
193
+ using System.Collections;
194
+
195
+ using System.Collections.Generic;
196
+
197
+ using UnityEngine;
198
+
199
+
200
+
201
+ public class PlayerTest : MonoBehaviour
202
+
203
+ {
204
+
205
+ //キャラクターコントローラー
206
+
207
+ private CharacterController cCon;
208
+
209
+ // キャラクターの速度
210
+
211
+ private Vector3 velocity;
212
+
213
+ // Animator
214
+
215
+ private Animator animator;
216
+
217
+ // 歩くスピード
218
+
219
+ [SerializeField]
220
+
221
+ private float walkSpeed = 1.5f;
222
+
223
+ // 走るスピード
224
+
225
+ [SerializeField]
226
+
227
+ private float runSpeed = 2.5f;
228
+
229
+ // 走っているかどうか
230
+
231
+ private bool runFlag = false;
232
+
233
+ // キャラクター視点のカメラ
234
+
235
+ private Transform myCamera;
236
+
237
+ // キャラクター視点のカメラで回転出来る限度
238
+
239
+ [SerializeField]
240
+
241
+ private float cameraRotateLimit = 30f;
242
+
243
+ // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定
244
+
245
+ [SerializeField]
246
+
247
+ private bool cameraRotForward = true;
248
+
249
+ // カメラの角度の初期値
250
+
251
+ private Quaternion initCameraRot;
252
+
253
+ // キャラクター、カメラ(視点)の回転スピード
254
+
255
+ [SerializeField]
256
+
257
+ private float rotateSpeed = 2f;
258
+
259
+ // マウス移動のスピード
260
+
261
+ [SerializeField]
262
+
263
+ private float mouseSpeed = 2f;
264
+
265
+ // キャラクターのY軸の角度
266
+
267
+ private Quaternion charaRotate;
268
+
269
+ // カメラのX軸の角度
270
+
271
+ private Quaternion cameraRotate;
272
+
51
273
  // キャラが回転中かどうか?
52
274
 
53
275
  private bool charaRotFlag = false;
@@ -66,10 +288,30 @@
66
288
 
67
289
 
68
290
 
291
+
292
+
293
+
294
+
69
295
  void Start()
70
296
 
71
297
  {
72
298
 
299
+ if (Input.GetKeyDown(KeyCode.Escape))
300
+
301
+ {
302
+
303
+ Cursor.visible = true;
304
+
305
+ Cursor.lockState = CursorLockMode.None;
306
+
307
+ }
308
+
309
+ //キャラクターコントローラの取得
310
+
311
+ cCon = GetComponent<CharacterController>();
312
+
313
+ animator = GetComponent<Animator>();
314
+
73
315
  myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
74
316
 
75
317
  initCameraRot = myCamera.localRotation;
@@ -78,12 +320,20 @@
78
320
 
79
321
  cameraRotate = myCamera.localRotation;
80
322
 
323
+
324
+
325
+ Cursor.visible = false;
326
+
327
+ Cursor.lockState = CursorLockMode.Locked;
328
+
81
329
  }
82
330
 
83
331
  void Update()
84
332
 
85
333
  {
86
334
 
335
+
336
+
87
337
  // キャラクターの向きを変更する
88
338
 
89
339
  RotateChara();
@@ -98,12 +348,92 @@
98
348
 
99
349
 
100
350
 
351
+ // キャラクターコントローラのコライダが地面と接触してるかどうか
352
+
353
+ if (cCon.isGrounded)
354
+
355
+ {
356
+
357
+
358
+
359
+ velocity = Vector3.zero;
360
+
361
+
362
+
363
+ velocity = (transform.forward * Input.GetAxis("Vertical") + transform.right * Input.GetAxis("Horizontal")).normalized;
364
+
365
+
366
+
367
+ // 走るか歩くかでスピードを変更する
368
+
369
+ float speed = 0f;
370
+
371
+
372
+
373
+ if ((Input.GetButton("Run"))) //&& Input.GetButton("Fire2") == false)
374
+
375
+ {
376
+
377
+ runFlag = true;
378
+
379
+ speed = runSpeed;
380
+
381
+ }
382
+
383
+ else
384
+
385
+ {
386
+
387
+ runFlag = false;
388
+
389
+ speed = walkSpeed;
390
+
391
+ }
392
+
393
+ velocity *= speed;
394
+
395
+
396
+
397
+ if (velocity.magnitude > 0f || charaRotFlag)
398
+
399
+ {
400
+
401
+ if (runFlag && !charaRotFlag)
402
+
403
+ {
404
+
405
+ animator.SetFloat("Speed", 2.1f);
406
+
407
+ }
408
+
409
+ else
410
+
411
+ {
412
+
413
+ animator.SetFloat("Speed", 1f);
414
+
415
+ }
416
+
417
+ }
418
+
419
+ else
420
+
421
+ {
422
+
423
+ animator.SetFloat("Speed", 0f);
424
+
425
+ }
426
+
427
+ }
428
+
101
-      velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
429
+ velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
102
430
 
103
431
  cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
104
432
 
105
433
  }
106
434
 
435
+
436
+
107
437
  // キャラクターの角度を変更
108
438
 
109
439
  void RotateChara()
@@ -128,14 +458,22 @@
128
458
 
129
459
  }
130
460
 
461
+
462
+
463
+
464
+
131
465
  // カメラの角度を変更
132
466
 
133
467
  void RotateCamera()
134
468
 
135
469
  {
136
470
 
471
+
472
+
137
473
  float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
138
474
 
475
+
476
+
139
477
  // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
140
478
 
141
479
  if (cameraRotForward)
@@ -164,6 +502,10 @@
164
502
 
165
503
  }
166
504
 
505
+
506
+
507
+
508
+
167
509
  void RotateBone()
168
510
 
169
511
  {
@@ -199,359 +541,3 @@
199
541
 
200
542
 
201
543
  ```
202
-
203
- 省略なし
204
-
205
- ```C#
206
-
207
- using System.Collections;
208
-
209
- using System.Collections.Generic;
210
-
211
- using UnityEngine;
212
-
213
-
214
-
215
- public class PlayerTest : MonoBehaviour
216
-
217
- {
218
-
219
- //キャラクターコントローラー
220
-
221
- private CharacterController cCon;
222
-
223
- // キャラクターの速度
224
-
225
- private Vector3 velocity;
226
-
227
- // Animator
228
-
229
- private Animator animator;
230
-
231
- // 歩くスピード
232
-
233
- [SerializeField]
234
-
235
- private float walkSpeed = 1.5f;
236
-
237
- // 走るスピード
238
-
239
- [SerializeField]
240
-
241
- private float runSpeed = 2.5f;
242
-
243
- // 走っているかどうか
244
-
245
- private bool runFlag = false;
246
-
247
- // キャラクター視点のカメラ
248
-
249
- private Transform myCamera;
250
-
251
- // キャラクター視点のカメラで回転出来る限度
252
-
253
- [SerializeField]
254
-
255
- private float cameraRotateLimit = 30f;
256
-
257
- // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定
258
-
259
- [SerializeField]
260
-
261
- private bool cameraRotForward = true;
262
-
263
- // カメラの角度の初期値
264
-
265
- private Quaternion initCameraRot;
266
-
267
- // キャラクター、カメラ(視点)の回転スピード
268
-
269
- [SerializeField]
270
-
271
- private float rotateSpeed = 2f;
272
-
273
- // マウス移動のスピード
274
-
275
- [SerializeField]
276
-
277
- private float mouseSpeed = 2f;
278
-
279
- // キャラクターのY軸の角度
280
-
281
- private Quaternion charaRotate;
282
-
283
- // カメラのX軸の角度
284
-
285
- private Quaternion cameraRotate;
286
-
287
- // キャラが回転中かどうか?
288
-
289
- private bool charaRotFlag = false;
290
-
291
- // キャラクターの脊椎のボーン
292
-
293
- [SerializeField]
294
-
295
- private Transform spine;
296
-
297
- // カメラのTransform
298
-
299
- [SerializeField]
300
-
301
- private Transform cameraPosition;
302
-
303
-
304
-
305
-
306
-
307
-
308
-
309
- void Start()
310
-
311
- {
312
-
313
- if (Input.GetKeyDown(KeyCode.Escape))
314
-
315
- {
316
-
317
- Cursor.visible = true;
318
-
319
- Cursor.lockState = CursorLockMode.None;
320
-
321
- }
322
-
323
- //キャラクターコントローラの取得
324
-
325
- cCon = GetComponent<CharacterController>();
326
-
327
- animator = GetComponent<Animator>();
328
-
329
- myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
330
-
331
- initCameraRot = myCamera.localRotation;
332
-
333
- charaRotate = transform.localRotation;
334
-
335
- cameraRotate = myCamera.localRotation;
336
-
337
-
338
-
339
- Cursor.visible = false;
340
-
341
- Cursor.lockState = CursorLockMode.Locked;
342
-
343
- }
344
-
345
- void Update()
346
-
347
- {
348
-
349
-
350
-
351
- // キャラクターの向きを変更する
352
-
353
- RotateChara();
354
-
355
- // 視点の向きを変える
356
-
357
- RotateCamera();
358
-
359
- // ボーンをカメラの角度を向かせる
360
-
361
- RotateBone();
362
-
363
-
364
-
365
- // キャラクターコントローラのコライダが地面と接触してるかどうか
366
-
367
- if (cCon.isGrounded)
368
-
369
- {
370
-
371
-
372
-
373
- velocity = Vector3.zero;
374
-
375
-
376
-
377
- velocity = (transform.forward * Input.GetAxis("Vertical") + transform.right * Input.GetAxis("Horizontal")).normalized;
378
-
379
-
380
-
381
- // 走るか歩くかでスピードを変更する
382
-
383
- float speed = 0f;
384
-
385
-
386
-
387
- if ((Input.GetButton("Run"))) //&& Input.GetButton("Fire2") == false)
388
-
389
- {
390
-
391
- runFlag = true;
392
-
393
- speed = runSpeed;
394
-
395
- }
396
-
397
- else
398
-
399
- {
400
-
401
- runFlag = false;
402
-
403
- speed = walkSpeed;
404
-
405
- }
406
-
407
- velocity *= speed;
408
-
409
-
410
-
411
- if (velocity.magnitude > 0f || charaRotFlag)
412
-
413
- {
414
-
415
- if (runFlag && !charaRotFlag)
416
-
417
- {
418
-
419
- animator.SetFloat("Speed", 2.1f);
420
-
421
- }
422
-
423
- else
424
-
425
- {
426
-
427
- animator.SetFloat("Speed", 1f);
428
-
429
- }
430
-
431
- }
432
-
433
- else
434
-
435
- {
436
-
437
- animator.SetFloat("Speed", 0f);
438
-
439
- }
440
-
441
- }
442
-
443
- velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
444
-
445
- cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
446
-
447
- }
448
-
449
-
450
-
451
- // キャラクターの角度を変更
452
-
453
- void RotateChara()
454
-
455
- {
456
-
457
- // 横の回転値を計算
458
-
459
- float yRotate = Input.GetAxis("Mouse X") * mouseSpeed;
460
-
461
-
462
-
463
- charaRotate *= Quaternion.Euler(0f, yRotate, 0f);
464
-
465
-
466
-
467
-
468
-
469
- // キャラクターの回転を実行
470
-
471
- transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime);
472
-
473
- }
474
-
475
-
476
-
477
-
478
-
479
- // カメラの角度を変更
480
-
481
- void RotateCamera()
482
-
483
- {
484
-
485
-
486
-
487
- float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
488
-
489
-
490
-
491
- // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
492
-
493
- if (cameraRotForward)
494
-
495
- {
496
-
497
- xRotate *= -1;
498
-
499
- }
500
-
501
- // 一旦角度を計算する
502
-
503
- cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f);
504
-
505
- // カメラのX軸の角度が限界角度を超えたら限界角度に設定
506
-
507
- var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit);
508
-
509
- // 角度を再構築
510
-
511
- cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z);
512
-
513
- // カメラの視点変更を実行
514
-
515
- cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime);
516
-
517
- }
518
-
519
-
520
-
521
-
522
-
523
- void RotateBone()
524
-
525
- {
526
-
527
- // 腰のボーンの角度をカメラの向きにする
528
-
529
- spine.rotation = Quaternion.Euler(spine.eulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z + myCamera.localEulerAngles.x);
530
-
531
- }
532
-
533
-
534
-
535
- void LateUpdate()
536
-
537
- {
538
-
539
- // ボーンをカメラの角度を向かせる
540
-
541
- RotateBone();
542
-
543
-
544
-
545
- // カメラの位置と角度を変更
546
-
547
- myCamera.localRotation = cameraPosition.localRotation;
548
-
549
- myCamera.position = cameraPosition.position;
550
-
551
- }
552
-
553
- }
554
-
555
-
556
-
557
- ```

1

コードを追加しました

2020/01/13 10:38

投稿

creatorsGame
creatorsGame

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,9 +1,209 @@
1
- [このサイト](https://gametukurikata.com/fps/lookatforward)を参考にキャラクターの視点の方向に銃口を向けるプログラムを書いたのですが、これだと視点を上下に動かしたとき腕が思うように見えなかったりします。なので、マウスの上下の操作で腰のボーンの角度を変えるにはどう変更すればよいでしょうか?  
1
+ [このサイト](https://gametukurikata.com/fps/lookatforward)を参考にキャラクターの視点の方向に銃口を向けるプログラムを書いたのですが、これだと視点を上下に動かしたとき腕が思うように見えなかったりします。なので、マウスの上下の操作で腰のボーンの角度を変えるにはどう変更すればよいでしょうか?
2
2
 
3
3
  以下のコードの //カメラの角度を変更 ではカメラの上下の角度から腰のボーンの角度を変えています。
4
4
 
5
+ あと、長いので省略と一応省略なしのコードも追加しました。
6
+
7
+ 省略
8
+
5
9
  ```C#
6
10
 
11
+ // キャラクター視点のカメラ
12
+
13
+ private Transform myCamera;
14
+
15
+ // キャラクター視点のカメラで回転出来る限度
16
+
17
+ [SerializeField]
18
+
19
+ private float cameraRotateLimit = 30f;
20
+
21
+ // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定
22
+
23
+ [SerializeField]
24
+
25
+ private bool cameraRotForward = true;
26
+
27
+ // カメラの角度の初期値
28
+
29
+ private Quaternion initCameraRot;
30
+
31
+ // キャラクター、カメラ(視点)の回転スピード
32
+
33
+ [SerializeField]
34
+
35
+ private float rotateSpeed = 2f;
36
+
37
+ // マウス移動のスピード
38
+
39
+ [SerializeField]
40
+
41
+ private float mouseSpeed = 2f;
42
+
43
+ // キャラクターのY軸の角度
44
+
45
+ private Quaternion charaRotate;
46
+
47
+ // カメラのX軸の角度
48
+
49
+ private Quaternion cameraRotate;
50
+
51
+ // キャラが回転中かどうか?
52
+
53
+ private bool charaRotFlag = false;
54
+
55
+ // キャラクターの脊椎のボーン
56
+
57
+ [SerializeField]
58
+
59
+ private Transform spine;
60
+
61
+ // カメラのTransform
62
+
63
+ [SerializeField]
64
+
65
+ private Transform cameraPosition;
66
+
67
+
68
+
69
+ void Start()
70
+
71
+ {
72
+
73
+ myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
74
+
75
+ initCameraRot = myCamera.localRotation;
76
+
77
+ charaRotate = transform.localRotation;
78
+
79
+ cameraRotate = myCamera.localRotation;
80
+
81
+ }
82
+
83
+ void Update()
84
+
85
+ {
86
+
87
+ // キャラクターの向きを変更する
88
+
89
+ RotateChara();
90
+
91
+ // 視点の向きを変える
92
+
93
+ RotateCamera();
94
+
95
+ // ボーンをカメラの角度を向かせる
96
+
97
+ RotateBone();
98
+
99
+
100
+
101
+      velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
102
+
103
+ cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
104
+
105
+ }
106
+
107
+ // キャラクターの角度を変更
108
+
109
+ void RotateChara()
110
+
111
+ {
112
+
113
+ // 横の回転値を計算
114
+
115
+ float yRotate = Input.GetAxis("Mouse X") * mouseSpeed;
116
+
117
+
118
+
119
+ charaRotate *= Quaternion.Euler(0f, yRotate, 0f);
120
+
121
+
122
+
123
+
124
+
125
+ // キャラクターの回転を実行
126
+
127
+ transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime);
128
+
129
+ }
130
+
131
+ // カメラの角度を変更
132
+
133
+ void RotateCamera()
134
+
135
+ {
136
+
137
+ float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
138
+
139
+ // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
140
+
141
+ if (cameraRotForward)
142
+
143
+ {
144
+
145
+ xRotate *= -1;
146
+
147
+ }
148
+
149
+ // 一旦角度を計算する
150
+
151
+ cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f);
152
+
153
+ // カメラのX軸の角度が限界角度を超えたら限界角度に設定
154
+
155
+ var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit);
156
+
157
+ // 角度を再構築
158
+
159
+ cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z);
160
+
161
+ // カメラの視点変更を実行
162
+
163
+ cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime);
164
+
165
+ }
166
+
167
+ void RotateBone()
168
+
169
+ {
170
+
171
+ // 腰のボーンの角度をカメラの向きにする
172
+
173
+ spine.rotation = Quaternion.Euler(spine.eulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z + myCamera.localEulerAngles.x);
174
+
175
+ }
176
+
177
+
178
+
179
+ void LateUpdate()
180
+
181
+ {
182
+
183
+ // ボーンをカメラの角度を向かせる
184
+
185
+ RotateBone();
186
+
187
+
188
+
189
+ // カメラの位置と角度を変更
190
+
191
+ myCamera.localRotation = cameraPosition.localRotation;
192
+
193
+ myCamera.position = cameraPosition.position;
194
+
195
+ }
196
+
197
+ }
198
+
199
+
200
+
201
+ ```
202
+
203
+ 省略なし
204
+
205
+ ```C#
206
+
7
207
  using System.Collections;
8
208
 
9
209
  using System.Collections.Generic;