Unity 3D-从其他类获取Screen.width失败



我在Unity 3D中有两个类。

第一类与场景相关联。

public class MyScene : MonoBehaviour {
  private Rect frame1Rect;
  public Texture storyFrame1;
  void Start() {
    frame1Rect = new Rect(0, 0, storyFrame1.width * UIManager.SW, storyFrame1.height * UIManager.SH);
  }
}

和一个实用程序类:

public class UIManager {
    public static float SW {
        get { return Screen.width / 1080; }
    }
    public static float SH {
        get { return Screen.height / 1920; }
    }
}

Rect变为(0, 0, 0, 0)

如果我将frame1Rect线路替换为:

frame1Rect = new Rect(0, 0, storyFrame1.width * Screen.width / 1080, Screen.height * storyFrame1.height / 1920);

它又起作用了。无法从UIManager中获得SW的值的原因是什么?

我敢打赌你在这里得到的是整数除法。

CCD_ 6(和CCD_ 7)是CCD_。与Texture.width相同。

UIManager.SW属性中,您有以下表达式:

return Screen.width / 1080;

现在,Screen.width很可能在1080ish左右。对于整数除法,它将截断,然后将其转换为float返回。例如,如果Screen.width540,则不会返回0.5,而是返回0。如果Screen.width1,620,则不会返回1.5,而是返回1

在您的非UIManager代码中,您可以使用以下表达式:

storyFrame1.width * Screen.width / 1080

这仍然使用整数除法,但storyFrame1.width * Screen.width的初始乘法将创建一个非常大的值(比如291600 / 1080),该值仍将截断,但提供了270的看似正确的值。

要解决此问题,您需要在除法之前将整数值强制转换为float

public class UIManager {
    public static float SW {
        get { return ((float)Screen.width) / 1080; }
    }
    public static float SH {
        get { return ((float)Screen.height) / 1920; }
    }
}

此外,顺便说一句,你确定你的宽度值应该除以1080还是应该是1920?(身高也是如此。看起来你的价值观可能会发生变化,但我不确定你在这里想要实现什么。)编辑:我看到你在使用肖像定向,没关系。

最新更新