質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

Q&A

0回答

1502閲覧

Unity3D カメラを左右に動かすと跳ね返される(戻される)

creatorsGame

総合スコア18

Unity3D

Unity3Dは、ゲームや対話式の3Dアプリケーション、トレーニングシュミレーション、そして医学的・建築学的な技術を可視化する、商業用の開発プラットフォームです。

Unity

Unityは、Unity Technologiesが開発・販売している、IDEを内蔵するゲームエンジンです。主にC#を用いたプログラミングでコンテンツの開発が可能です。

0グッド

0クリップ

投稿2020/01/15 12:29

カメラを左右に速く動かすと跳ね返されてしまいます(少し元の左右の位置に戻される)。何が原因でしょうか?

C#

1 2 //キャラクターコントローラー 3 private CharacterController cCon; 4 // キャラクターの速度 5 private Vector3 velocity; 6 // Animator 7 private Animator animator; 8 // 歩くスピード 9 [SerializeField] 10 private float walkSpeed = 1.5f; 11 // 走るスピード 12 [SerializeField] 13 private float runSpeed = 2.5f; 14 // 走っているかどうか 15 private bool runFlag = false; 16 // キャラクター視点のカメラ 17 private Transform myCamera; 18 // キャラクター視点のカメラで回転出来る限度 19 [SerializeField] 20 private float cameraRotateLimit = 30f; 21 // カメラの上下の移動方法。マウスを上で上を向く場合はtrue、マウスを上で下を向く場合はfalseを設定 22 [SerializeField] 23 private bool cameraRotForward = true; 24 // カメラの角度の初期値 25 private Quaternion initCameraRot; 26 // キャラクター、カメラ(視点)の回転スピード 27 [SerializeField] 28 private float rotateSpeed = 5f; 29 // マウス移動のスピード 30 [SerializeField] 31 private float mouseSpeed = 6f; 32 // キャラクターのY軸の角度 33 private Quaternion charaRotate; 34 // カメラのX軸の角度 35 private Quaternion cameraRotate; 36 // キャラが回転中かどうか? 37 private bool charaRotFlag = false; 38 // キャラクターの脊椎のボーン 39 [SerializeField] 40 private Transform spine; 41 // カメラのTransform 42 [SerializeField] 43 private Transform cameraPosition; 44 45 46 47 void Start() 48 { 49 if (Input.GetKeyDown(KeyCode.Escape)) 50 { 51 Cursor.visible = true; 52 Cursor.lockState = CursorLockMode.None; 53 } 54 //キャラクターコントローラの取得 55 cCon = GetComponent<CharacterController>(); 56 animator = GetComponent<Animator>(); 57 myCamera = GetComponentInChildren<Camera>().transform; // キャラクター視点のカメラの取得 58 initCameraRot = myCamera.localRotation; 59 charaRotate = transform.localRotation; 60 cameraRotate = myCamera.localRotation; 61 62 Cursor.visible = false; 63 Cursor.lockState = CursorLockMode.Locked; 64 } 65 void Update() 66 { 67 68 // キャラクターの向きを変更する 69 RotateChara(); 70 // 視点の向きを変える 71 RotateCamera(); 72 // ボーンをカメラの角度を向かせる 73 RotateBone(); 74 75 // キャラクターコントローラのコライダが地面と接触してるかどうか 76 if (cCon.isGrounded) 77 { 78 79 velocity = Vector3.zero; 80 81 velocity = (transform.forward * Input.GetAxis("Vertical") + transform.right * Input.GetAxis("Horizontal")).normalized; 82 83 // 走るか歩くかでスピードを変更する 84 float speed = 0f; 85 86 if ((Input.GetButton("Run"))) 87 { 88 runFlag = true; 89 speed = runSpeed; 90 } 91 else 92 { 93 runFlag = false; 94 speed = walkSpeed; 95 } 96 velocity *= speed; 97 98 if (velocity.magnitude > 0f || charaRotFlag) 99 { 100 if (runFlag && !charaRotFlag) 101 { 102 animator.SetFloat("Speed", 2.1f); 103 } 104 else 105 { 106 animator.SetFloat("Speed", 1f); 107 } 108 } 109 else 110 { 111 animator.SetFloat("Speed", 0f); 112 } 113 } 114 velocity.y += Physics.gravity.y * Time.deltaTime; // 重力値を計算 115 cCon.Move(velocity * Time.deltaTime); // キャラクターコントローラのMoveを使ってキャラクターを移動させる 116 } 117 118 // キャラクターの角度を変更 119 void RotateChara() 120 { 121 // 横の回転値を計算 122 float yRotate = Input.GetAxis("Mouse X") * mouseSpeed; 123 124 charaRotate *= Quaternion.Euler(0f, yRotate, 0f); 125 126 127 // キャラクターの回転を実行 128 transform.localRotation = Quaternion.Slerp(transform.localRotation, charaRotate, rotateSpeed * Time.deltaTime); 129 } 130 131 132 // カメラの角度を変更 133 void RotateCamera() 134 { 135 136 float xRotate = Input.GetAxis("Mouse Y") * mouseSpeed; 137 138 // マウスを上に移動した時に上を向かせたいなら反対方向に角度を反転させる 139 if (cameraRotForward) 140 { 141 xRotate *= -1; 142 } 143 // 一旦角度を計算する 144 cameraRotate *= Quaternion.Euler(xRotate, 0f, 0f); 145 // カメラのX軸の角度が限界角度を超えたら限界角度に設定 146 var resultYRot = Mathf.Clamp(Mathf.DeltaAngle(initCameraRot.eulerAngles.x, cameraRotate.eulerAngles.x), -cameraRotateLimit, cameraRotateLimit); 147 // 角度を再構築 148 cameraRotate = Quaternion.Euler(resultYRot, cameraRotate.eulerAngles.y, cameraRotate.eulerAngles.z); 149 // カメラの視点変更を実行 150 cameraPosition.localRotation = Quaternion.Slerp(myCamera.localRotation, cameraRotate, rotateSpeed * Time.deltaTime); 151 } 152 153 154 void RotateBone() 155 { 156 // 腰のボーンの角度をカメラの向きにする 157 spine.rotation = Quaternion.Euler(spine.eulerAngles.x + myCamera.localEulerAngles.x, spine.eulerAngles.y, spine.eulerAngles.z); 158 } 159 160 void LateUpdate() 161 { 162 // ボーンをカメラの角度を向かせる 163 RotateBone(); 164 165 // カメラの位置と角度を変更 166 myCamera.localRotation = cameraPosition.localRotation; 167 myCamera.position = cameraPosition.position; 168 } 169}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Y0241-N

2020/01/17 04:36

これってカメラ自体は縦振りで横はキャラの回転に合わせてますよね、なのにLateUpdateでカメラの角度を辺越してるあたりが怪しいかと。 あとRotateBone()をUpadateとLateUpdateの両方で呼び出す意味はあるのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問