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

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

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

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

Q&A

解決済

1回答

1255閲覧

FPSでのCameraの反転について。

kumao23

総合スコア10

Unity

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

0グッド

0クリップ

投稿2021/07/09 14:22

前提・実現したいこと

シーンが切り替わる瞬間当たりにマウスを上(?)に瞬発的に動かすと、切り替わった後のカメラが上下左右反転してしまうのを直したい。

発生している問題・エラーメッセージ

たまに発生していたFPSのカメラの反転のタイミングがシーンが切り替わるときにマウスが素早く(?)動いている時に起きる現象だとまでは分かりました。
https://www.youtube.com/watch?v=Wqav1Cqel_U
その後、カメラの回転軸を観察すると、通常は回転のz軸は0なのですが、反転すると不思議な数字と、ほぼ180になっています。
https://www.youtube.com/watch?v=K0_p0wxlwrE

該当のソースコード

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class MouseCamera : MonoBehaviour
{
[SerializeField]
float viewAngle;
public float mousespeed;
float _inputX, _inputY;

// Start is called before the first frame update void Start() { //カーソルをロックする Cursor.lockState = CursorLockMode.Locked; //カーソルを見えなくする Cursor.visible = false; } // Update is called once per frame void Update() { _inputX = Input.GetAxis("Mouse X"); _inputY = Input.GetAxis("Mouse Y"); Rotate(_inputX*mousespeed, _inputY*mousespeed*-1, viewAngle); } void Rotate(float _inputX, float _inputY, float limit) { float maxLimit = limit, minLimit = 360 - maxLimit; //X軸回転 var localAngle = transform.localEulerAngles; localAngle.x += _inputY; if (localAngle.x > maxLimit && localAngle.x < 180) localAngle.x = maxLimit; if (localAngle.x < minLimit && localAngle.x > 180) localAngle.x = minLimit; transform.localEulerAngles = localAngle; //Y軸回転 var angle = transform.eulerAngles; angle.y += _inputX; transform.eulerAngles = angle; }

}

試したこと

初心者ながら検索してカメラの回転をリセットしたり、z軸を0から始めるスクリプトを書き加えたりしてみましたがダメでした。
タイミング会う時しか出ないバクなのですが、解決しないといけないものであるので、その方法を教えてください。
どうぞ宜しくお願い申し上げます。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

ベストアンサー

おそらくシーンロードのタイミングだと、さまざまな処理のためにフレームレートが著しく低下しているんじゃないかと思います。
そのように仮定すると、その時にはフレーム間のマウス移動量が大きくなり、通常のプレイ時よりもInput.GetAxis("Mouse X");Input.GetAxis("Mouse Y");の値が極端に大きくなると予想されます。

試しに下記のように、スペースキーを押した時だけ垂直方向のインプット量を10倍にしてみたところ...

lang

1 // Update is called once per frame 2 void Update() 3 { 4 var mouseSpeedScale = Input.GetKey(KeyCode.Space) ? 10.0f : 1.0f; 5 _inputX = Input.GetAxis("Mouse X"); 6 _inputY = Input.GetAxis("Mouse Y"); 7 Rotate(_inputX*mousespeed, _inputY*mousespeed*-1*mouseSpeedScale, viewAngle); 8 }

下図のように、シーンリロードを挟まなくても天地逆転現象を発生させることができました。

図

対策として、角度制限方法を下記のように変更してみるとどうでしょうか?

lang

1 void Rotate(float _inputX, float _inputY, float limit) 2 { 3 // 角度限界を符号付き角度で表現する 4 float maxLimit = limit, minLimit = -maxLimit; 5 6 //X軸回転 7 var localAngle = transform.localEulerAngles; 8 9 // localAngle.xを符号付き角度に変える 10 if (localAngle.x > 180) 11 localAngle.x -= 360; 12 13 // 符号付き角度前提で角度制限を行う 14 localAngle.x = Mathf.Clamp(localAngle.x + _inputY, minLimit, maxLimit); 15 16 transform.localEulerAngles = localAngle; 17 18 //Y軸回転 19 var angle = transform.eulerAngles; 20 angle.y += _inputX; 21 transform.eulerAngles = angle; 22 }

投稿2021/07/10 19:52

Bongo

総合スコア10811

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

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

kumao23

2021/07/10 21:42

Bongo様。 有難う御座います!! シーンの切り替わり時にそんな負担がかかっていたのですね。考えたことなかったです。 ご丁寧にコードまで教えて頂いてとても勉強になりました。 マウスをぐりぐり動かしても反転しなくなりました。本当に助かりました。 これからも勉強精進してまいります。 本当に本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問