ugui 九宫格和图片切割

本文介绍了Unity中UGUI的九宫格技术,用于处理图片拉伸时保持边角清晰,避免形变和模糊。通过设置九宫格,可以确保图片的特定部分不被拉伸,实现高质量的UI背景框。此外,还讲解了图片切割的三种模式,包括按单元格、按行或列计数切割,适用于不同的场景,如UI打包、地砖拼接和帧动画制作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

很多时候美术给的背景图很小,需要程序进行放大(但要保持边角不模糊),这时候九宫格就有用了~~~

例如下图放大10倍,如果不用九宫格图会变得很模糊(你可以试下吧transform  的scale都设为10,效果太美。。。。。)

不扯淡了,开搞

一、九宫格
九宫格的主要目的是处理图片拉伸效果,我们知道图片一旦被拉伸,它就会出现形变、模糊等问题,但是,有的图片它的某一些部分又是允许被拉伸的。例如,一个UI背景框,它的中间部分几乎是一个纯色,允许被拉伸(纯色被拉伸不会发生质量问题),但是,边缘的4个角可能有一些特殊花纹或者倒角不允许被任意拉伸,这个时候就可以使用九宫格,来使4个角不进行拉伸放大,只让中间部分进行拉伸放大,达到将一个小框拉大成一个大背景框,既节省了资源,又不会降低图片质量。
原理:

把纹理用4条线分割成9部分(如上图),通过观察可以发现,5是最规则的形状(矩形),其次是2,6,8,4(矩形,但是和四个角有公共边),最后是四个角1,3,9,7(圆角矩形)

### 反向九宫格切割的实现方法 在Unity中实现反向九宫格切割的功能可以通过自定义脚本或者扩展现有的组件来完成。以下是具体的实现方式: #### 方法一:通过修改NGUI中的UISprite实现 如果项目中已经使用了NGUI插件,可以基于其内置的九宫格切割功能进行改造。具体步骤如下: 1. **理解传统九宫格原理** NGUI 的 `UISprite` 组件支持传统的九宫格拉伸模式,允许开发者指定像的中间区域边角区域如何缩放或重复填充[^2]。 2. **创建反向逻辑** 需要在原有基础上反转逻辑,使得中心部分保持透明,而四周的部分被填充为不透明的颜色或其他纹理。这通常涉及重新计算像素偏移量以及调整UV坐标映射。 3. **代码示例** 下面是一个简单的C#脚本来展示如何定制这种行为: ```csharp using UnityEngine; public class InverseNineSlice : MonoBehaviour { public Texture mainTex; private Material material; void Start() { if (!material) material = new Material(Shader.Find("Unlit/Transparent")); UpdateMaterial(); } void OnGUI() { GUI.DrawTextureWithMaterial(new Rect(Screen.width / 2 - Screen.width * 0.5f, Screen.height / 2 - Screen.height * 0.5f, Screen.width, Screen.height), material); } void UpdateMaterial() { if (mainTex != null && material != null) { // 设置材质贴 material.mainTexture = mainTex; // 自定义 UV 坐标翻转处理 float[] uvCoords = { /* 定义新的UV数组 */ }; material.SetVector("_CustomUVs", new Vector4(uvCoords[0], uvCoords[1], uvCoords[2], uvCoords[3])); } } } ``` 此脚本假设存在一个特定着色器用于渲染带自定义UV坐标的对象,并且需要进一步完善以适应实际需求[^2]。 --- #### 方法二:利用标准UGUI系统构建 对于未集成第三方库的情况,则可以直接借助Unity UGUI框架下的Image组件配合遮罩技术达成目标效果: 1. 创建Canvas并添加Panel作为背景层; 2. 添加第二个子级GameObject放置圆形单独显示区; 3. 应用Mask组件于父容器之上形成裁剪窗口效应;最后再调节各参数直至满足视觉预期为止。 这种方法无需深入改动底层绘制机制却同样能够获得不错的结果表现力[^4]。 --- #### 注意事项 无论采用哪种途径都需要充分考虑性能开销问题特别是在移动设备端运行环境下更应谨慎对待大规模复杂形运算操作以免影响整体流畅度体验质量下降等问题发生风险增加等情况出现时需及时优化解决方案策略加以应对措施实施改进计划行动起来吧! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值