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

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

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

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

Unity

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

Q&A

解決済

1回答

1405閲覧

Unityでnormalizedでベクトルを正規化したい

Novamaan

総合スコア1

C#

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

Unity

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

0グッド

0クリップ

投稿2022/04/27 11:21

斜めの移動量と縦横の四方向の移動量をnormalizedで移動量を同じにしようとしたのですが、調べてみても分からなかったので、教えてほしいです。有識者の方教えていただけると嬉しいです!!(投げやりですいません)

C#

1コード 2using System.Collections; 3using System.Collections.Generic; 4using UnityEngine; 5 6public class PlayerController : MonoBehaviour 7{ 8 public GameObject Player; 9 public GameObject Camera; 10 public float speed = 5f; 11 public float sprintspeed = 10f; 12 public float backspeed = 2f; 13 private Transform PlayerTransform; 14 private Transform CameraTransform; 15 private float angle; 16 // Use this for initialization 17 void Start() 18 { 19 20 PlayerTransform = transform.parent; 21 CameraTransform = GetComponent<Transform>(); 22 23 } 24 25 // Update is called once per frame 26 void Update() 27 { 28 //カメラのアングル制御 29 float X_Rotation = Input.GetAxis("Mouse X"); 30 float Y_Rotation = Input.GetAxis("Mouse Y"); 31 PlayerTransform.transform.Rotate(0, X_Rotation, 0); 32 33 //35の部分変えると下の無垢角度制限できる 34 angle = Camera.transform.localEulerAngles.x; 35 if (angle > 334 && angle < 360 || angle > 0 && 35 > angle) 36 { 37 CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); 38 float kk = Y_Rotation; 39 } 40 else 41 { 42 43 if (angle > 300) 44 { 45 46 if (Input.GetAxis("Mouse Y") < 0) 47 { 48 49 CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); 50 51 } 52 } 53 else 54 { 55 if (Input.GetAxis("Mouse Y") > 0) 56 { 57 58 CameraTransform.transform.Rotate(-Y_Rotation, 0, 0); 59 60 } 61 62 } 63 } 64 65 //いじっちゃだめゾーン 66 float angleDir = PlayerTransform.transform.eulerAngles.y * (Mathf.PI / 180.0f); 67 Vector3 前と後ろ = new Vector3(Mathf.Sin(angleDir), 0, Mathf.Cos(angleDir)); 68 Vector3 右と左 = new Vector3(-Mathf.Cos(angleDir), 0, Mathf.Sin(angleDir)); 69 70 71 72 //Playerの動きを制御してるところ 73 if (Input.GetKey(KeyCode.LeftControl) && Input.GetKey(KeyCode.W)) 74 { 75 PlayerTransform.transform.position += 前と後ろ * speed / 2 * Time.deltaTime; 76 } 77 else if ((Input.GetKey(KeyCode.W))) 78 { 79 PlayerTransform.transform.position += 前と後ろ * speed * Time.deltaTime; 80 } 81 82 83 84 if (Input.GetKey(KeyCode.LeftControl) && Input.GetKey(KeyCode.A)) 85 { 86 PlayerTransform.transform.position += 右と左 * speed / 2 * Time.deltaTime; 87 } 88 else if (Input.GetKey(KeyCode.A)) 89 { 90 PlayerTransform.transform.position += 右と左 * speed * Time.deltaTime; 91 } 92 93 94 if (Input.GetKey(KeyCode.LeftControl) && Input.GetKey(KeyCode.S)) 95 { 96 PlayerTransform.transform.position += -前と後ろ * backspeed / 2 * Time.deltaTime; 97 } 98 else if ((Input.GetKey(KeyCode.S))) 99 { 100 PlayerTransform.transform.position += -前と後ろ * backspeed * Time.deltaTime; 101 } 102 103 if (Input.GetKey(KeyCode.LeftControl) && Input.GetKey(KeyCode.D)) 104 { 105 PlayerTransform.transform.position += -右と左 * speed / 2 * Time.deltaTime; 106 } 107 else if (Input.GetKey(KeyCode.D)) 108 { 109 PlayerTransform.transform.position += -右と左 * speed * Time.deltaTime; 110 } 111 112 } 113}

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

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

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

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

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

guest

回答1

0

ベストアンサー

質問のスクリプトはいろいろと常識外れなので、サンプルを貼っておきます。

csharp

1using UnityEngine; 2 3[RequireComponent(typeof(Rigidbody))] 4public class PlayerMovement : MonoBehaviour 5{ 6 [SerializeField] float _moveSpeed = 3f; 7 [SerializeField] float _rotateSpeed = 2f; 8 Rigidbody _rb = default; 9 10 void Start() 11 { 12 _rb = GetComponent<Rigidbody>(); 13 _rb.freezeRotation = true; 14 } 15 16 void Update() 17 { 18 float h = Input.GetAxisRaw("Horizontal"); 19 float v = Input.GetAxisRaw("Vertical"); 20 _rb.velocity = (this.transform.forward * v + this.transform.right * h).normalized * _moveSpeed 21 + Vector3.up * _rb.velocity.y; 22 23 float r = Input.GetAxisRaw("Mouse X"); 24 this.transform.Rotate(this.transform.up, r + _rotateSpeed * Time.deltaTime); 25 } 26}

一般的に変な点は以下の通りです。

  • Transform.position を上書きするのは「瞬間移動」なので、場合によっては当たり判定が無視されるし、ぷるぷる振動して気持ち悪い
  • マウスでのカメラ制御は元々 Unity にその機能 (Cinemachine) があるので、スクリプトを書く必要はない

投稿2022/04/27 12:36

bboydaisuke

総合スコア5275

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

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

Novamaan

2022/04/27 22:41

ご返答ありがとうございます。思い通りのものにできたのですが、一つ質問です。 Y軸のマウスが反映されないのですがこれは仕様ですか?
bboydaisuke

2022/04/28 00:02 編集

私が貼ったコードに「マウスのY軸」を取得する処理は書いてませんよね。
Novamaan

2022/04/28 00:20

あ、本当だ、失礼しました!!
Novamaan

2022/04/28 01:13

ちなみに、Y軸を取得して反映するコード教えていただけませんか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問