1.基础适配
2.异形屏适配
1.基础适配
publicclassSmartCanvasAdapter:MonoBehaviour{[SerializeField]privateCanvasScalercanvasScaler;[SerializeField]privateVector2designResolution=newVector2(1080,2340);privatefloatlastScreenWidth;privatefloatlastScreenHeight;voidStart(){if(canvasScaler==null)canvasScaler=GetComponent<CanvasScaler>();AdaptCanvas();}voidUpdate(){// 检测屏幕尺寸变化(比如折叠屏展开)if(Screen.width!=lastScreenWidth||Screen.height!=lastScreenHeight){AdaptCanvas();lastScreenWidth=Screen.width;lastScreenHeight=Screen.height;}}voidAdaptCanvas(){floatdesignAspect=designResolution.x/designResolution.y;floatscreenAspect=(float)Screen.width/Screen.height;// 使用平滑过渡floatminAspect=designAspect*0.7f;floatmaxAspect=designAspect*1.5f;floatclampedAspect=Mathf.Clamp(screenAspect,minAspect,maxAspect);floatt=Mathf.InverseLerp(minAspect,maxAspect,clampedAspect);// 使用插值避免突变floattargetMatch=Mathf.Lerp(1f,0f,t);canvasScaler.matchWidthOrHeight=targetMatch;// 可选:触发布局重建(如果需要)StartCoroutine(RebuildLayoutNextFrame());}IEnumeratorRebuildLayoutNextFrame(){yieldreturnnull;// 等待一帧,让CanvasScaler先更新LayoutRebuilder.ForceRebuildLayoutImmediate(canvasScaler.GetComponent<RectTransform>());}}