unityにてゲーム開発をしております。
動画を組み込んでおり、動画のサイズを1242×2688で作成しており
他の背景画像も同じ1242×2688で作成をしております。
アプリの下部にバナー広告を実装しようとしており、
サイトを参考にスクリプトを作成し、1242×2688を基準にリサイズ(1242×2208等)を試みましたが、縦の比率は固定で反映されるのですが
背景の横の部分が黒くなってしまいます。
黒い部分をなくし、他のサイズでも同じ画角での実装をするにはどのようにしたらできるのでしょうか。
アドバイスをいただけますと幸いです。
現在1242x2688で組み込みを行い、1242x2208にすると縦の大きさは1242x2688の比率でサイズが調整がされるのですが、左右の部分が黒くなってしまいます。
(Unityのデフォルトだと青だと思います。)
理想は1242x2688のサイズの配置を黒い部分なく、縦横の比率を変えずに1242x2208の画面内におさめたいです。
カメラにアタッチ
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[ExecuteInEditMode()] 6[RequireComponent(typeof(Camera))] 7public class CameraStableAspect : MonoBehaviour 8{ 9 [SerializeField] 10 Camera refCamera; 11 12 [SerializeField] 13 int width = 1242; 14 15 [SerializeField] 16 int height = 2688; 17 18 [SerializeField] 19 float pixelPerUnit = 100f; 20 21 22 int m_width = -1; 23 int m_height = -1; 24 25 void Awake() 26 { 27 if (refCamera == null) 28 { 29 refCamera = GetComponent<Camera>(); 30 } 31 UpdateCamera(); 32 } 33 34 private void Update() 35 { 36 UpdateCameraWithCheck(); 37 } 38 39 void UpdateCameraWithCheck() 40 { 41 if (m_width == Screen.width && m_height == Screen.height) 42 { 43 return; 44 } 45 UpdateCamera(); 46 } 47 48 void UpdateCamera() 49 { 50 float screen_w = (float)Screen.width; 51 float screen_h = (float)Screen.height; 52 float target_w = (float)width; 53 float target_h = (float)height; 54 55 //アスペクト比 56 float aspect = screen_w / screen_h; 57 float targetAcpect = target_w / target_h; 58 float orthographicSize = (target_h / 2f / pixelPerUnit); 59 60 //縦に長い 61 if (aspect < targetAcpect) 62 { 63 float bgScale_w = target_w / screen_w; 64 float camHeight = target_h / (screen_h * bgScale_w); 65 refCamera.rect = new Rect(0f, (1f - camHeight) * 0.5f, 1f, camHeight); 66 } 67 // 横に長い 68 else 69 { 70 // カメラのorthographicSizeを横の長さに合わせて設定しなおす 71 float bgScale = aspect / targetAcpect; 72 orthographicSize *= bgScale; 73 74 float bgScale_h = target_h / screen_h; 75 float camWidth = target_w / (screen_w * bgScale_h); 76 refCamera.rect = new Rect((1f - camWidth) * 0.5f, 0f, camWidth, 1f); 77 } 78 79 refCamera.orthographicSize = orthographicSize; 80 81 m_width = Screen.width; 82 m_height = Screen.height; 83 } 84}
Panaleを作成しアタッチ
C#
1using System.Collections; 2using System.Collections.Generic; 3using UnityEngine; 4 5[ExecuteInEditMode()] 6public class RectScalerWithViewport : MonoBehaviour 7{ 8 [SerializeField] 9 RectTransform refRect = null; 10 11 [SerializeField] 12 Vector2 referenceResolution = new Vector2(1242, 2688); 13 14 [Range(0, 1)] 15 [SerializeField] float matchWidthOrHeight = 0; 16 17 float m_width = -1; 18 float m_height = -1; 19 20 private const float kLogBase = 2; 21 22 private void Awake() 23 { 24 if (refRect == null) 25 { 26 refRect = GetComponent<RectTransform>(); 27 } 28 UpdateRect(); 29 } 30 31 private void Update() 32 { 33 UpdateRectWithCheck(); 34 } 35 36 private void OnValidate() 37 { 38 UpdateRect(); 39 } 40 41 void UpdateRectWithCheck() 42 { 43 Camera cam = Camera.main; 44 float width = cam.rect.width * Screen.width; 45 float height = cam.rect.height * Screen.height; 46 if (m_width == width && m_height == height) 47 { 48 return; 49 } 50 UpdateRect(); 51 } 52 53 void UpdateRect() 54 { 55 Camera cam = Camera.main; 56 float width = cam.rect.width * Screen.width; 57 float height = cam.rect.height * Screen.height; 58 m_width = width; 59 m_height = height; 60 61 // canvas scalerから引用 62 float logWidth = Mathf.Log(width / referenceResolution.x, kLogBase); 63 float logHeight = Mathf.Log(height / referenceResolution.y, kLogBase); 64 float logWeightedAverage = Mathf.Lerp(logWidth, logHeight, matchWidthOrHeight); 65 float scale = Mathf.Pow(kLogBase, logWeightedAverage); 66 67 refRect.localScale = new Vector3(scale, scale, scale); 68 69 // スケールで縮まるので領域だけ広げる 70 float revScale = 1f / scale; 71 refRect.sizeDelta = new Vector2(m_width * revScale, m_height * revScale); 72 } 73}