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

时间:2014-10-24 10:53:00

标签: c# unity3d

我在Unity 3D中有2个课程。

第一堂课与场景挂钩。

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);

再次有效。无法从SW获取UIManager的价值的原因是什么?

1 个答案:

答案 0 :(得分:1)

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

Screen.width(和height)是int。与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? (同样对于身高。看起来你的价值可能会被翻转,但我不确定你在这里想要实现的目标。)编辑:我看到你正在使用纵向,没关系。