如何通过代码将Unity Sprite缩放到小数单位并与生成的Tile对齐
问题根因
你使用的256×256 Sprite将Pixels Per Unit设为256,所以它的原生世界单位尺寸为1×1。你当前直接给Tile对象设置localScale的逻辑方向是对的,但没有结合Sprite本身的尺寸做适配,同时可能存在Game视图渲染设置的干扰,导致缩小效果不符合预期。
修复方案
方案1:调整Transform缩放(适配现有逻辑)
在GridView中预先获取Sprite的原生尺寸,再根据cell_size计算正确的缩放系数,不需要修改其他逻辑:
- 给GridView类新增原生Sprite尺寸的私有变量,在构造函数中初始化:
public class GridView { // 新增变量 private float _nativeSpriteSize; // 其余原有变量不变... public GridView(WorldGrid<float> wg, Sprite ts, GameObject parent) { world_grid = wg; tile_sprite = ts; // 新增:获取Sprite原生的世界单位宽度 _nativeSpriteSize = tile_sprite.bounds.size.x; tiles = new Tile[wg.columns, wg.rows]; wg.OnGridCellValueChanged += OnGridCellValueChanged; Create(parent); } }
- 修改SpawnTile方法中的缩放计算逻辑:
private GameObject SpawnTile(int col, int row, Color color, GameObject parent, string label) { GameObject g = new GameObject("C: " + col + " R: " + row); g.transform.position = world_grid.GetWorldPosition(col, row); // 修改缩放计算,适配Sprite原生尺寸 float scale = world_grid.cell_size / _nativeSpriteSize; g.transform.localScale = new Vector3(scale, scale, 1f); g.transform.parent = parent.transform; return g; }
方案2:直接修改SpriteRenderer尺寸(更稳妥,不影响子物体)
不需要修改Transform缩放,直接通过SpriteRenderer的属性调整Sprite大小,还能避免子物体(比如你用到的TextMesh)被连带缩放:
在Create方法中添加SpriteRenderer配置代码:
tile.sprite_renderer = tile.game_object.AddComponent<SpriteRenderer>(); tile.sprite_renderer.sprite = tile_sprite; tile.sprite_renderer.color = color; // 新增配置 tile.sprite_renderer.drawMode = SpriteDrawMode.Sliced; tile.sprite_renderer.size = new Vector2(world_grid.cell_size, world_grid.cell_size);
同时把SpawnTile中设置localScale的代码删掉或者改成固定1:
g.transform.localScale = Vector3.one;
额外检查项
如果修改后还是出现Scene视图显示正确、Game视图显示异常的情况,检查两个配置:
- 主相机如果挂载了
Pixel Perfect Camera组件,关闭组件的「Run In Edit Mode」或者直接移除组件,像素完美模式会自动对齐小尺寸Sprite的像素,导致看起来没有缩小 - Game视图顶部的缩放比例设置为
1x,高比例预览会让小尺寸元素显示异常
内容的提问来源于stack exchange,提问作者David Sargrad
相关产品推荐
相关产品推荐

