Unity3D canvas 不同宽高比的缩放器
Unity3D canvas scaler for different aspect ratios
在 Unity 中,我正在尝试为 android 和 ios 平台构建手机游戏。
在发布游戏之前,我一直在尝试一些不同的屏幕分辨率以进行测试。
我已经使用代码解决了分辨率问题,
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class ControllingCameraAspectScript : MonoBehaviour
{
public float sceneWidth = 21f;
float targetaspect = 16.0f / 9.0f;
float windowaspect = (float)Screen.width / (float)Screen.height;
Camera camera;
public Vector2 targetAspect = new Vector2(16, 9);
void Start()
{
camera = GetComponent<Camera>();
UpdateCrop();
}
public void UpdateCrop()
{
// Determine ratios of screen/window & target, respectively.
float screenRatio = Screen.width / (float)Screen.height;
float targetRatio = targetAspect.x / targetAspect.y;
if (Mathf.Approximately(screenRatio, targetRatio))
{
// Screen or window is the target aspect ratio: use the whole area.
camera.rect = new Rect(0, 0, 1, 1);
}
else if (screenRatio > targetRatio)
{
// Screen or window is wider than the target: pillarbox.
float normalizedWidth = targetRatio / screenRatio;
float barThickness = (1f - normalizedWidth) / 2f;
camera.rect = new Rect(barThickness, 0, normalizedWidth, 1);
}
else
{
// Screen or window is narrower than the target: letterbox.
float normalizedHeight = screenRatio / targetRatio;
float barThickness = (1f - normalizedHeight) / 2f;
camera.rect = new Rect(0, barThickness, 1, normalizedHeight);
}
}
}
此代码在 aspect ratios 低于 2.0 的情况下运行良好。 (16/9、16/10、5/4 等)。
当涉及到屏幕分辨率(例如 3200x1440)时,即使关卡似乎被精细地截断以匹配视图,canvas 确实会从屏幕上掉下来,如下面的屏幕截图所示。
宽高比:16/9(1280x768 的结果相同)
屏幕分辨率 3200x1440 (Aspect ratios above 2.0)
Canvas 设置
有人知道这里的问题吗?任何建议将不胜感激。
我找到了解决这个问题的好办法。
Letterboxer 可以轻松地自动为该游戏摄像机的视图添加信箱、柱形框或像素完美视图缩放。它还会在编辑模式下更新,以在游戏视图中实时预览信箱效果。
用法 -
将 Letterboxer 组件添加到您的 Camera GameObject。如果 GameObject 上不存在 Camera 组件,则会添加一个。
更改目标宽度和目标高度选项以满足您的需要。这些将用于确定保持纵横比模式的纵横比或最佳像素完美适合模式的基本尺寸。
设置类型选项,这两个选项将在下面进行更详细的描述。
在 Unity 中,我正在尝试为 android 和 ios 平台构建手机游戏。 在发布游戏之前,我一直在尝试一些不同的屏幕分辨率以进行测试。 我已经使用代码解决了分辨率问题,
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
public class ControllingCameraAspectScript : MonoBehaviour
{
public float sceneWidth = 21f;
float targetaspect = 16.0f / 9.0f;
float windowaspect = (float)Screen.width / (float)Screen.height;
Camera camera;
public Vector2 targetAspect = new Vector2(16, 9);
void Start()
{
camera = GetComponent<Camera>();
UpdateCrop();
}
public void UpdateCrop()
{
// Determine ratios of screen/window & target, respectively.
float screenRatio = Screen.width / (float)Screen.height;
float targetRatio = targetAspect.x / targetAspect.y;
if (Mathf.Approximately(screenRatio, targetRatio))
{
// Screen or window is the target aspect ratio: use the whole area.
camera.rect = new Rect(0, 0, 1, 1);
}
else if (screenRatio > targetRatio)
{
// Screen or window is wider than the target: pillarbox.
float normalizedWidth = targetRatio / screenRatio;
float barThickness = (1f - normalizedWidth) / 2f;
camera.rect = new Rect(barThickness, 0, normalizedWidth, 1);
}
else
{
// Screen or window is narrower than the target: letterbox.
float normalizedHeight = screenRatio / targetRatio;
float barThickness = (1f - normalizedHeight) / 2f;
camera.rect = new Rect(0, barThickness, 1, normalizedHeight);
}
}
}
此代码在 aspect ratios 低于 2.0 的情况下运行良好。 (16/9、16/10、5/4 等)。 当涉及到屏幕分辨率(例如 3200x1440)时,即使关卡似乎被精细地截断以匹配视图,canvas 确实会从屏幕上掉下来,如下面的屏幕截图所示。
宽高比:16/9(1280x768 的结果相同)
屏幕分辨率 3200x1440 (Aspect ratios above 2.0)
Canvas 设置
有人知道这里的问题吗?任何建议将不胜感激。
我找到了解决这个问题的好办法。
Letterboxer 可以轻松地自动为该游戏摄像机的视图添加信箱、柱形框或像素完美视图缩放。它还会在编辑模式下更新,以在游戏视图中实时预览信箱效果。
用法 -
将 Letterboxer 组件添加到您的 Camera GameObject。如果 GameObject 上不存在 Camera 组件,则会添加一个。
更改目标宽度和目标高度选项以满足您的需要。这些将用于确定保持纵横比模式的纵横比或最佳像素完美适合模式的基本尺寸。
设置类型选项,这两个选项将在下面进行更详细的描述。