Unity中3个脚本实例化对象等比例适配全屏幕的实现方法咨询
适配方案及PPU获取说明
1. Pixels Per Unit(PPU)获取方法
- 如果你使用的是2D Sprite资源:直接读取Sprite资源的
pixelsPerUnit属性即可,代码示例:float ppu = yourSpriteAsset.pixelsPerUnit; - 如果你使用的是3D立方体在正交相机下渲染:没有默认绑定的PPU数值,你可以通过正交相机参数手动换算单位对应关系:屏幕高度对应的世界单位总数为
Camera.main.orthographicSize * 2,再结合屏幕宽高比就能得到宽度方向的单位对应关系。
2. 更优的屏幕宽度适配方案
不需要依赖PPU计算,直接根据相机类型换算当前屏幕宽度对应的世界单位总量,再分配给3个立方体即可,适配逻辑兼容任意屏幕比例:
正交相机场景(大部分2D/2.5D项目适用)
// 1. 计算当前屏幕宽度对应的世界单位总长度 float screenWorldWidth = Camera.main.orthographicSize * 2f * (float)Screen.width / Screen.height; // 2. 自定义立方体之间的总间隙(单位:世界单位,不需要间隙设为0即可) float totalGap = 0.4f; // 3. 计算单个立方体的缩放值,三轴等比缩放保证不变形 float cubeScale = (screenWorldWidth - totalGap) / 3; // 4. 赋值给实例化的立方体 foreach (var cube in spawnedCubeList) { cube.transform.localScale = new Vector3(cubeScale, cubeScale, cubeScale); } // 5. (可选)自动排列立方体位置,避免手动调整坐标 float startPosX = -screenWorldWidth / 2 + cubeScale / 2; for (int i = 0; i < spawnedCubeList.Count; i++) { float posX = startPosX + i * (cubeScale + totalGap / 2); spawnedCubeList[i].transform.position = new Vector3(posX, 0, 0); }
透视相机场景
如果使用透视相机,需要先获取立方体到相机的垂直距离,再换算对应位置的视锥体宽度:
// cubeDistance为立方体和相机之间的Z轴距离 float cubeDistance = Mathf.Abs(Camera.main.transform.position.z - spawnedCubeList[0].transform.position.z); float screenWorldWidth = 2 * Mathf.Tan(Camera.main.fieldOfView * 0.5f * Mathf.Deg2Rad) * cubeDistance * (float)Screen.width / Screen.height; // 后续缩放、位置计算逻辑和正交相机场景完全一致
UGUI场景(立方体作为UI元素渲染)
无需写代码即可实现适配:
- 给3个立方体UI元素的父节点添加
Horizontal Layout Group组件 - 勾选
Control Child Size下的Width、Height,勾选Child Force Expand下的Width - 给每个立方体UI元素添加
Aspect Ratio Fitter组件,设置Aspect Mode为Fit In Parent,Aspect值设为1即可保证立方体等比例
内容的提问来源于stack exchange,提问作者Questions100
相关产品推荐
相关产品推荐

