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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

Q&A

解決済

1回答

699閲覧

カメラの向きによってキャラクターの移動が加速してしまいます。

matsutake1111

総合スコア1

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2023/03/10 01:34

編集2023/03/10 01:50

実現したいこと

  • キャラクターの移動速度を一定にしたい

前提

キャラクターをキー&マウスで操作する処理を書いています。
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 }

試したこと

参考にさせていただいたサイト
https://i-school.memo.wiki/d/%A5%AD%A5%E3%A5%E9%A5%AF%A5%BF%A1%BC%A4%CE%B0%DC%C6%B0%A4%C8%A5%AB%A5%E1%A5%E9%A4%CE%B2%F3%C5%BE%B5%A1%C7%BD

補足情報(FW/ツールのバージョンなど)

Unityのバージョン 2021.3.9

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

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

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

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

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

guest

回答1

0

ベストアンサー

MoveUpdateメソッドの中でcameraForwardcameraRight.normalizedによって正規化(ベクトルの長さを1にすること)が行われているのですが、playerForwardは正規化されていません。
渡されてる引数vecによってはplayerForwardの長さが変わってしまうので、正規化すると移動速度が一定になるかもしれません。

cs

1characterController.Move(playerForward.normalized * moveSpeed);

投稿2023/03/10 05:35

KomoriGameDev

総合スコア433

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問