Q&A
実現したいこと
- キャラクターの移動速度を一定にしたい
前提
キャラクターをキー&マウスで操作する処理を書いています。
TPSカメラでキャラクター周りを回転します。
キャラクター自身の移動方向は、カメラの正面方向に合わせて前進し、横に移動するときはキャラクターのみ横向きに回転します。
キャラクターの構成
・プレイヤー
・モデル(子)
・カメラ(子)
上記を実装したところ、カメラを左右に回転させたときにキャラクターの移動が速くなっているように見えました。
どこの処理が間違っているのか
原因がわからず、今回質問をさせて頂きました。
何卒、よろしくお願いいたします。
該当のソースコード
c#
1/// 移動入力 2private void MoveInput() 3 { 4 var horizontal = Input.GetAxis("Horizontal"); 5 var vertical = Input.GetAxis("Vertical"); 6 7 8 if (Mathf.Abs(horizontal) > 0 || Mathf.Abs(vertical) > 0) 9 { 10 animator.SetBool("IsRun", true); 11 moveVector = new Vector3(horizontal, 0, vertical); 12 } 13 else 14 { 15 animator.SetBool("IsRun", false); 16 moveVector = Vector2.zero; 17 } 18 } 19 20 21/// 移動処理 22 private void MoveUpdate(Vector3 vec) 23 { 24 var cameraForward = Vector3.Scale(cameraTransform.forward, new Vector3(1, 0, 1)).normalized; 25 var cameraRight = Vector3.Scale(cameraTransform.right, new Vector3(1, 0, 1)).normalized; 26 27 playerForward = (cameraForward * vec.z) + (cameraRight * vec.x); 28 29 if (playerForward != Vector3.zero) 30 { 31 avatarTransform.rotation = Quaternion.LookRotation(playerForward); 32 } 33 34 if(transform.position.y > 0) 35 { 36 playerForward.y -= gravity; 37 } 38 characterController.Move(playerForward * moveSpeed); 39 } 40 41/// カメラ入力 42 private void MouseCameraInput() 43 { 44 IsTap = false; 45 46 if (Input.GetMouseButtonUp(0)) 47 { 48 mousePos = Vector2.zero; 49 50 if (isDraging) 51 { 52 isDraging = false; 53 } 54 else 55 { 56 IsTap = true; 57 return; 58 } 59 } 60 61 if (Input.GetMouseButtonDown(0)) 62 { 63 downMousePos = Input.mousePosition; 64 downDistance = 0.0f; 65 } 66 67 if (Input.GetMouseButton(0)) 68 { 69 mousePos = Input.mousePosition; 70 downDistance = (mousePos - downMousePos).magnitude; 71 72 if (downDistance >= dragingDistance) 73 { 74 if (!isDraging) 75 { 76 OnCameraBegin(mousePos); 77 isDraging = true; 78 } 79 80 OnCameraMove(mousePos); 81 } 82 } 83 84/// カメラ処理 85 private void OnCameraMove(Vector2 pos) 86 { 87 var currLookPos = pos; 88 var value = prevLookPos - currLookPos; 89 playerCenterPos = new Vector3(transform.position.x, transform.position.y + 0.5f, transform.position.z); 90 91 if (Mathf.Abs(value.x)> Mathf.Abs(value.y)) 92 { 93 cameraTransform.RotateAround(playerCenterPos, Vector3.up, -value.x * cameraSpeedH); 94 } 95 96 if (Mathf.Abs(value.y) > Mathf.Abs(value.x)) 97 { 98 cameraDeltaV = isCameraInverse ? (value.y * Time.deltaTime) : (-value.y * Time.deltaTime); 99 cameraAngleV += cameraDeltaV; 100 101 float clampAngleV = Mathf.Clamp(cameraAngleV, minPich, maxPich); 102 float overValueV = cameraAngleV - clampAngleV; 103 104 cameraDeltaV -= overValueV; 105 cameraAngleV = clampAngleV; 106 107 cameraTransform.RotateAround(playerCenterPos, 108 cameraTransform.right, 109 cameraDeltaV * cameraSpeedV); 110 } 111 112 prevLookPos = pos; 113 }
試したこと
補足情報(FW/ツールのバージョンなど)
Unityのバージョン 2021.3.9
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。