Unity启动界面的启动方式
Unity启动界面的启动方式包含 Splash Screen 和Static Splash Image 方式。
1.Splash Screen 表现为Unity包启动时会出现2s左右的Unity图标(默认方式)
2.Static Splash Image 表现为Unity包启动时候出现一张自定义的静态图片
注意:1和2能同时使用。顺序为先出2再出1;
如果仅仅使用 Static Splash Image 的方式作为启动方式。一般会搭配一个Launch场景一起使用。具体方式为Launch场景中放置一张和Static Splash Image一样的图片。这里需要注意的是图片的切换问题。
Static Splash Image 中有三种Scaling方式:
(1)Center (only scale down) :居中(只是缩小),以正确的像素显示图片,不会缩放图片除非需要。
(2)Scale to fit (letter-boxed):自适应缩放大小(高宽比不变)尝试满屏显示,但不会裁剪,并用黑色填充空白的地方。
(3)Scale to fill (cropped):自适应填充(裁切不正的)满屏显示,屏幕外的部分将不显示
一般我们选第三种。这三种方式的区别,如果图比较大,前两种是没什么区别的,但是当换成比较小的图时就可以看出三种方式的区别了:
Center (only scale down) ,只是缩小,不会放大(注意此种方式,当你图片非常大,但是比例和屏幕比例不一致时,会保持原图长宽比不变进行简单地缩小,直到屏幕能显示图片所有内容为止,所以也会出现黑边)
Scale to fit (letter-boxed),这种情况下只要比例不合,无论图片过小还是过大,都会尝试等比例缩小或扩大图片,以显示图片全部内容,并保持图片的长或宽充满屏幕。
Scale to fill (cropped),当图片过大,等比例缩小直到图片的长和宽之中有一个和屏幕正好相等。当图片过小,则等比例拉伸直到没有黑边。
想详细了解可以看该链接
当使用static Splash Image 并且使用 Scale to fill (cropped)
此时需要Launch场景中的图片自适应方式和启动界面自适应方式一致,才不会穿帮。(当然如果是纯黑色图就当我没说)
这里没有使用UGUI 或者NGUI的原生适配方案(没有找到合适的,如果有会的同学也可以告知一下)。使用的方式为图片不变,变化Camera的Size(一般照射UI的Camera都会设置为正交相机,size为正交相机下才会有的属性);
基础方案有了,现在需要了解下Size和图片像素之前的关联:
1.正交相机的Size,单位为 Unity 单位,代表了相机在纵向上一半的显示范围。如果Size为5,那就意味着相机在纵向上可以显示10个Unity单位。
正交相机的Size不会随着分辨率变化为变化。而摄像机横向的显示范围(WidthSize)是会发生变化的。可以通过以下公式获得
(float)Screen.width / Screen.height = WidthSize / HeightSize;
WidthSize = HeightSize * (float)Screen.width / Screen.height;
2.图片像素转换为Unity单位:取决与在导入素材时"Pixels To Units"这一属性的值,在默认情况下这个睡醒的数值为100,也就是100个像素等于1个Unity单位
3.综合以上知识点。在分辨率变化的时候,可以通过动态的修改Camera的Size来保证图片适配方式与Scale to fill (cropped) 相同:图片的size以及Pixels To Units已知,分辨率的宽高已知,可以求出 图片Height需要的HeightSize,以及图片Width需要的WidthToHeightSize。两者取小值minSize。 Camera.main.orthographicSize = minSize/ 2
以下为实例代码:
public class EnterMain : MonoBehaviour
{
public SpriteRenderer render;
private float pixelPerUnit = 100;//像素转换为Unity单位的比例
float width; //图片宽(像素)
float height; //图片高(像素)
float aspect; //屏幕宽高比
void Start()
{
Screen.autorotateToPortrait = false;
pixelPerUnit = render.sprite.pixelsPerUnit;
width = render.sprite.rect.width;
height = render.sprite.rect.height;
aspect = (float)Screen.width / Screen.height;
Debug.Log($"width = {width} == height = {height} == aspect:{aspect} == pixelPerUnit:{pixelPerUnit}");
ChangeCameraSize();
}
private void ChangeCameraSize()
{
float widthToHeightSize = width / pixelPerUnit / aspect;
float heightSize = height / pixelPerUnit;
var size = widthToHeightSize > heightSize ? heightSize : widthToHeightSize;
Debug.Log($"widthToHeightSize = {widthToHeightSize} == heightSize = {heightSize}");
Camera.main.orthographicSize = size / 2;
}
}