我在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
的价值的原因是什么?
答案 0 :(得分:1)
我敢打赌你在这里得到整数除法。
Screen.width
(和height
)是int
。与Texture.width
相同。
在UIManager.SW
属性中,您有以下表达式:
return Screen.width / 1080;
现在,最有可能Screen.width
处于或接近1080ish。使用整数除法,将截断并在将其转换为float
之前返回。例如,如果Screen.width
为540
,则不会返回0.5
,您将返回0
。如果Screen.width
为1,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
? (同样对于身高。看起来你的价值可能会被翻转,但我不确定你在这里想要实现的目标。)