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 件のコメント :
コメントを投稿