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

Unity中如何正确裁切图像中心区域并执行拼图切片操作

Unity拼图游戏图片中心裁切切片异常问题

问题表现

  • 后端获取的图片用于拼图洗牌游戏时,现有裁切逻辑从图像左侧裁切到近中部位置,不符合裁切中心区域的需求
  • 尝试将预先裁切到中部的Sprite传入ImageSlicer切片,返回结果和未调整前完全一致
  • 相关效果:
    • 主图:原始主图
    • 临时裁切效果:临时裁切效果图
    • 切片结果:imageSlices切片结果图

问题原因

实现思路本身没有问题,是代码逻辑存在两处错误:

  1. Sprite.Create方法只会生成带显示区域标记的Sprite实例,不会修改底层绑定的原始Texture2D。你后续传入ImageSlicer.GetSlices的参数是temp.texture,拿到的还是完整的原始currentImage纹理,完全没有用到你给Sprite配置的裁切区域,所以切片结果不会有任何变化。
  2. 你当前写的Rect参数本身就不是中心裁切逻辑:new Rect(currentImage.width * 0.25f, 0, currentImage.width * 0.75f, currentImage.height)的含义是从x轴25%宽度位置为起点,取75%宽度的区域,实际只会裁掉左侧25%的内容,根本不是取中心区域。

修复方法

  • 不要用Sprite做裁切中转,先基于原始纹理生成独立的中心裁切后Texture2D,再传入切片方法
  • 正确计算中心裁切区域:拼图一般使用正方形素材,先取原图宽高的最小值作为裁切正方形的边长,再计算裁切起点坐标,保证裁切区域在原图正中心

参考实现代码

// 计算中心正方形裁切参数
int cropSideLength = Mathf.Min(currentImage.width, currentImage.height);
int startX = (currentImage.width - cropSideLength) / 2;
int startY = (currentImage.height - cropSideLength) / 2;

// 生成独立的裁切后纹理
Texture2D centerCroppedTex = new Texture2D(cropSideLength, cropSideLength, currentImage.format, false);
Color[] cropPixels = currentImage.GetPixels(startX, startY, cropSideLength, cropSideLength);
centerCroppedTex.SetPixels(cropPixels);
centerCroppedTex.Apply();

// 传入裁切完成的纹理做切片
Texture2D[,] imageSlices = ImageSlicer.GetSlices(centerCroppedTex, blocksPerLine);

// 如需使用裁切后的Sprite,基于新生成的裁切纹理创建即可
Sprite croppedSprite = Sprite.Create(centerCroppedTex, new Rect(0, 0, cropSideLength, cropSideLength), new Vector2(0.5f, 0.5f), 100f);

内容的提问来源于stack exchange,提问作者elBrøwn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 02:15:27