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

如何让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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 20:40:29