[Unity] 画面の端の黒帯どうする?

UGIの余っている領域

下記の記事で画面内に収まるように、Canvasの設定なんかを簡単にできるようにしました。
今回は、その外側の余った領域に黒帯を表示するコンポーネントも作っているのでついでに紹介します。
csファイルは、下記記事のものを流用するので、忘れずに。


例えばこんな感じ

上の黒い帯が、今回のコンポーネントを適用した例です

シーンの構成

上下左右に、それぞれ設定して作ると、手あたり次第に黒帯で覆ってくれます。
"Image"で描画してるだけなので、別の色やスプライトを指定することもできます。


ソースコード

バグがあっても気にしない

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
namespace Chigusa
{
[ExecuteInEditMode]
[DisallowMultipleComponent]
[RequireComponent(typeof(RectTransform))]
public class CanvasMaskBar3 : MonoBehaviour
{
[Tooltip("帯を出す側")]
public SafeAreaHelper.Anchor anchor = SafeAreaHelper.Anchor.Left;
protected CanvasInSafeArea3 SafeArea3 { get; set; }
private void Awake()
{
SafeArea3 = GetComponentInParent<CanvasInSafeArea3>();
}
/// <summary>
/// Start、初期数フレームは安定しないのである程度まわす
/// </summary>
/// <returns>IEnumerator</returns>
IEnumerator Start()
{
for (int index = 0; index < 5; index++)
{
Setting();
yield return 0;
}
}
#if UNITY_EDITOR
/// <summary>
/// Editor用
/// </summary>
void LateUpdate()
{
if (!UnityEditor.EditorApplication.isPlaying)
Setting();
}
#endif
/// <summary>
/// 設定
/// </summary>
public void Setting()
{
var rectOffset = SafeArea3.GetOffsetArea();
var tempOffset = SafeArea3.safeOffset;
if (SafeArea3.safeHalfOffset)
tempOffset *= 0.5f;
var safeRectOffset = SafeArea3.GetSafeRectOffset(true);
safeRectOffset.left -= tempOffset.x;
safeRectOffset.right += tempOffset.x;
safeRectOffset.top -= tempOffset.y;
safeRectOffset.bottom += tempOffset.y;
rectOffset.left += safeRectOffset.left;
rectOffset.right += safeRectOffset.right;
rectOffset.top += safeRectOffset.top;
rectOffset.bottom += safeRectOffset.bottom;
rectOffset.left = Mathf.Max(0, rectOffset.left / SafeArea3.targetArea.localScale.x);
rectOffset.right = Mathf.Max(0, rectOffset.right / SafeArea3.targetArea.localScale.x);
rectOffset.top = Mathf.Max(0, rectOffset.top / SafeArea3.targetArea.localScale.y);
rectOffset.bottom = Mathf.Max(0, rectOffset.bottom / SafeArea3.targetArea.localScale.y);
var rect = GetComponent<RectTransform>();
var image = GetComponent<Image>();
rect.anchoredPosition = Vector2.zero;
switch (anchor)
{
case SafeAreaHelper.Anchor.Left:
rect.anchoredPosition = new Vector2(0.0f, -rectOffset.bottom);
rect.sizeDelta = new Vector2(rectOffset.left, rectOffset.Vertical);
rect.anchorMin = new Vector2(0.0f, 0.0f);
rect.anchorMax = new Vector2(0.0f, 1.0f);
rect.pivot = new Vector2(1.0f, 0.0f);
image.enabled = rectOffset.left >= 1;
break;
case SafeAreaHelper.Anchor.Right:
rect.anchoredPosition = new Vector2(0.0f, -rectOffset.bottom);
rect.sizeDelta = new Vector2(rectOffset.right, rectOffset.Vertical);
rect.anchorMin = new Vector2(1.0f, 0.0f);
rect.anchorMax = new Vector2(1.0f, 1.0f);
rect.pivot = new Vector2(0.0f, 0.0f);
image.enabled = rectOffset.right >= 1;
break;
case SafeAreaHelper.Anchor.Top:
rect.anchoredPosition = new Vector2(-rectOffset.left, 0.0f);
rect.sizeDelta = new Vector2(rectOffset.Horizontal, rectOffset.top);
rect.anchorMin = new Vector2(0.0f, 1.0f);
rect.anchorMax = new Vector2(1.0f, 1.0f);
rect.pivot = new Vector2(0.0f, 0.0f);
image.enabled = rectOffset.top >= 1;
break;
case SafeAreaHelper.Anchor.Bottom:
rect.anchoredPosition = new Vector2(-rectOffset.left, 0.0f);
rect.sizeDelta = new Vector2(rectOffset.Horizontal, rectOffset.bottom);
rect.anchorMin = new Vector2(0.0f, 0.0f);
rect.anchorMax = new Vector2(1.0f, 0.0f);
rect.pivot = new Vector2(0.0f, 1.0f);
image.enabled = rectOffset.bottom >= 1;
break;
}
}
}
}

0 件のコメント :

コメントを投稿