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

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

関連記事

UnityでiOS版をリリースする際に、Firebaseを使っていると起こるビルドエラー「Undefined symbols for architecture arm64」への対応

起こること 「Undefined symbols for architecture arm64」がでて、XCodeのビルドができない。 原因と対策 Firebase等がインストールできていない。 Fi …

Unity IAP(In App Purchase):消耗型編の覚え書き

この記事はUnity IAP完全攻略への道:消耗型編(+コンビニ決済)を掘り下げた記事です この記事では、基本的な処理は書かれているものの初心者にはわかりづらい点があります。 問題1・IAPクラスをど …

Unity スタンドアロンアプリ(PC版)でFirebaseが動かない不具合の対応

「原因がわからなくて詰んでる」みたいな状態になったバグがありましたので共有します。 参考:[Crash] Firebase crashes on some Windows machines #1284 …

UnityでiOS版をリリースする際に、FirebaseとXCode16を組み合わせると起こるビルドエラー「unsupported option ‘-G’ for target ‘arm64-apple-iosXX.X’」への対応

はじめに こちらのポストがワイにも役に立ったので、「実際どうするの?」ということも含めて書いておこうと思う。 Unity + firebase x Xcode16で、こんなエラーunsupported …

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

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