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

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

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

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

Q&A

0回答

2963閲覧

一般的なゲームのようにマウス感度を実装したいです

motumiN

総合スコア1

C#

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

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Unity3D

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

Unity

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

0グッド

0クリップ

投稿2021/12/15 15:38

編集2021/12/17 20:27

【初心者】将来マウス感度をUIにて後から変更できるようにしたいです。

将来マウス感度をUIにて後から変更できるようにしたいので、"変数"で変えるならどこなのか
そもそも、このスクリプトだと不可能なのか教えていただきたいです。

無知、不備等があると思いますが、よろしくお願い致します。
また、不足している情報等があれば追記いたします。

やりたいこと

一般的なゲームのようにUIにてマウス感度を変えられるようにしたいです。
ですので、マウス感度が変更できる"変数"の場所を具体的に知りたいです。

using System.Collections; using System.Collections.Generic; using UnityEngine; public class PlayerMove : MonoBehaviour { //移動速度。Inspectorから数値を変更できる。外部のクラスからは変更できない。 [SerializeField] float moveSpeed; [Range(-75f, 0f)] [SerializeField] float cameraMaxX = -50f; //上視点 [Range(65f, 0f)] [SerializeField] float cameraMixX = 50f; //下視点 [Range(200f, 0f)] [SerializeField] float ここにマウス感度の変数を付けたいです = 0.0f; //マウス感度の変数 //Rigidbody型のplayerRidigbody変数を宣言 Rigidbody playerRigidbody; //小数型の変数を2つ宣言 float moveX, moveZ; //真偽値型の変数を2つ宣言 bool moveZpermission, moveXpermission; //マウスの動きを取得する為のfloat型変数を宣言 float mouseX,mouseY; //カメラのX回転角を取得する為のfloat型変数を宣言 float rotationXcamera; //マウスの動きを反映させる許可を決める bool mouseXpermission, mouseYpermission; //カメラの動きを制御する Transform transformCamera; //Vector3型の変数を宣言 Vector3 vec3; //最初のフレームだけ実行される処理 void Start() { //このスクリプトがアタッチされているオブジェクト(Player)のRigidbodyを取得 playerRigidbody = GetComponent<Rigidbody>(); //カメラのTransformを取得 transformCamera = Camera.main.transform; //カメラのX回転角を取得 rotationXcamera = transformCamera.localEulerAngles.x; } //Update is called once per frame //毎フレーム実行される処理 void Update() { movePermission(); } void FixedUpdate() { moveExecution(); } void movePermission() { //小数型の変数に、Horizontalで指定したキーに対して入力があった場合、度合いに応じた戻り値「-1」~「1」が割り当てられる moveX = Input.GetAxis("Horizontal"); //小数型の変数に、Verticalで指定したキーに対して入力があった場合、度合いに応じた戻り値「-1」~「1」が割り当てられる moveZ = Input.GetAxis("Vertical"); //マウスの上下移動に対して戻り値「-1」~「1」を取得 mouseX = Input.GetAxis("Mouse X"); //マウスの左右移動に対して戻り値「-1」~「1」を取得 mouseY = Input.GetAxis("Mouse Y"); //Verticalで指定したキーに対して入力があった場合 if (moveZ != 0) { //前後に移動する処理を開始する為の許可を出す moveZpermission = true; } //Horizontalで指定したキーに対して入力があった場合 if (moveX != 0) { //左右に移動する処理を開始する為の許可を出す moveXpermission = true; } if (mouseX != 0) { //左右に回転する処理を開始する為の許可を出す mouseXpermission = true; } if (mouseY != 0) { //上下に回転する処理を開始する為の許可を出す mouseYpermission = true; } } void moveExecution() { //前後もしくは左右に移動する処理開始の許可が出たら、{}内の処理を実行する if (moveZpermission || moveXpermission || mouseXpermission || mouseYpermission) { //キー入力が無い時まで{}内の処理が呼ばれないよう、不許可に戻しておく moveZpermission = false; moveXpermission = false; mouseXpermission = false; mouseYpermission = false; //Vector3型変数のX成分とZ成分にキー入力の度合いを取得した変数の値を割り当てる vec3 = new Vector3(moveX, 0, moveZ); //このスクリプトがアタッチされているオブジェクト(Player)の向きを基準としたX方向とZ方向に移動するよう、 //1フレームの変化量に対応させてplayerRigidbodyの速度を上書きする //回転移動防止の為、インスペクターからFreezeRotation X Y Z にチェックを入れておく //magnitudeが1以上(斜め移動)の時だけnormalizedでmagnitudeを1にすることで if (vec3.magnitude > 1) { //これだけだとちょっとずつ動けない※normalizedによってmagnitudeが常に1になる為 playerRigidbody.velocity = transform.rotation * vec3.normalized * moveSpeed * Time.deltaTime * 100; } else { //magnitudeが1未満の場合はnormalizedで正規化はしない playerRigidbody.velocity = transform.rotation * vec3 * moveSpeed * Time.deltaTime * 100; } //移動量確認用 //Debug.Log(playerRigidbody.velocity.magnitude); //マウスの左右移動に応じてプレイヤーのRigidbodyのY軸を回転 playerRigidbody.MoveRotation(Quaternion.Euler(0.0f, playerRigidbody.rotation.eulerAngles.y + mouseX * Time.deltaTime * 100.0f, 0.0f)); //マウスの上下移動に応じてカメラのX回転角の値を決める。+-方向40度までに制限をかける。 rotationXcamera = Mathf.Clamp(rotationXcamera - mouseY * Time.deltaTime * 100.0f, cameraMaxX, cameraMixX); //カメラのX回転角を設定 transformCamera.localEulerAngles = new Vector3(rotationXcamera, 0, 0); } else { //移動許可が出ていない時は力を加えないようにリセットする playerRigidbody.velocity = Vector3.zero; } } }

試したこと

  • //マウスの左右移動に応じてプレイヤーのRigidbodyのY軸を回転の()内の値を色々といじくったのですが、すごい動きになってしまいました。
  • 「unity マウス感度」「unity マウス感度実装」等で検索して色々と試して見ましたが、上記のようにすごい動きになってしまいました。

補足情報

┗このサイト内のスクリプトを少しいじったものです

  • リストUnity 2020.3.24f1

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

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

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

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

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

Zuishin

2021/12/15 22:19

方法は二種類。OS のマウス感度を変更するか、ゲーム内だけ変更するか。 前者の場合は OS の設定を変更する必要があり、またゲームが終わった時や離れた時に戻さなくてはいけない。 後者の場合は実際のマウスの移動量とゲーム内のマウスに合わせて動作する物の動作量を調節する。 どちらを想定しているのかでやり方も違ってくる。
motumiN

2021/12/16 12:52

なるほど!盲点でした。ありがとうございます。 前者だと不便性が出てくると思われるので、やはり後者の実際のマウスの移動量とゲーム内のマウスに合わせて動作する物の動作量を調節した方が、ゲーム内だけで完結すると思われるので、後者で実装を考えていきたいです。
vann_2921

2021/12/16 16:39

単純に変化量に感度を掛けるだけではないでしょうか? もしそれでうまくいかないのであればどういう風にうまくいかないのか書いてください。 例えば感度を0.5にすればプレイヤーの回転は0.5倍になるはずですが100倍になってしまいます。など その時どのコードで100倍になっているのか提示してもらえると回答しやすいです。
motumiN

2021/12/17 20:24

回答ありがとうございます。 まず大前提として初心者なもので、具体的に説明するのは難しいのですが Quaternion.Euler()の中のTime.deltaTimeや、0.0f両方の値をfloatの変数で置き換えたりして試した結果、 player自体が回転したり、シーン開始時のカメラの位置が変動、回転をしてしまいました。 Quaternion.Eulerの値を一つずつ説明等ができないため、具体的な値、一文を付け加えてもらえると非常に助かります。 一つ質問なのですが、変化量というのは //マウスの左右移動に応じてプレイヤーのRigidbodyのY軸を回転 playerRigidbody.MoveRotation(Quaternion.Euler(0.0f, playerRigidbody.rotation.eulerAngles.y + mouseX * Time.deltaTime * 100.0f, 0.0f)); こちらの100.0fの値ということでしょうか? この値を別の値(700.0f)で試して見たところ、思っている動きに近い動きをしていたので、 playerRigidbody.MoveRotation()[X軸]とMathf.Clamp()[Y軸]の100.0fの値を変更していけばよろしいのでしょうか?
vann_2921

2021/12/18 00:12

私はあなたの書いたプログラムは分かりませんし、人の書いた長いプログラムなど読む気はしないので答えられません。 あなたがやるべきことはなぜマウスを動かすとプレイヤーが回転するのかを調べることでしょう。MoveRotation関数について検索してください。変化量はおそらく(mouseX * Time.deltaTime * 100.0f)です。変化量は掛け算の結果で100.0fではありません。これにマウス感度を掛け算してください。そしてそれでうまくいかないなら質問してください。そのときにうまくいかないとはどういう状態なのか(プレイヤーの回転は0.5倍になるはずですが100倍になってしまいますなど)を書いてください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問