質問編集履歴

1

コードを追加しました

2020/01/13 03:58

投稿

creatorsGame
creatorsGame

スコア18

test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,365 @@
1
1
  [この記事](https://gametukurikata.com/fps/lookatforward)を参考に以下の紫の矢印の方向に視点の上下の向きに腰が曲がるようにできたのですが、次は以下の画像の分かりずらいかもしれませんが、赤の矢印の方向に腰が曲がるようにしたいです。どうすれば良いでしょうか?
2
2
 
3
3
  ![イメージ説明](6f28393912a0aecce58bc421dd0ba701.png)
4
+
5
+ ```C#
6
+
7
+ using System.Collections;
8
+
9
+ using System.Collections.Generic;
10
+
11
+ using UnityEngine;
12
+
13
+
14
+
15
+ public class Player : MonoBehaviour
16
+
17
+ {
18
+
19
+ //キャラクターコントローラー
20
+
21
+ private CharacterController cCon;
22
+
23
+ // キャラクターの速度
24
+
25
+ private Vector3 velocity;
26
+
27
+ // Animator
28
+
29
+ private Animator animator;
30
+
31
+ // 歩くスピード
32
+
33
+ [SerializeField]
34
+
35
+ private float walkSpeed = 1.5f;
36
+
37
+ // 走るスピード
38
+
39
+ [SerializeField]
40
+
41
+ private float runSpeed = 2.5f;
42
+
43
+ // 走っているかどうか
44
+
45
+ private bool runFlag = false;
46
+
47
+ // キャラクター視点のカメラ
48
+
49
+ private Transform myCamera;
50
+
51
+ // キャラクター視点のカメラで回転出来る限度
52
+
53
+ [SerializeField]
54
+
55
+ private float cameraRotateLimit = 30f;
56
+
57
+ // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定
58
+
59
+ [SerializeField]
60
+
61
+ private bool cameraRotForward = true;
62
+
63
+ // カメラの角度の初期値
64
+
65
+ private Quaternion initCameraRot;
66
+
67
+ // キャラクター、カメラ(視点)の回転スピード
68
+
69
+ [SerializeField]
70
+
71
+ private float rotateSpeed = 2f;
72
+
73
+ // カメラのX軸の角度変化値
74
+
75
+ private float xRotate;
76
+
77
+ // キャラクターのY軸の角度変化値
78
+
79
+ private float yRotate;
80
+
81
+ // マウス移動のスピード
82
+
83
+ [SerializeField]
84
+
85
+ private float mouseSpeed = 2f;
86
+
87
+ // キャラクターのY軸の角度
88
+
89
+ private Quaternion charaRotate;
90
+
91
+ // カメラのX軸の角度
92
+
93
+ private Quaternion cameraRotate;
94
+
95
+ // キャラが回転中かどうか?
96
+
97
+ private bool charaRotFlag = false;
98
+
99
+ // キャラクターの脊椎のボーン
100
+
101
+ [SerializeField]
102
+
103
+ private Transform spine;
104
+
105
+ // カメラのTransform
106
+
107
+ [SerializeField]
108
+
109
+ private Transform cameraPosition;
110
+
111
+
112
+
113
+
114
+
115
+
116
+
117
+ void Start()
118
+
119
+ {
120
+
121
+ if (Input.GetKeyDown(KeyCode.Escape))
122
+
123
+ {
124
+
125
+ Cursor.visible = true;
126
+
127
+ Cursor.lockState = CursorLockMode.None;
128
+
129
+ }
130
+
131
+ //キャラクターコントローラの取得
132
+
133
+ cCon = GetComponent<CharacterController>();
134
+
135
+ animator = GetComponent<Animator>();
136
+
137
+ myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得
138
+
139
+ initCameraRot = myCamera.localRotation;
140
+
141
+ charaRotate = transform.localRotation;
142
+
143
+ cameraRotate = myCamera.localRotation;
144
+
145
+
146
+
147
+ Cursor.visible = false;
148
+
149
+ Cursor.lockState = CursorLockMode.Locked;
150
+
151
+ }
152
+
153
+ void Update()
154
+
155
+ {
156
+
157
+
158
+
159
+ // キャラクターの向きを変更する
160
+
161
+ RotateChara();
162
+
163
+ // 視点の向きを変える
164
+
165
+ RotateCamera();
166
+
167
+ // ボーンをカメラの角度を向かせる
168
+
169
+ RotateBone();
170
+
171
+
172
+
173
+ // キャラクターコントローラのコライダが地面と接触してるかどうか
174
+
175
+ if (cCon.isGrounded)
176
+
177
+ {
178
+
179
+
180
+
181
+ velocity = Vector3.zero;
182
+
183
+
184
+
185
+ velocity = (transform.forward * Input.GetAxis("Vertical") + transform.right * Input.GetAxis("Horizontal")).normalized;
186
+
187
+
188
+
189
+ // 走るか歩くかでスピードを変更する
190
+
191
+ float speed = 0f;
192
+
193
+
194
+
195
+ if ((Input.GetButton("Run"))) //&& Input.GetButton("Fire2") == false)
196
+
197
+ {
198
+
199
+ runFlag = true;
200
+
201
+ speed = runSpeed;
202
+
203
+ }
204
+
205
+ else
206
+
207
+ {
208
+
209
+ runFlag = false;
210
+
211
+ speed = walkSpeed;
212
+
213
+ }
214
+
215
+ velocity *= speed;
216
+
217
+
218
+
219
+ if (velocity.magnitude > 0f || charaRotFlag)
220
+
221
+ {
222
+
223
+ if (runFlag && !charaRotFlag)
224
+
225
+ {
226
+
227
+ animator.SetFloat("Speed", 2.1f);
228
+
229
+ }
230
+
231
+ else
232
+
233
+ {
234
+
235
+ animator.SetFloat("Speed", 1f);
236
+
237
+ }
238
+
239
+ }
240
+
241
+ else
242
+
243
+ {
244
+
245
+ animator.SetFloat("Speed", 0f);
246
+
247
+ }
248
+
249
+ }
250
+
251
+ velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算
252
+
253
+ cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる
254
+
255
+ }
256
+
257
+
258
+
259
+ // キャラクターの角度を変更
260
+
261
+ void RotateChara()
262
+
263
+ {
264
+
265
+ // 横の回転値を計算
266
+
267
+ float yRotate = Input.GetAxis("Mouse X") * mouseSpeed;
268
+
269
+
270
+
271
+ charaRotate *= Quaternion.Euler(0f, yRotate, 0f);
272
+
273
+
274
+
275
+
276
+
277
+ // キャラクターの回転を実行
278
+
279
+ transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime);
280
+
281
+ }
282
+
283
+
284
+
285
+
286
+
287
+ // カメラの角度を変更
288
+
289
+ void RotateCamera()
290
+
291
+ {
292
+
293
+
294
+
295
+ float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed;
296
+
297
+
298
+
299
+ // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる
300
+
301
+ if (cameraRotForward)
302
+
303
+ {
304
+
305
+ xRotate *= -1;
306
+
307
+ }
308
+
309
+ // 一旦角度を計算する
310
+
311
+ cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f);
312
+
313
+ // カメラのX軸の角度が限界角度を超えたら限界角度に設定
314
+
315
+ var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit);
316
+
317
+ // 角度を再構築
318
+
319
+ cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z);
320
+
321
+ // カメラの視点変更を実行
322
+
323
+ cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime);
324
+
325
+ }
326
+
327
+
328
+
329
+
330
+
331
+ void RotateBone()
332
+
333
+ {
334
+
335
+ // 腰のボーンの角度をカメラの向きにする
336
+
337
+ spine.rotation = Quaternion.Euler(spine.eulerAngles.x+ myCamera.localEulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z);
338
+
339
+ }
340
+
341
+
342
+
343
+ void LateUpdate()
344
+
345
+ {
346
+
347
+ // ボーンをカメラの角度を向かせる
348
+
349
+ RotateBone();
350
+
351
+
352
+
353
+ // カメラの位置と角度を変更
354
+
355
+ myCamera.localRotation = cameraPosition.localRotation;
356
+
357
+ myCamera.position = cameraPosition.position;
358
+
359
+ }
360
+
361
+ }
362
+
363
+
364
+
365
+ ```