RのWeb制作

Webサービス制作のための技術情報を。データ分析(Python、機械学習コンペ他)や自作野球ゲームMeisyoのこと中心。

Unity(C#)

【Unity(C#)】メインカメラの挙動に合わせて、サブカメラもアスペクト比に合わせて伸縮させる

投稿日:2023年9月1日 更新日:

メインカメラの挙動は以下参考にしました。ありがとうございました!
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#]

-Unity(C#)

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Xcode13以降で起こる「info.plistが見えない」「作成できない」不具合に対応する

なぜかinfo.plistが見えない問題があるので、備忘として書き残しておく。 (1)プロジェクトのxcodeprojectファイルをXcodeで開く (2)該当Project選択 (3)TARGET …

Unity 2022.3.18f1 エラー「FSBTool ERROR: Internal error from FMOD sub-system.」の対策

FSBTool ERROR: Internal error from FMOD sub-system.と出て、音声ファイルを読み込めない時の対策です。 今回起こったのはMP3ファイルだったので、ファイ …

C# 最適化による読み込み速度向上実験

ゲーム 監督たちの甲子園(仮)で、オーダー設定を作っています。 ただ、動作がクソ重いので最適化でどれくらい重いのか、最適化するとどうなるのか比較したいと思います。 動作イメージは下記の通りです。 動画 …

「1人で遊べる最もシンプルな脳活ゲーム NEXT CARD」制作しました

皆さま、お疲れ様です( ^o^) だいぶ更新間隔が空きましたが、いかがお過ごしでしょうか。 ゲーム紹介 今回はMeisyoとは異なる別の制作物を作っていました。 珍しくトランプカードゲームです。 1人 …

C#(Unity) 2D障害物ゲームのマップをインスペクタから作成・設定する例

知りたい方がいらっしゃったので書いてみました。 インスペクタから設定できると、データベース不要で簡単に複数マップを作成・管理できるところが良いところだと思います。 設定ファイルの作成 MapSetti …