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

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

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

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

Unity

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

Q&A

1回答

2312閲覧

【Unity】画面の回転が90°毎にぴったり止まるように制限をつけたい

dragontown

総合スコア16

C#

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

Unity

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

0グッド

0クリップ

投稿2018/11/27 13:43

編集2018/12/02 12:58

前提・実現したいこと

Unityで、ピンチズームやスクロール機能をつけることができるAssetを購入して Main Cameraに貼ってあります。 その中の機能に「Enable Rotation」という項目があって、 これをオンにして作ると、指でスマホの画面を回転させることができるのですが、 任意の細かな角度にまで調節できてしまい、真横、真っすぐ縦に合わせるのが難しいので、 90°毎にピタリと合うように ̠315°~45°:0° 45°~135°:90° 135°~225°:180° 225°~315°:270° というような感じにしたいです。 スクリプトをどのように編集したらいいのか教えてください。 よろしくお願いします。

該当のソースコード

C#

1 2おそらくこの辺りの部分ではないかと思うのですが、 3違っていたら、どういう箇所で回転の角度などの挙動を決めているのか教えてください。 4 5 /// Helper method for rotating a boundary box. 6 /// </summary> 7 private void RotateBoundingBox(Vector2 min, Vector2 max, float rotationDegrees, out Vector2 resultMin, out Vector2 resultMax) { 8 Vector2 v0 = new Vector2(max.x, 0); 9 Vector2 v1 = new Vector2(0, max.y); 10 Vector2 v2 = new Vector2(min.x, 0); 11 Vector2 v3 = new Vector2(0, min.y); 12 Vector2 v0Rot = RotateVector2(v0, rotationDegrees); 13 Vector2 v1Rot = RotateVector2(v1, rotationDegrees); 14 Vector2 v2Rot = RotateVector2(v2, rotationDegrees); 15 Vector2 v3Rot = RotateVector2(v3, rotationDegrees); 16 resultMin = new Vector2(Mathf.Min(v0Rot.x, v1Rot.x, v2Rot.x, v3Rot.x), Mathf.Min(v0Rot.y, v1Rot.y, v2Rot.y, v3Rot.y)); 17 resultMax = new Vector2(Mathf.Max(v0Rot.x, v1Rot.x, v2Rot.x, v3Rot.x), Mathf.Max(v0Rot.y, v1Rot.y, v2Rot.y, v3Rot.y)); 18 } 19 20 21他に該当箇所かも知れない部分です。 22 23 if (Mathf.Approximately(mouseScrollDelta, 0) == false) { 24 if(isEditorInputRotate == true) { 25 if(EnableRotation == true) { 26 Vector3 rotationAxis = GetRotationAxis(); 27 Vector3 intersectionScreenCenter = GetIntersectionPoint(Cam.ScreenPointToRay(Input.mousePosition)); 28 Transform.RotateAround(intersectionScreenCenter, rotationAxis, mouseScrollDelta * 100); 29 ComputeCamBoundaries(); 30 } 31 } else if(isEditorInputTilt == true) { 32 if(EnableTilt == true) { 33 UpdateCameraTilt(mouseScrollDelta * 100); 34 } 35 } else { 36 float editorZoomFactor = 15; 37 if (Cam.orthographic) { 38 editorZoomFactor = 15; 39 } else { 40 if (IsTranslationZoom) { 41 editorZoomFactor = 30; 42 } else { 43 editorZoomFactor = 100; 44 } 45 } 46 float zoomAmount = mouseScrollDelta * editorZoomFactor; 47 float camSizeDiff = DoEditorCameraZoom(zoomAmount); 48 Vector3 intersectionScreenCenter = GetIntersectionPoint(Cam.ScreenPointToRay(new Vector3(Screen.width * 0.5f, Screen.height * 0.5f, 0))); 49 Vector3 pinchFocusVector = GetIntersectionPoint(Cam.ScreenPointToRay(Input.mousePosition)) - intersectionScreenCenter; 50 float multiplier = (1.0f / CamZoom * camSizeDiff); 51 Transform.position += pinchFocusVector * multiplier; 52 } 53 } 54

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

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

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

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

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

guest

回答1

0

関数の冒頭で、以下のコードを入れてみてください
rotationDegrees = 90

もしそれで90度の回転で固定されるのなら、こんな感じで行けそうです
if (rotationDegrees < 45 || 315f <= rotationDegrees) rotationDegrees = 0;

投稿2018/11/28 04:51

izmktr

総合スコア2856

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

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

dragontown

2018/12/01 12:04

回答ありがとうございます。 返信が遅れ申し訳ありません。 rotationDegrees = 90; を Vector2 v0 = new Vector2(max.x, 0); の上に入れてみたのですが、90°固定になりませんでした。 関数の冒頭というのはここではないのでしょうか?
izmktr

2018/12/02 03:01

もしそれで何も起きないのだとしたら、この辺りと思った関数が違うんだと思います
dragontown

2018/12/02 03:56

なるほど 通常、画面を回転できるようにするためのスクリプトを作る場合、 角度を決めるのは、rotationDegrees以外にどんなキーワードが使われるのでしょうか?
izmktr

2018/12/02 14:48

キーワードは作者が気分で決めるから、kakudoとかthetaとかもあるのでなんとも言えないです 今回だと、EnableRotation が true かのif文のあたりから攻めるべきでしょう 具体的には、GetRotationAxisが気になる関数なので、まずはDebug.Logでこの返り値を表示してみて、 あとはこの変数をうまく騙せば行けそうな感じがします
dragontown

2018/12/03 11:49

ありがとうございます GetRotationAxisの辺りで試してみようと思います
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問