快速开始指南
将预制体添加到场景中:Assets/XDPaint/Prefabs/[XDPaintContainer].prefab。该预制体包含资源运行所需的单例组件。
Input Controller
该单例类用于管理用户输入。下面是 InputController 组件的参数说明:
Max Touches Count- 同时绘制的最大触点数量;Input Methods- 启用的输入方式:VRMode、Pen、Touch、Mouse。默认全部启用;Canvases- 需要忽略射线检测的 Canvas 列表(Canvas 的子对象会阻止绘制);Block Raycasts On Press- 当用户指向/悬停在 Canvas 项上时,是否阻止绘制;Ignore For Raycasts- 需要忽略射线检测的 GameObject(Canvas 的子对象,但不会阻止绘制);Pen Transform- 用于绘制的笔/手的 Transform(VR 设备使用);Minimal Distance To Paint- Pen 到表面的最小绘制距离(VR 绘制使用)。
Raycast Controller
该单例类负责对射线与三角形的相交进行数据检测,并存储场景中所有可用于射线检测的对象信息。下面是 RaycastController 组件的参数说明:
Use Depth Texture- 是否使用 Depth Texture 辅助射线检测。在场景中同时存在多个 PaintManager 时非常有用,因为它会在这种情况下优先绘制离射线起点最近的 PaintManager。注意:如果你使用 SRP,需要在 URP/HDRP 设置中启用 DepthTexture。
Paint Controller
该单例类用于存储所有 PaintManager。下面是 PaintController 组件的参数说明:
Override Camera- 为 InputController 与 RaycastController(单例对象)指定相机;若不勾选则使用 Camera.main;Use Shared Settings- 是否对所有 PaintManager 使用 PaintController 的设置(Brush、Paint Tool、Paint Mode)。若关闭,则每个 PaintManager 使用自己的独立设置;Paint Mode- 绘制模式:Default 或 Additive。Default 模式下,每一帧都会将绘制结果烘焙到 Layer Texture;Additive 模式下,会先把线条渲染到 Input Texture,在 Mouse Up 事件时再烘焙到 Layer Texture,从而获得更精确的颜色与 Alpha 混合;Paint Tool- 当前工具。支持的工具:Brush- 画笔工具;Erase- 擦除工具;Bucket- 油漆桶,用选定颜色填充纹理区域;Eyedropper- 吸管工具,用于拾取画笔颜色;BrushSampler- 取样画笔纹理;Clone- 克隆纹理区域;Blur- 模糊纹理区域;GaussianBlur- 模糊纹理区域;Grayscale- 将纹理区域去色(灰度化)。
Preset- 画笔预设,保存在Assets/XDPaint/Resources/XDPaintBrushPresets.asset。它存储了不同参数的画笔,便于快速切换。详情见“Brush 与 Presets”段落。
画笔参数(Brush Parameters):
Name- 画笔名称;Source Texture- 画笔纹理。添加新画笔时,请确保画笔纹理导入设置中的「Wrap Mode」为「Clamp」;Filter Mode- 画笔 RenderTexture 的 FilterMode;Color- 画笔颜色;Size- 画笔大小;Hardness- 画笔硬度;当值小于 1 时会使画笔更圆滑;Render Angle- 画笔渲染角度(度);Preview- 当用户悬停在待绘制对象上时显示画笔预览;
Paint Manager
该组件用于管理“可绘制对象”,是对物体进行绘制的核心组件。
你可以通过 Unity 菜单「GameObject -> 2D/3D Paint」创建带有 PaintManager 的 GameObject,或手动把 PaintManager 添加到你的 GameObject 上。 然后在 Object For Painting 字段中选择要绘制的对象。该对象必须包含以下支持组件之一:MeshRenderer、SkinnedMeshRenderer、SpriteRenderer 或 RawImage。 如果 PaintManager GameObject 的子对象中包含带有支持组件的对象,可以点击 Auto Fill 按钮自动将其填入 Object For Painting:
点击 Auto Fill 后,只要找到支持组件,Object For Painting 就会被自动填充:
如果无法自动找到 Material 或绘制对象,请确认子对象中确实存在带支持组件的 GameObject;否则可手动指定 Object For Painting 与 Material。
当 Object For Painting 与 Material 都有值时,会显示更多设置。以下是主要参数:
Object For Painting- 绘制对象(必须包含支持的组件之一);Material- 对象材质;其纹理字段(Shader Texture Name)将作为绘制目标;Shader Texture Name- 材质中用于绘制的纹理名称;Texture Width- 当对象没有源纹理时使用的默认纹理宽度;Texture Height- 当对象没有源纹理时使用的默认纹理高度;Texture Color- 当未指定源纹理时,新建纹理的像素默认颜色;Filter Mode- 绘制用 RenderTexture 的 FilterMode;UV Channel- UV 通道;Paint Space- 指定将笔刷纹理投射到表面时使用的坐标空间:UV:基于对象 UV 坐标投射笔刷纹理;World:基于世界坐标投射,便于在多个表面上实现连续绘制。
Projection Method- 决定投射笔刷纹理到表面时采用的方法;Projection Direction- 决定用于投射时笔刷法线的计算方式;Normal Cutout- 基于表面法线与视线方向(或绘制射线方向)的夹角进行裁剪阈值控制;在 World Paint Space 下可避免绘制到背向射线/相机的面(例如背面);Max Angle- 指定笔刷法线与片元法线之间允许的最大夹角(度);调整该值可控制笔刷在曲面上“包裹”的程度;Angle Attenuation Mode- 控制Max Angle如何影响笔刷 Alpha;Brush Depth Size- 控制沿笔刷法线方向的深度(厚度)影响范围(相对于笔刷大小);适合需要只影响一定深度范围内表面的效果;Brush Depth Fade Range- 控制沿Brush Depth定义的深度范围从全强到 0 的渐变范围;大于 0.0 时会产生平滑过渡;Edge Softness- 控制笔刷边缘柔和度,影响向外半径方向的衰减;Paint Mode- 绘制模式:default 或 additive;Paint Tool- 绘制工具;若 PaintController 启用了 Use Shared Settings,则所有 PaintManager 都会使用 PaintController 的工具;Brush- 画笔参数。选择「Custom」时表示该 PaintManager 使用独立画笔参数;也可从列表中选择现成预设。注意:若 PaintController 启用了 Use Shared Settings,则会使用 PaintController 的画笔参数;Copy Source Texture To Layer- 将材质的源纹理复制到新图层;Use Source Texture as Background Layer- 将材质的源纹理复制到背景图层;Layers Container- 指向 LayersContainer 的 ScriptableObject 引用,包含图层纹理与参数信息,用于加载之前保存的图层。Clone Material- 将对象源材质复制为新文件(仅 Unity Editor 可用);Clone Texture- 将对象源纹理复制为新文件(仅 Unity Editor 可用);Undo- 撤销;Redo- 重做;Bake- 将绘制结果烘焙回源文件。注意:纹理默认只保存在内存中,不会写入磁盘;Save Texture- 将绘制结果纹理保存到文件(仅 Unity Editor 可用);Save Layers- 将图层数据保存为 ScriptableObject。
下面演示将对象设置为在自发光纹理上绘制:
示例中选择了名为 _EmissionMap 的纹理。进入 Play 模式后,用户就可以在 LightHouse 对象上绘制。材质与源纹理 _EmissionMap 会被克隆,并将 RenderTexture 作为新的纹理分配。你可以使用鼠标、触控屏、手写笔或 VR 控制器等多种输入设备进行绘制。