用UGUI开发项目Canvas的适配一般都会选择Scale With Screen Size 模式

1.适配方案

竖屏游戏,一般会根据宽进行适配

横屏游戏,根据高适配

PADDLEOCR gpu比cpu快多少 ipad gpu_偏移量


上面是我横屏游戏的适配属性。

2.各种分辨率

游戏开发时会有一个基础的设计分辨率,比如上面的游戏,设计分辨率即为 1080 * 1920
但在游戏实际运行时会遇到各种各样不同的分辨率
以12.9英寸iPad Pro为例,屏幕分辨率2048*2732
当游戏以Ipad分辨率运行时,会发生适配,由于竖屏游戏按照宽来适配,因此发生适配后UI大小进行计算时,宽不会改变,仍旧为1080,iPad的高为宽的 2732/2048 = 1.334倍,因此换算后的高为
1080X1.334 = 1440
iPad的最终换算分辨率1080 * 1440 (小数部分已略去)

屏幕坐标左下角为(0,0)点,右上角为(Screen.Width,Screen.Height)点。

3.从UI偏移量到屏幕坐标偏移量

PADDLEOCR gpu比cpu快多少 ipad gpu_ui_02


当我点击A时,A会播放动画,使自身的本地坐标向上偏移200单位到B

我希望实际计算也以B点进行计算。

我利用Unity提供的IPointerDownHandler接口获取到的是屏幕坐标

public void OnPointerDown(PointerEventData eventData) {
        this.eventData = eventData;
    }

现在我点击了屏幕上的A点,获得是屏幕A点的屏幕坐标假定为(100,100);

那么如何计算出B点的屏幕坐标

PADDLEOCR gpu比cpu快多少 ipad gpu_ipad_03


UI物体的本地坐标向上偏移200单位,其实是在换算分辨率里向上移动了200单位,屏幕分辨率和换算分辨率是同比扩大的关系,因此在屏幕分辨率中就需要向上移动 2048/1080 * 200 = 379个单位。

B点的屏幕坐标即为(100,100 + 379)= (100,479)

最后我们会得到一个非常简单的公式
如果按照宽进行适配

public float GetOffset() {
        //设计UI偏移量(Y值偏移)
        float designOffsetY = 200;
        //游戏设计分辨率的宽
        float designWidth = 1080;
        //计算出的屏幕坐标的Y值偏移量
        float screenOffsetY = Screen.width / designWidth * designOffsetY;
        return screenOffsetY;
    }

按照高适配也是同理

public float GetOffset()
    {
        //设计UI偏移量(Y值偏移)
        float designOffsetY = 200;
        //游戏设计分辨率的高
        float designHeight = 1920;
        //计算出的屏幕坐标的Y值偏移量
        float screenOffsetY = Screen.height / designHeight * designOffsetY;
        return screenOffsetY;
    }