如何让2D网格适配Unity正交相机?附代码问题求助
2D网格相机正交尺寸适配问题及优化建议
问题描述
生成随机尺寸的2D网格后,将相机置于网格中心,但调整Orthographic Size无法让整个网格完整显示,截图如下:

现有代码
using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Tilemaps; using UnityEngine.WSA; public class Grid2D : MonoBehaviour { [SerializeField] private int _width, _height; [SerializeField] private Tile _tilePrefap; [SerializeField] private Camera _cam; void Start() { GenerarteGrid(); SetCamera(_width,_height); } void Update() { } private void GenerarteGrid() { for (int i = 0; i < _width; i++) { for (int j = 0; j < _height; j++) { var tile = Instantiate(_tilePrefap, new Vector3(i, j, 0), Quaternion.identity); tile.transform.parent = transform; tile.name = j + " " + i; } } } private void SetCamera(int x, int y) { _cam.orthographicSize = (float)_height / 2 + 0.5f ; _cam.transform.position = new Vector3((float)x / 2 - 0.5f, (float)y / 2 - 0.5f, 0); } }
适配问题解决方案
当前代码仅基于网格高度计算正交尺寸,忽略了屏幕宽高比,导致不同比例的屏幕下网格无法完全显示。修改SetCamera方法,结合宽高比计算合适的正交尺寸:
private void SetCamera(int gridWidth, int gridHeight) { // 设置相机到网格中心,z轴设为负数避免与网格平面重合 _cam.transform.position = new Vector3((float)gridWidth / 2 - 0.5f, (float)gridHeight / 2 - 0.5f, -10f); float aspectRatio = _cam.aspect; // 计算容纳网格高度所需的正交尺寸 float heightBasedSize = (float)gridHeight / 2 + 0.5f; // 计算容纳网格宽度所需的正交尺寸(转换为垂直方向的对应值) float widthBasedSize = ((float)gridWidth / 2 + 0.5f) / aspectRatio; // 取两者最大值,确保网格完整显示在相机视野内 _cam.orthographicSize = Mathf.Max(heightBasedSize, widthBasedSize); }
编程与设计风格优化建议
- 修正命名错误:
_tilePrefap改为_tilePrefab,GenerarteGrid改为GenerateGrid,遵循驼峰命名规范。 - 移除无用引用:删除
using UnityEngine.WSA;,该命名空间未被使用,减少代码冗余。 - 添加字段注释:给序列化字段添加
[Tooltip]属性,提升可读性,例如:[Tooltip("网格横向Tile数量")] [SerializeField] private int _width; [Tooltip("网格纵向Tile数量")] [SerializeField] private int _height; - 优化实例化性能:大量生成Tile时改用对象池(Object Pool),避免频繁创建销毁对象的性能损耗。
- 替换硬编码偏移:当前的
0.5f基于Tile尺寸为1x1的假设,若Tile尺寸可变,应通过_tilePrefab的尺寸动态计算偏移值。 - 拆分功能职责:将网格生成、相机设置拆分为独立模块,让单类职责更单一,便于后续维护扩展。
内容的提问来源于stack exchange,提问作者Mocak
相关产品推荐
相关产品推荐

