Unity:如何使用 C# 使 Canvas UI 响应所有屏幕
Unity: How to make Canvas UI Responsive for all screens using C#
我是 Unity 新手。如何使 Canvas UI 像小屏幕对应小按钮和大屏幕对应大按钮一样响应。但是当我测试时,小屏幕上的小按钮很大,大屏幕上的大按钮很小。我只是想扭转这个,这样它就会有反应,有可能吗?
在 Canvas 中,您有一个 CanvasScaler
- 设置UI缩放模式->随屏幕尺寸缩放
- 输入基本分辨率(例如:1080x1920 适用于移动设备)并确保您的游戏 window 使用该分辨率
- 相应地设置匹配(例如:对于纵向分辨率,我使用 1)
在 Unity UI 中实现完全可扩展设计的诀窍是永远不要对任何东西使用像素大小。 Start 将所有 rects 完全展开(所有 sieds 上的边距为 0)并使用锚点(使用 alt 强制边距归零)按您的方式工作
我也可以推荐一个我写的小工具RectAnchorHelper。
如果您关注 link,
您可能会遇到 [exposemethodineditor] 依赖项的错误,只需将其注释掉,或下载整个 repo。我正在粘贴完整的 class 代码,下面删除了依赖项。
RectAnchorHelper 的作用是公开四个滑块,让您以完全成比例的方式调整您的位置,因此您可以在不参考像素大小的情况下设计您的UI。
等式的另一部分是使用 canvas 缩放器设置为 Scale with Screen Size,如 Rakib 所述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
[ExecuteInEditMode]
public class RectAnchorHelper : MonoBehaviour
{
RectTransform rect { get { if (_rect == null) _rect = GetComponent<RectTransform>(); return _rect; } }
RectTransform _rect;
[SerializeField] bool edit;
[SerializeField] bool _symmetricalXMode;
[SerializeField] bool _symmetricalYMode;
public bool symmetricalXMode { get { return _symmetricalXMode; } set { _symmetricalXMode = value; CheckAndSet(); } }
public bool symmetricalYMode { get { return _symmetricalYMode; } set { _symmetricalYMode = value; CheckAndSet(); } }
[Range(0, 1)]
[SerializeField] float _xAnchorMin;
[Range(0, 1)]
[SerializeField] float _xAnchorMax = 1;
[Range(0, 1)]
[SerializeField] float _yAnchorMin;
[Range(0, 1)]
[SerializeField] float _yAnchorMax = 1;
public float xAnchorMin { get { return _xAnchorMin; } set { _xAnchorMin = value; CheckAndSet(); } }
public float xAnchorMax { get { return _xAnchorMax; } set { _xAnchorMax = value; CheckAndSet(); } }
public float yAnchorMin { get { return _yAnchorMin; } set { _yAnchorMin = value; CheckAndSet(); } }
public float yAnchorMax { get { return _yAnchorMax; } set { _yAnchorMax = value; CheckAndSet(); } }
// [SerializeField] [HideInInspector] Vector2 offsetMin;
// [SerializeField] [HideInInspector] Vector2 offsetMax;
public void SetMargin(float f) { margin = f; }
[Range(-1, 15)]
[SerializeField] float _margin = -1;
public float margin { get { return _margin; } set { _margin = value; CheckAndSet(); } }
void CheckAndSet()
{
if (symmetricalXMode) _xAnchorMax = 1 - _xAnchorMin;
if (symmetricalYMode) _yAnchorMax = 1 - _yAnchorMin;
SetValues();
}
void Reset()
{
PrepareRect();
GetValues();
}
void OnValidate()
{
if (symmetricalXMode) xAnchorMax = 1 - xAnchorMin;
if (symmetricalYMode) yAnchorMax = 1 - yAnchorMin;
// if (Application.isPlaying) return;
#if UNITY_EDITOR
bool isSelected = false;
foreach (var s in Selection.gameObjects)
{
if (s == gameObject) isSelected = true;
}
if (!isSelected) { edit = false; return; }
Undo.RecordObject(rect, "RectAnchor");
#endif
if (edit)
{
SetValues();
}
else
GetValues();
}
void SetValues()
{
rect.anchorMin = new Vector2(xAnchorMin, yAnchorMin);
rect.anchorMax = new Vector2(xAnchorMax, yAnchorMax);
if (margin != -1)
{
rect.offsetMin = new Vector2(margin * margin, margin * margin);
rect.offsetMax = new Vector2(-(margin * margin), -(margin * margin));
}
}
void GetValues()
{
_xAnchorMin = rect.anchorMin.x;
_xAnchorMax = rect.anchorMax.x;
_yAnchorMin = rect.anchorMin.y;
_yAnchorMax = rect.anchorMax.y;
}
void PrepareRect()
{
rect.anchorMin = Vector2.zero;
rect.anchorMax = Vector2.one;
rect.offsetMax = Vector2.zero;
rect.offsetMin = Vector2.zero;
rect.localScale = Vector3.one;
}
}
当然,没有我的 class,您也可以完成这一切,但我个人发现输入浮点值相当乏味,上面的代码将为您提供滑块,使您可以轻松进行可视化编辑。
我是 Unity 新手。如何使 Canvas UI 像小屏幕对应小按钮和大屏幕对应大按钮一样响应。但是当我测试时,小屏幕上的小按钮很大,大屏幕上的大按钮很小。我只是想扭转这个,这样它就会有反应,有可能吗?
在 Canvas 中,您有一个 CanvasScaler
- 设置UI缩放模式->随屏幕尺寸缩放
- 输入基本分辨率(例如:1080x1920 适用于移动设备)并确保您的游戏 window 使用该分辨率
- 相应地设置匹配(例如:对于纵向分辨率,我使用 1)
在 Unity UI 中实现完全可扩展设计的诀窍是永远不要对任何东西使用像素大小。 Start 将所有 rects 完全展开(所有 sieds 上的边距为 0)并使用锚点(使用 alt 强制边距归零)按您的方式工作
我也可以推荐一个我写的小工具RectAnchorHelper。 如果您关注 link, 您可能会遇到 [exposemethodineditor] 依赖项的错误,只需将其注释掉,或下载整个 repo。我正在粘贴完整的 class 代码,下面删除了依赖项。
RectAnchorHelper 的作用是公开四个滑块,让您以完全成比例的方式调整您的位置,因此您可以在不参考像素大小的情况下设计您的UI。
等式的另一部分是使用 canvas 缩放器设置为 Scale with Screen Size,如 Rakib 所述
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
#if UNITY_EDITOR
using UnityEditor;
#endif
[ExecuteInEditMode]
public class RectAnchorHelper : MonoBehaviour
{
RectTransform rect { get { if (_rect == null) _rect = GetComponent<RectTransform>(); return _rect; } }
RectTransform _rect;
[SerializeField] bool edit;
[SerializeField] bool _symmetricalXMode;
[SerializeField] bool _symmetricalYMode;
public bool symmetricalXMode { get { return _symmetricalXMode; } set { _symmetricalXMode = value; CheckAndSet(); } }
public bool symmetricalYMode { get { return _symmetricalYMode; } set { _symmetricalYMode = value; CheckAndSet(); } }
[Range(0, 1)]
[SerializeField] float _xAnchorMin;
[Range(0, 1)]
[SerializeField] float _xAnchorMax = 1;
[Range(0, 1)]
[SerializeField] float _yAnchorMin;
[Range(0, 1)]
[SerializeField] float _yAnchorMax = 1;
public float xAnchorMin { get { return _xAnchorMin; } set { _xAnchorMin = value; CheckAndSet(); } }
public float xAnchorMax { get { return _xAnchorMax; } set { _xAnchorMax = value; CheckAndSet(); } }
public float yAnchorMin { get { return _yAnchorMin; } set { _yAnchorMin = value; CheckAndSet(); } }
public float yAnchorMax { get { return _yAnchorMax; } set { _yAnchorMax = value; CheckAndSet(); } }
// [SerializeField] [HideInInspector] Vector2 offsetMin;
// [SerializeField] [HideInInspector] Vector2 offsetMax;
public void SetMargin(float f) { margin = f; }
[Range(-1, 15)]
[SerializeField] float _margin = -1;
public float margin { get { return _margin; } set { _margin = value; CheckAndSet(); } }
void CheckAndSet()
{
if (symmetricalXMode) _xAnchorMax = 1 - _xAnchorMin;
if (symmetricalYMode) _yAnchorMax = 1 - _yAnchorMin;
SetValues();
}
void Reset()
{
PrepareRect();
GetValues();
}
void OnValidate()
{
if (symmetricalXMode) xAnchorMax = 1 - xAnchorMin;
if (symmetricalYMode) yAnchorMax = 1 - yAnchorMin;
// if (Application.isPlaying) return;
#if UNITY_EDITOR
bool isSelected = false;
foreach (var s in Selection.gameObjects)
{
if (s == gameObject) isSelected = true;
}
if (!isSelected) { edit = false; return; }
Undo.RecordObject(rect, "RectAnchor");
#endif
if (edit)
{
SetValues();
}
else
GetValues();
}
void SetValues()
{
rect.anchorMin = new Vector2(xAnchorMin, yAnchorMin);
rect.anchorMax = new Vector2(xAnchorMax, yAnchorMax);
if (margin != -1)
{
rect.offsetMin = new Vector2(margin * margin, margin * margin);
rect.offsetMax = new Vector2(-(margin * margin), -(margin * margin));
}
}
void GetValues()
{
_xAnchorMin = rect.anchorMin.x;
_xAnchorMax = rect.anchorMax.x;
_yAnchorMin = rect.anchorMin.y;
_yAnchorMax = rect.anchorMax.y;
}
void PrepareRect()
{
rect.anchorMin = Vector2.zero;
rect.anchorMax = Vector2.one;
rect.offsetMax = Vector2.zero;
rect.offsetMin = Vector2.zero;
rect.localScale = Vector3.one;
}
}
当然,没有我的 class,您也可以完成这一切,但我个人发现输入浮点值相当乏味,上面的代码将为您提供滑块,使您可以轻松进行可视化编辑。