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

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

ただいまの
回答率

90.03%

TPSのカメラの制限

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,464

shinchan0424

score 10

 前提・実現したいこと

今、TPSシューティングのようなシステムをunityで作成しています。
現在、マウスでカメラ操作をしているのですが、カメラがマウスを動かすとそれに合わせてずっと動くので、ある一定のところで止めたいです。

環境は、unity 2017.4.3f1 C# です。
なぜ最新じゃないのかというと、私は専門学生なのですが、学校がなぜか最新にせず、このバージョンにしているからです。

カメラは今現在、マウスを動かせば動かすだけ、プレイヤーのY軸を中心にぐるぐるぐるぐる移動します。
それを、上30度、下30度、右50度、左50度くらいにそれ以上カメラが移動しないように設定したいです。

 発生している問題

C#初心者なので、どのようにしたらいいのかがわかりません。
記載していますソースコードも試行錯誤や、たくさんの調べてやっとのことでできています。

 該当のソースコード

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

public class Cameras : MonoBehaviour {

    GameObject targetObj;
    Vector3 targetPos;

    void Start()
    {
        targetObj = GameObject.Find("Player");
        targetPos = targetObj.transform.position;

    }

    void Update()
    {
        // targetの移動量分、自分(カメラ)も移動する
        transform.position += targetObj.transform.position - targetPos;
        targetPos = targetObj.transform.position;

            // マウスの移動量
            float mouseInputX = Input.GetAxis("Mouse X");
            float mouseInputY = Input.GetAxis("Mouse Y");
            // targetの位置のY軸を中心に、回転(公転)する
            transform.RotateAround(targetPos, Vector3.up, mouseInputX * Time.deltaTime * 50f);

     // カメラの垂直移動
        transform.RotateAround(targetPos, transform.right, -mouseInputY * Time.deltaTime * 50f);
  }
}

このような文になります。

この文に何を書いたらカメラの角度制限を付けることができるのかを教えてほしいです。
よろしくお願いします。

試したこと

if (mouseInputY <= MaxUp)//上を向いたとき
{
this.transform.rotation = Quaternion.Euler(startX - 30 ,0 ,0);
mouseInputY = -30;
}

このようにしてみましたが、まずもって、IF文の中に入ることができません。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

では、水平・垂直の回転角を積算して、初期角度からどれだけ回転しているかが分かるようにするというのはどうでしょうか?
この積算回転角が水平-50°~+50°、垂直-30°~+30°を越えないように、RotateAroundに与える回転量を調整してやればいいかと思います。

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

public class Cameras : MonoBehaviour
{

    GameObject targetObj;
    Vector3 targetPos;

    // フィールドを追加して、積算回転角を別途覚えておけるようにしておく
    float angleH;
    float angleV;

    void Start()
    {
        targetObj = GameObject.Find("Player");
        targetPos = targetObj.transform.position;
    }

    void Update()
    {
        // targetの移動量分、自分(カメラ)も移動する
        transform.position += targetObj.transform.position - targetPos;
        targetPos = targetObj.transform.position;

        // マウスの移動量
        float mouseInputX = Input.GetAxis("Mouse X");
        float mouseInputY = Input.GetAxis("Mouse Y");

        // マウス移動量から求めた水平・垂直回転角(ご質問者さんのコードの、RotateAroundの第3引数と同じ)
        float deltaAngleH = mouseInputX * Time.deltaTime * 50f;
        float deltaAngleV = -mouseInputY * Time.deltaTime * 50f;

        // 角度を積算する
        angleH += deltaAngleH;
        angleV += deltaAngleV;

        // 積算角度を制限内にクランプする
        float clampedAngleH = Mathf.Clamp(angleH, -50, 50);
        float clampedAngleV = Mathf.Clamp(angleV, -30, 30);

        // クランプ前の積算角からクランプ後の積算角を引いて、どれだけ制限範囲を超えたかを求める
        // もし制限範囲内なら差は0になるが、マイナス側に越えればマイナスの、プラス側ならプラスの角度差が得られる
        float overshootH = angleH - clampedAngleH;
        float overshootV = angleV - clampedAngleV;

        // 角度差分だけ回転量を調整して、制限を超えないようにしてやる
        // 積算角度も調整後の値に上書きする
        deltaAngleH -= overshootH;
        deltaAngleV -= overshootV;
        angleH = clampedAngleH;
        angleV = clampedAngleV;

        // targetの位置のY軸を中心に、回転(公転)する
        transform.RotateAround(targetPos, Vector3.up, deltaAngleH);

        // カメラの垂直移動
        transform.RotateAround(targetPos, transform.right, deltaAngleV);
    }
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/08/31 12:05

    ありがとうございました!
    書いていただいたようにプログラムを組んだらカメラが止まりました!
    本当にありがとうございます!!

    キャンセル

  • 2018/08/31 12:29

    うまくいきましたようで何よりです。

    本筋とは関係ないのですが、https://docs.unity3d.com/ja/current/ScriptReference/Input.GetAxis.html の説明や例示されているサンプルコードを見るに、「Mouse X」「Mouse Y」に関してはTime.deltaTimeによるフレームレート補正は不要なようです。他サイトでは https://sleepygamersmemo.blogspot.com/2017/08/unity-mouse-input.html にもそのような話がありました。

    書き換えてもほとんど実行結果に違いはないでしょうが、リファレンスに倣うのであれば「mouseInputX * Time.deltaTime * 50f;」「-mouseInputY * Time.deltaTime * 50f;」はそれぞれ「mouseInputX * 50f / 60f;」「-mouseInputY * 50f / 60f;」のようなTime.deltaTimeを含めない値にするべきかもしれませんね。

    キャンセル

  • 2018/08/31 13:27

    教えていただいてありがとうございます!

    キャンセル

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

  • ただいまの回答率 90.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる