You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 06:06:05