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

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

ただいまの
回答率

90.53%

  • Unity

    5286questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,036

tkshp

score 95

前提・実現したいこと

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

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

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

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

試したこと

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

using UnityEngine;
using System.Collections;

public class CubeScript : MonoBehaviour {
    GameObject camera;

    void Start(){
        camera = GameObject.Find("Main Camera");
    }

    void FixedUpdate(){
        float rspeed = 5.0f;

        // Read input
        float horizontal = Input.GetAxis("Horizontal");
        float vertical = Input.GetAxis("Vertical");

        camera.transform.Rotate (vertical * rspeed * (-1), 0, 0, Space.World);
        camera.transform.Rotate (0, horizontal * rspeed, 0,  Space.World);
    }
}

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

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 16:57

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

    私が作りたいFPSは、垂直方向に関しては、-90度~90度までの制限をかけてのアングル変更、水平方向に関しては、制限なく回転できる仕様にしたいと思っています。

    キャンセル

  • 2016/09/11 17:44

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

    キャンセル

  • 2016/09/11 20:31

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

    キャンセル

0

unityは門外漢ですが

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/09/11 20:34

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

    キャンセル

同じタグがついた質問を見る

  • Unity

    5286questions

    Unityは、ユニティテクノロジーが開発したゲームエンジンです。 主にモバイルやブラウザ向けのゲーム製作に利用されていましたが、3Dの重力付きゲームが簡単に作成できることから需要が増え、現在はマルチプラットフォームに対応しています。 言語はC言語/C++で書かれていますが、C#、JavaScript、Booで書かれたコードにも対応しています。