前提・実現したいこと
■開発言語: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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/05 16:29
2020/06/06 05:12
2020/06/06 08:17