我正在 Unity 上制作 2D 安卓游戏。在世界地图(关卡选择)设置中,我有一个相机可以改变形状以适应屏幕上最大可能的 9:16 纵横比,调用 Awake。接下来我有一个 Start() 函数,它应该在画布上移动地图,以便最后单击的级别到达屏幕的中心。它似乎在 Unity 本身和我的手机上运行良好;但是,它以我选项卡上的错误位置为中心。我觉得这可能与 Canvas 缩放器屏幕匹配模式有关,但我不确定问题到底出在哪里。
相机纵横比设置的代码是:
void Awake() {
CamAspect();
}
public void CamAspect() {
float targetaspect = 9f / 16f;
float windowaspect = (float)Screen.width / (float)Screen.height;
float scaleheight = windowaspect / targetaspect;
Camera camera = GetComponent<Camera>();
if (scaleheight < 1f) {
Rect rect = camera.rect;
rect.width = 1f;
rect.height = scaleheight;
rect.x = 0;
rect.y = (1f - scaleheight) / 2f;
camera.rect = rect;
} else {
float scalewidth = 1f / scaleheight;
Rect rect = camera.rect;
rect.width = scalewidth;
rect.height = 1f;
rect.x = (1f - scalewidth) / 2f;
rect.y = 0;
camera.rect = rect;
}
}
地图居中的代码是(都在画布里面)。画布设置为: 渲染模式:屏幕空间 - 相机 UI 缩放模式:随屏幕尺寸缩放,屏幕匹配模式收缩(匹配宽度/高度为 0.5 似乎也适用于 PC 自由纵横比视图)。 下面的 lastLevelT 给出了地图左下角的位置,该级别是子级别。 地图依次定位在地图持有者的中心(滚动启用父级)。中心计算是在考虑这些的情况下完成的。
RectTransform RT;
float[] lastLevelT;
float cameraScreenWidth;
float cameraScreenHeight;
// map is 4096 wide by 3072 tall
float shiftx;
float shifty;
float mapwidth;
float mapheight;
new Camera camera;
void Start() {
RT = GetComponent<RectTransform>();
camera = Camera.main;
lastLevelT = SettingsManager.currentFocusLevelTransform;
if (lastLevelT[0] == 0 && lastLevelT[1] == 0) {
cameraScreenHeight = (float)camera.pixelHeight;
cameraScreenWidth = (float)camera.pixelWidth;
RT.localPosition = new Vector2(-cameraScreenWidth * 0.5f, -cameraScreenHeight * 0.5f);
} else {
Transform();
}
}
void Transform() {
mapwidth = RT.rect.width;
mapheight = RT.rect.height;
cameraScreenHeight = (float)camera.pixelHeight;
cameraScreenWidth = (float)camera.pixelWidth;
shiftx = lastLevelT[0];
shifty = lastLevelT[1];
if ((mapwidth - lastLevelT[0]) < (cameraScreenWidth * 0.5f)) {
shiftx = mapwidth - cameraScreenWidth * 0.5f;
}
if (lastLevelT[0] < (cameraScreenWidth * 0.5f)) {
shiftx = cameraScreenWidth * 0.5f;
}
if ((mapheight - lastLevelT[1]) < (cameraScreenHeight * 0.5f)) {
shifty = mapheight - cameraScreenHeight * 0.5f;
}
if (lastLevelT[1] < (cameraScreenHeight * 0.5f)) {
shifty = cameraScreenHeight * 0.5f;
}
RT.localPosition = new Vector2(-shiftx, -shifty);
}
mapHolder 有一个滚动矩形,地图在其上是一个子项,允许玩家移动地图,如下所示:
问题出在发生这种情况的平板电脑上(平板电脑视图的屏幕截图): 如您所见,相机可以很好地调整纵横比大小并且一切正常,但水平并不像在 PC(和移动)案例中那样居中。