Unity中如何正确裁切图像中心区域并执行拼图切片操作
Unity拼图游戏图片中心裁切切片异常问题
问题表现
- 后端获取的图片用于拼图洗牌游戏时,现有裁切逻辑从图像左侧裁切到近中部位置,不符合裁切中心区域的需求
- 尝试将预先裁切到中部的Sprite传入ImageSlicer切片,返回结果和未调整前完全一致
- 相关效果:
- 主图:

- 临时裁切效果:

- 切片结果:

- 主图:
问题原因
实现思路本身没有问题,是代码逻辑存在两处错误:
Sprite.Create方法只会生成带显示区域标记的Sprite实例,不会修改底层绑定的原始Texture2D。你后续传入ImageSlicer.GetSlices的参数是temp.texture,拿到的还是完整的原始currentImage纹理,完全没有用到你给Sprite配置的裁切区域,所以切片结果不会有任何变化。- 你当前写的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
相关产品推荐
相关产品推荐

