メインカメラの挙動は以下参考にしました。ありがとうございました!
Unityの画面のアスペクト比と解像度を自動変換 全スマホ・複数解像度に対応させる
使い方
メインカメラにAspectKeeper.csとAspectKeeperSub.csをアタッチ。
AspectKeeperSub.csのSubCameraObjにサブカメラのゲームオブジェクトをアタッチ。
SetRectを好きな値に設定。
AspectKeeper.cs内のaspectVecを好きな大きさに変更・保存。
※AspectKeeper.csは任意のカメラにアタッチすることで、自動でaspectVecのアスペクト比に調整してくれます。
※各カメラにアスペクト比の値を一つ一つ入れるのが面倒だったので、一括で変更するようにしました。
AspectKeeperSub.csは変更点なし。
工夫点
画面の大きさが変わった時にのみ再読み込みするようにして、参照サイトより読み込み負荷を減らしています。
作者コメント
何か不備があれば教えてください。
コード
AspectKeeper.cs
[C#]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways]
public class AspectKeeper : MonoBehaviour
{
private Camera targetCamera;
private Vector2 aspectVec = new Vector2(800f, 440f);
private Vector2 saveScreen = Vector2.zero;
void Start()
{
targetCamera = this.GetComponent
}
void Update()
{
SetRect();
}
void SaveScreen()
{
saveScreen = new Vector2(Screen.width, Screen.height);
}
void SetRect()
{
if(saveScreen == new Vector2(Screen.width, Screen.height))
{
return;
}
// 保存
SaveScreen();
// データ取得
var screenAspect = Screen.width / (float)Screen.height; //画面のアスペクト比
var targetAspect = aspectVec.x / aspectVec.y; //目的のアスペクト比
var magRate = targetAspect / screenAspect; //目的アスペクト比にするための倍率
var viewportRect = new Rect(0, 0, 1, 1); //Viewport初期値でRectを作成
// 変換
if (magRate < 1)
{
viewportRect.width = magRate; //使用する横幅を変更
viewportRect.x = 0.5f - viewportRect.width * 0.5f;//中央寄せ
}
else
{
viewportRect.height = 1 / magRate; //使用する縦幅を変更
viewportRect.y = 0.5f - viewportRect.height * 0.5f;//中央寄せ
}
// set
targetCamera.rect = viewportRect; //カメラのViewportに適用
Debug.Log("SetRect");
}
}
[/C#]
AspectKeeperSub.cs
[C#]
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
[ExecuteAlways]
public class AspectKeeperSub : MonoBehaviour
{
public GameObject subCameraObj;
public Rect setRect = new Rect(0, 0, 1, 1);
private Camera targetCamera;
private Camera subCamera;
private Rect saveRect = Rect.zero;
void Start()
{
targetCamera = this.GetComponent
subCamera = subCameraObj.GetComponent
}
void Update()
{
SetRect();
}
void SaveScreen()
{
saveRect = targetCamera.rect;
}
void SetRect()
{
if(saveRect == targetCamera.rect)
{
return;
}
// 保存
SaveScreen();
// データ取得
Rect targetRect = targetCamera.rect;
Rect subRect = subCamera.rect;
// X
float baseX = setRect.x – 0.5f;
float corX = targetRect.width / 1f;
subRect.x = baseX * corX + 0.5f;
subRect.width = setRect.width * corX;
// Y
float baseY = setRect.y – 0.5f;
float corY = targetRect.height / 1f;
subRect.y = baseY * corY + 0.5f;
subRect.height = setRect.height * corY;
// set
subCamera.rect = subRect;
Debug.Log(“SetRectSub”);
}
}
[/C#]