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

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

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

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

Unity

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

解決済

【Unity】カメラ描画位置をrect(x,y,width,height)指定しているスクリプトの解説をお願いしたいです

unity_level1
unity_level1

総合スコア8

C#

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

Unity

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

2回答

0リアクション

0クリップ

6089閲覧

投稿2020/06/03 11:29

前提・実現したいこと

■開発言語:C#
■開発ツール:Unity 2019 3.7f
■参照ブログ:https://pengoya.net/unity/aspect/
■実現したいこと
・本スクリプトの理解
・rect(x,y,width,height)の使い方についてしっかりと理解

■スクリプトの内容
スマホの機種などで、アスペクト比が変化した際にも、指定しておいたアスペクト比の範囲は固定します

■現状の認識

Unityリファレンスを確認すると、Rect (float x, float y, float width, float height);と記載があり
位置と大きさから矩形を作成する関数という認識をしております。

矩形を作成する基準点x
矩形を作成する基準点y

上記で矩形の配置される位置(x,y)座標を決め、その後、

矩形の幅width (右横へ広げる)
矩形の高さheight (左横へ広げる)

を指定し、矩形の大きさを決めるというところまでは確認しております。

しかし、私のrectの理解がちんぷんかんぷんのため、スクリプトを理解できておりません。

スクリプトの下記部分

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

①float bgScale = height / Screen.height;
②float camWidth = width / (Screen.width * bgScale);
③cam.rect = new Rect((1f - camWidth)/2f, 0f, camWidth, 1f);

ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

上記では、
①固定の高さ/現在の高さ=固定の高さと現在の高さの差分の比率(aとする)
②固定の幅/現在の幅×a=高さがaのときの幅の比率

という理解をしたとき、

・質問1
③のcam.rect = new Rect((1f - camWidth)/2f, 0f, camWidth, 1f);で
『(1f - camWidth)/2f』として、x座標を出しているのですが、なぜこのような式になるのでしょうか?
1fとは?
なぜ1f‐camWidthなのか
なぜ1f‐camWidthを2fで除算するのか

・質問2
第二引数の0fはなぜ0fになるでしょうか

・質問3
第三引数のcamWidthは高さがaのときの幅を比率として取っている認識で良いのでしょうか?

・質問4
質問3の認識が正しい場合、なぜこの値はbgScale (幅aに対する高さ)にならないのでしょうか?

Unity上の挙動としては、アスペクト比を変化させても問題なく描画されております。

上記質問につきまして、うまく質問がまとめられず申し訳ございませんが、ご教示のほどよろしくお願いします。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

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

public class camera2 : MonoBehaviour
{

private Camera cam; // 固定したい表示サイズ [SerializeField] private float width = 16f, height = 9f; // 画像のPixel Per Unit [SerializeField] private float pixelPerUnit = 100f; void Start() { float aspect = (float)Screen.height / (float)Screen.width; //表示画面(現在)のアスペクト比 float bgAcpect = height / width; //理想とするアスペクト比 Debug.Log(aspect); Debug.Log(bgAcpect); // カメラコンポーネントを取得します cam = GetComponent<Camera>(); // カメラのorthographicSizeを設定 cam.orthographicSize = (height / 2f / pixelPerUnit); if (bgAcpect > aspect) { float bgScale = height / Screen.height; // viewport rectの幅 float camWidth = width / (Screen.width * bgScale); // viewportRectを設定 cam.rect = new Rect((1f - camWidth)/2f, 0f, camWidth, 1f); Debug.Log(cam.rect); } else { float bgScale = aspect / bgAcpect; Debug.Log(bgScale); // カメラのorthographicSizeを縦の長さに合わせて設定しなおす cam.orthographicSize *= bgScale; Debug.Log(cam.orthographicSize); // viewportRectを設定 cam.rect = new Rect(0f, 0f, 1f, 1f); } } // Start is called before the first frame update void Awake() { } // Update is called once per frame void Update() { }

}

試したこと

Rect (float x, float y, float width, float height)

上記の座標を変更させると、配置されたオブジェクトが半分だけ表示されたりすることは確認しました。
また、float width, float heightが1.0f以上になるとGameビューに移される範囲が変わらず、
0.5などにすると半分の値になることを確認しました。
※ここから、float width, float heightは比率1fがMAXの値になるのかなという予想はしております。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

以下のような質問にはリアクションをつけましょう

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

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

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

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

適切な質問に修正を依頼しましょう。

まだ回答がついていません

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

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

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

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

C#

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

Unity

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