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

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

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

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

Q&A

解決済

2回答

5203閲覧

FPSにおけるアングル変更の処理が正しくできない。

tkshp

総合スコア174

Unity

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

0グッド

0クリップ

投稿2016/09/10 16:33

###前提・実現したいこと
FPSにおいて、[←][→]キーで左右を回転して見渡し、[↑][↓]キーで上下を回転して見渡すという処理を
考えています。

しかし実際、コードを組んでみたものの、実行してみると、アングルを下向きにしてそのまま右向きに変えて、次はそのままアングルを上に...という具合に、縦横のアングルを変えていくと、視点が傾き、水平線が斜めに見える視界になってしまいます。

斜めに傾かないで、上下左右のアングル変更ができる処理の方法を教えていただきたいです。

また、これの解決方法として、これ以上オブジェクトを追加しない方法(コードのみの処理)で教えていただけたらと思います。

###試したこと
ゲームの視界をわかりやすくするため、シーン上にPlaneで地面を作成し、キューブを1つ作成して前方に浮かせる。
空のゲームオブジェクトにアタッチしているスクリプトで、下記のコードを記述。

C#

1using UnityEngine; 2using System.Collections; 3 4public class CubeScript : MonoBehaviour { 5 GameObject camera; 6 7 void Start(){ 8 camera = GameObject.Find("Main Camera"); 9 } 10 11 void FixedUpdate(){ 12 float rspeed = 5.0f; 13 14 // Read input 15 float horizontal = Input.GetAxis("Horizontal"); 16 float vertical = Input.GetAxis("Vertical"); 17 18 camera.transform.Rotate (vertical * rspeed * (-1), 0, 0, Space.World); 19 camera.transform.Rotate (0, horizontal * rspeed, 0, Space.World); 20 } 21}

※Rotate()の引数に、Space.Selfを指定してもダメでした。

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

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

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

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

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

guest

回答2

0

ベストアンサー

Transform.Rotateではなく、回転(Quaternion)を設定する方法にすれば上手く行きます。


public float rotSpeed = 5.0f;

GameObject camera;
float rotX = 0.0f, rotY = 0.0f;

(省略)

void FixedUpdate()
{
// Read input
float axisH = Input.GetAxis( "Horizontal" );
float axisV = Input.GetAxis( "Vertical" );

rotX += axisV * rotSpeed; rotY -= axisH * rotSpeed; rotX = Mathf.Clamp( rotX, -90.0f, 90.0f ); while( rotY < 0.0f ) { rotY += 360.0f; } while( rotY > 360.0f ) { rotY -= 360.0f; } camera.transform.eulerAngles = new Vector3( rotX, rotY, 0.0f );

}

投稿2016/09/11 02:30

編集2016/09/11 08:42
StudioAres

総合スコア127

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

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

tkshp

2016/09/11 07:57

ご回答ありがとうございます。 Transform.eulerAnglesなのですが、マニュアルを読んでみると、 「絶対値の角度を設定するときのみ使用してください。角度が360度を超えたときには失敗するのでインクリメントしないようにしてください。 」 とありました。 しかし、「rotSpeed * rotX」や「rotSpeed * rotY」のログを取ってみると、マイナスの値や360度を超える値がとれていました。 ゲームを実行している限りでは、動作に問題はなさそうに見えますが、実際、Transform.eulerAnglesで、マイナスの値や、360度を越える値をとって大丈夫なのでしょうか? 私が作りたいFPSは、垂直方向に関しては、-90度~90度までの制限をかけてのアングル変更、水平方向に関しては、制限なく回転できる仕様にしたいと思っています。
StudioAres

2016/09/11 08:44

問題なく動作位しているので大丈夫だと思いますが、設定する前に範囲制限を追加しました。
tkshp

2016/09/11 11:31

ご回答ありがとうございます。Mathf.Clampという便利な関数があったのですね。具体的なコードを教えていただき、ありがとうございました。とても勉強になりました。
guest

0

unityは門外漢ですが

カメラの傾きが保持されたままで
傾いた状態に対して上下回転と左右回転をするため
そうなっているのだと思います
オイラー角の性質上そうなるはずです

CubeScriptに左右回転の度合いと上下回転の度合いを保持する変数x,yを追加し
キー入力に応じてそのx,yを足したり引いたりします
上下を向きすぎると一周して上下が逆さになるはずなので
上下回転に対しては上限下限を設けます

cameraの方はFixedUpdate()メソッドが呼ばれるたびに
一旦cameraの傾きを完全にリセットするメソッドを呼んでから
cameraをx,yを利用して回転させると
期待する動作になると思います

投稿2016/09/10 17:22

e-cube

総合スコア284

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

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

tkshp

2016/09/11 11:34

ご回答ありがとうございます。勉強になりました。ベストアンサーは具体的なコードを提示していただいた方につけさせていただきました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問