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

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

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

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

Unity

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

Q&A

解決済

1回答

10658閲覧

カメラの垂直移動に角度制限をつけたい

hirokun9465

総合スコア12

C#

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

Unity

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

1グッド

1クリップ

投稿2017/11/16 05:11

こんにちは。
Unityで、Vectoe3.zeroを視点方向にして、マウスで円を描くようにカメラの視点を移動させたく、ネットを参考にして以下のように実現しました。
今度はカメラの垂直移動に角度制限をつけたいのですが、やり方が分からず思案しています。
どのようにすれば実現できるのか、教えて頂けると幸いです。

Update()
{

// マウスの移動量
float mouseInputX = Input.GetAxis("Mouse X");
float mouseInputY = Input.GetAxis("Mouse Y");
// targetの位置のY軸を中心に、回転(公転)する
transform.RotateAround(Vector3.zero, Vector3.up, mouseInputX * Time.deltaTime * 200f);
// カメラの垂直移動(角度制限なし)
transform.RotateAround(Vector3.zero, transform.right, mouseInputY * Time.deltaTime * -200f);

}

sabatyan👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

別のやり方もあると思いますが

Mathf.Clampを利用します(オブジェクトとか変数の動きに制限をつけれる)

C#

1 2Vector3 roteuler; 3 4void Start () 5{ 6 roteuler = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0f); 7} 8 9void Update () 10 { 11 float mouseInputX = Input.GetAxis("Mouse X"); 12 float mouseInputY = Input.GetAxis("Mouse Y"); 13 14 roteuler = new Vector3(Mathf.Clamp(roteuler.x - mouseInputY, -80, 80), roteuler.y + mouseInputX, 0f); 15 transform.localEulerAngles = roteuler; 16 }

カメラにはスクリプトは必要ありません
このスクリプトを空のオブジェクトにアタッチして、
カメラをそのオブジェクトの子にします。
そして、カメラが子のオブジェクトの座標をターゲットと一緒にします![イメージ説明
###スクリプトの説明(初心者なので変な部分が多いです

C#

1Vector3 roteuler; roteulerという名前でvector3を宣言 2 3roteuler = new Vector3(transform.localEulerAngles.x, transform.localEulerAngles.y, 0f); 宣言したroteulerに、 new vector3(transform....を入れる(?) 

C#

1float mouseInputX = Input.GetAxis("Mouse X"); 2float mouseInputY = Input.GetAxis("Mouse Y"); 3これは特に変わらないです

C#

1 roteuler = new Vector3(Mathf.Clamp(roteuler.x - mouseInputY, -80, 80), roteuler.y + mouseInputX, 0f); 2transform.localEulerAngles = roteuler; 3 4roteulerには、Startの時点でオブジェクトのlocalEulerAngles.xとyが入ってるので 5それを操作 6XにはMathf.Clamp(roteuler.xにmouseInputYを引くが、-80から80までに制限) 7Yにはroteuler.yにmouseinputxを足す; 8Zには回転させないために0f; 9 10そして、オブジェクトlocaleuleranglesをroteulerと同じにする

でもこれだと回転スピードがちょっと遅いので

C#

1roteuler = new Vector3(Mathf.Clamp(roteuler.x - mouseInputY * Time.deltaTime * 200f, -80, 80), roteuler.y + mouseInputX * Time.deltaTime * 200f, 0f);

これでいいと思います

この場合-80と80に制限してますが、

C#

1public float minangle = -80; 2public float maxangle = 80; 3 4Vector3 roteuler; 5 6void Start () {

こうして、mathf.clamp内の-80と80をminangleとmaxangleに書き換えれば、
Inspectorからでも制限角度を変えれます

投稿2017/11/16 07:29

編集2017/11/16 08:41
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

hirokun9465

2017/11/16 09:05

自分で調べてたら、ずっと解決できなかったところを ドンピシャの回答で、実現する事ができました。 カメラの階層など思いつかなかったです。 ありがとうございます。 本当に助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問