(Unity c#) 将画布贴图移动到相机当前水平的中心

问题描述 投票:0回答:0

我正在 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 有一个滚动矩形,地图在其上是一个子项,允许玩家移动地图,如下所示: MapScene

应该发生的是以下地图移动以尝试将地图负载居中的位置: Unity scene on PC

问题出在发生这种情况的平板电脑上(平板电脑视图的屏幕截图): Tablet Scene 如您所见,相机可以很好地调整纵横比大小并且一切正常,但水平并不像在 PC(和移动)案例中那样居中。

c# android unity3d 2d
© www.soinside.com 2019 - 2024. All rights reserved.