unity5 全屏适配

上一篇讲了unity适配留黑边的问题。点击打开链接

游戏上线之后,又打算适配全屏,确实在4:3屏幕下会比较难看,X下也是,黑边比较大。

因为制作的时候没有注意适配,很多都没有事先做。着手开始适配之前,归纳了适配的几点:1.模块界面的背景,2.模块界面的中的部件,3.模块中的3D摄像机


1.模块界面的背景

    背景在我们游戏中分为3种。

    一种是模糊或者纯色的背景。我采用直接按比例放大Recttransform中的width和height。比如在16:9的开发比例下。背景image的宽是1280,高是720。那么在4:3的情况下就变成1280*960,虽然左右会有一点超出屏幕,但是是模糊或者纯色的图,美术那里还是能够接受的。

	    /// 
	    /// 开发屏幕的宽
	    /// 
	    public static float DevelopWidth = 1280f;

	    /// 
	    /// 开发屏幕的长
	    /// 
	    public static float DevelopHeigh = 720f;

	    /// 
	    /// 开发高宽比
	    /// 
	    public static float DevelopRate = DevelopHeigh /DevelopWidth;

	    /// 
	    /// 设备自身的高
	    /// 
	    public static int curScreenHeight = Screen.height;

        /// 
        /// 设备自身的高
        /// 
        public static int curScreenWidth = Screen.width;
	        float oldWidth = rectTransform.rect.width;
	        float oldHeight = rectTransform.rect.height;
            if (DevelopRate <= ScreenRate)
            {
                rectTransform.sizeDelta = new Vector2(oldWidth / cameraRectHeightRate, oldHeight / cameraRectHeightRate); 
            }
            else
            {
                rectTransform.sizeDelta = new Vector2(oldWidth / cameraRectWidthRate, oldHeight / cameraRectWidthRate); 
            }

    第二种是那种图片中图案不能放大的,比如我们游戏中的loading图,里面有人物的原画。我的做法是按照之前的图四周继续添加,比如本来是1024*512大小的图,让美术四周填满到1560*960,但是导出还是按照之前的比例(资源大小没有变)。而这种图锚点选取居中。这样在4:3(上下最高),X的比例(目前来说左右最长)的情况下,都不会穿帮。

第三种严格意义上不能说单纯的image,而是背景+一些ui的动画组合在一起的。一种不能单纯是适配一张。我采用等比放大这一套动画的root下的scale。在4:3和X的比例会有一部分超出屏幕,但是如果项目后期的话,这样是比较省时间的。

        public void FitUIScale(Transform transform)
        {
            //return;
            float scaleValue = 0;
            if (DevelopRate <= ScreenRate)
            {
                transform.localScale = new Vector3(transform.localScale.x / cameraRectHeightRate, transform.localScale.y / cameraRectHeightRate);
            }
            else
            {
                  transform.localScale = new Vector3(transform.localScale.x / cameraRectWidthRate, transform.localScale.y / cameraRectWidthRate);
            }
        }

2.模块中的部件

    部件的话指的是比如主界面左上角的玩家头像之类的。主要是设置锚点,这个没什么好说的。这里特别需要适配X的刘海,我是在有可能被刘海遮住的部件挂载脚本,让其往中间缩进一定的距离。

#if UNITY_EDITOR
	        if (ScreenFit.ScreenRate <0.47f )
	        {
	            RectTransform rectTransform = this.transform as RectTransform;
	            if (rectTransform != null)
	            {
	                float posX = 0f;
	                if (_dircetion == EarDirection.left)
	                {
	                    posX = rectTransform.anchoredPosition.x + offset;
	                }
	                else if (_dircetion == EarDirection.right)
	                {
	                    posX = rectTransform.anchoredPosition.x - offset;
	                }
	                rectTransform.anchoredPosition = new Vector2(posX, rectTransform.anchoredPosition.y);
	            }
	        }
#else
            string deviceModel = UnityEngine.SystemInfo.deviceModel;
            if(deviceModel.Contains(ScreenFit.IphoneXName1) || deviceModel.Contains(ScreenFit.IphoneXName2))
            {
                RectTransform rectTransform = this.transform as RectTransform;
	            if (rectTransform != null)
	            {
	                float posX = 0f;
	                if (_dircetion == EarDirection.left)
	                {
	                    posX = rectTransform.anchoredPosition.x + offset;
	                }
	                else if (_dircetion == EarDirection.right)
	                {
	                    posX = rectTransform.anchoredPosition.x - offset;
	                }
	                rectTransform.anchoredPosition = new Vector2(posX, rectTransform.anchoredPosition.y);
	            }
            }
#endif

3.3d摄像机的适配。

    界面中多多少少会有3d摄像机参与渲染的地方。当分辨率改变的时候,按照原来摄像机的设置,显示的界面不太对。我这里只是单纯的适配摄像机的fieldofView。

        public static void SetCameraFieldOfView(Camera camera,  float fovValue)
        {
            camera.fieldOfView = fovValue* (1+ScreenFit.ScreenRate - ScreenFit.DevelopRate);
        }

你可能感兴趣的:(Unity)