UGUI(七)- RawImage

RawImage 与 Image

二者都是 UGUI 的图片组件,都继承自 MaskableGraphic, RawImage 相对 Image 功能简单很多,是 Image 的乞丐版

RawImage


  • Texture 指定要显示的图片,资源类型是 Texture ,如果此项属性未指定图片资源并且 Material 未指定时,则控件以 Color 属性的颜色填充

  • Color 颜色值, 如果 Texture 和 Material 未指定时,则控件显示该属性颜色;如果 Texture 有指定值,则控件最终以指定图片和Color混合值(相乘)

  • Material 材质, Texture 未指定时,控件以 Material 显示

  • Raycast Target 是否可以被射线检测到

  • UV Rect 控件 UV 选项,用于控件图片按 UV 值显示整张图片或部分图片

补充 UV Rect

UV 是指把图片的宽高 以 0-1 开区间划分图片上的点,以便于在渲染时进行映射采样(获取图片上对应坐标的颜色值)。

上图中 X 为横向采样坐标起点, W 为横向采样宽度;Y 为竖向采样坐标起点,H 为竖向采样高度。这四个值构成一个矩形,即图片上的采样区间。默认情况下 X:0 W:1 Y:0 H:1 采样区间为整张图片, 而当 X:0.5 W:0.5 Y:0 H:0.5 时,采样区间为图片的右下四分之一。

那么问题来了,当 X:0.5 W:1 Y:0 H:1 时,横向采样起始点是 0.5, 终点是1.5 已经超出图片的横向最大值1,这时控件应该怎么显示?先来看两张图

上面第1张图横向1-1.5的部分其实是取的原图中最右侧边上的像素进行的延伸,所以看起来是一条条颜色不同的线,线的颜色与x:1处的颜色值相同。
第2张图横向1-1.5的部分是对原图中0-0.5的采样
第3张图横向1-1.5的部分是对前面部分的镜像

不同延伸模式的控制是在图片的导入模式中控制

  • Repeat 平铺重复(即对超出1的坐标对1取模后的值再进行采样)
  • Clamp 超出1的坐标取样为原图上X=1的颜色值
  • Mirror 对横向或竖向的前一部分做镜像
  • Mirror Once 仅做一次镜向,超出镜向坐标范围后采用Clamp模式
  • Pre-axis 分开指定横向或纵向的延伸模式

Repeat、Clamp、Mirror示例


Mirror Once 示例


欢迎关注公众号,定期分享Unity的实用技巧~~
在这里插入图片描述

<think>根据用户问题,需要解决如何在Unity UGUI中对RawImage进行九宫格切割。但根据引用内容,RawImage并没有直接提供九宫格切割的功能。引用[1]中提到了Image组件的九宫格切割,而引用[2]中展示的是RawImage的UV动画。因此,需要明确:RawImage本身不支持九宫格切割,因为九宫格切割通常用于Sprite(精灵),而RawImage使用的是Texture(纹理)。 但是,用户的需求是在RawImage上实现类似九宫格的效果。我们可以通过以下思路解决: 1. 使用Image组件代替,因为Image支持九宫格切割(Sliced类型)。 2. 如果必须使用RawImage(例如需要动态改变纹理),则可能需要自定义Shader或通过其他方式模拟九宫格效果。 由于引用中没有提到RawImage的九宫格切割,因此需要根据UGUI的知识来回答。 步骤: 1. 解释RawImage和Image在九宫格支持上的区别。 2. 如果用户必须使用RawImage,提供替代方案(例如自定义Shader或脚本模拟)。 注意:引用[1]中详细说明了Image的九宫格切割,而引用[2]中的RawImage示例是用于UV动画的。 因此,回答应分为两部分: - 直接方法:使用Image组件(推荐) - 间接方法:在RawImage上模拟九宫格(较复杂) 同时,根据指令,需要生成相关问题。 回答结构: 1. 问题分析:指出RawImage不支持九宫格切割,但Image支持。 2. 解决方案1:使用Image组件并设置九宫格。 3. 解决方案2:自定义方法(简要说明)。 4. 生成相关问题。 引用标识:在引用参考内容的地方添加[^1]或[^2]。</think>### Unity UGUI RawImage 九宫格切割方法 在Unity UGUI中,**RawImage组件原生不支持九宫格切割(Sliced)功能**,这与Image组件有本质区别。根据引用内容: - Image组件可通过`ImageType > Sliced`实现九宫格[^1] - RawImage主要用于显示动态纹理(如RenderTexture)或UV动画[^2],其属性面板无九宫格选项 以下是两种实现方案: --- ### 方案1:改用Image组件(推荐) 若需九宫格效果,建议直接使用**Image组件**: 1. **准备精灵图** - 导入图片 → 在Inspector窗口设置`Texture Type = Sprite (2D and UI)` - 点击`Sprite Editor` → 设置绿色九宫格边界线(定义拉伸区域) ```csharp // 示例:代码设置九宫格 Image img = GetComponent<Image>(); img.type = Image.Type.Sliced; // 关键设置 ``` 2. **组件属性配置** - `Source Image`:拖入切割后的精灵 - `Image Type`:选择 **Sliced** - `Color`:调整透明度/颜色 - `Raycast Target`:按需启用点击事件 > 此方案性能最优,直接利用UGUI内置功能[^1] --- ### 方案2:RawImage自定义实现(复杂) 若必须使用RawImage,需通过Shader模拟: 1. **创建九宫格Shader** 编写片段着色器,根据UV坐标分区采样: ```glsl fixed4 frag (v2f i) : SV_Target { // 计算九宫格区域(需预定义border尺寸) float2 border = float2(0.3, 0.3); // 边界比例 float2 uv = i.uv; // 中心区域拉伸 if(uv.x > border.x && uv.x < 1-border.x && uv.y > border.y && uv.y < 1-border.y) { uv = float2( (uv.x - border.x)/(1-2*border.x), (uv.y - border.y)/(1-2*border.y) ); } return tex2D(_MainTex, uv); } ``` 2. **应用到RawImage** - 将Shader赋给材质 → 拖入RawImage的`Material`属性 - 动态纹理通过`rawImage.texture`赋值 > 注意:此方案需手动处理边缘拉伸逻辑,且性能低于Image原生方案 --- ### 总结建议 | 组件 | 九宫格支持 | 适用场景 | |-----------|------------|-------------------------| | Image | ✅ 原生 | 静态UI、按钮、面板 | | RawImage | ❌ 需自定义 | 视频流、动态渲染纹理 | **优先选择Image组件**实现九宫格效果,这是UGUI的标准工作流[^1]。若项目强依赖RawImage(如实时视频显示),再考虑Shader方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值